#pragma region Includes
#include <windows.h>
#include <string>
#include <conio.h>
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <dos.h>
using namespace std;
#define Izquierda 97
#define Derecha 100
#define Arriba 119
#define Abajo 115
void Color(int foreground, int background);
void gotoxy( short x, short y );
void cls();
void Lineas(int Estilo,int xA,int yA,int hA,int wA);
void DibujarPuntos (int p);
void MoverSerpiente(); void PintarSerpiente();
void DibujarMapa();
void BorrarZona(); void BorrarCola();
void PintarZona();
void GameOver(); void AlargarSerpiente();
void MoverComida(); void Comer(int n); void DibujarComida();
#pragma endregion
#pragma region Variables
int Tecla;
int Puntos = 0;
char* IconoFondo = " ";
int IconoSerpiente = 184; //184, 219
int IconoComida = 15; //3, 15
int SerpienteX = 30; int SerpienteY = 10;
int FinalSerpienteX = 28; int FinalSerpienteY = 10;
int sFinalSerpienteX; int sFinalSerpienteY;
int Largura=2; string DireccionSerpiente = "De"; string DireccionFinalSerpiente = "De"; string DireccionsFinalSerpiente;
int Zona [76][18];
int MaxX = 77; int MinX = 2;
int MaxY = 22; int MinY = 5;
int Velocidad = 100;
int c1x; int c1y; bool c1v = true;
int c2x; int c2y; bool c2v = true; bool DibujarC = true;
int c3x; int c3y; bool c3v = true;
#pragma endregion
int main(){
system("title Snake - Blackm4ster 2012");
BorrarZona();
cout << "Pulsa una tecla para Jugar" << endl;
getch();
cls();
DibujarMapa();
Color(10,0);
gotoxy (SerpienteX, SerpienteY);
printf("%c", IconoSerpiente); //Dibuja la Serpiente por 1º vez
MoverComida();
Color(15,0);
do{
if (DibujarC == true){
DibujarComida();
DibujarC = false;
}
BorrarCola();
MoverSerpiente();
PintarSerpiente(); //PintarZona();
DibujarPuntos(Puntos);
Sleep(Velocidad);
/*
gotoxy (2, 22); cout << SerpienteY;
gotoxy (2, 21); cout << SerpienteX;
gotoxy (7, 21); cout << FinalSerpienteX;
gotoxy (7, 22); cout << FinalSerpienteY;
gotoxy (13, 21); cout << DireccionSerpiente;
gotoxy (13, 22); cout << DireccionFinalSerpiente;
gotoxy (18, 20); cout << c1x << " - " << c1y;
gotoxy (18, 21); cout << c2x << " - " << c2y;
gotoxy (18, 22); cout << c3x << " - " << c3y;
*/
}while(1);
return 0;
}
void MoverSerpiente(){
// CABEZA ----------------------------------------------
if(kbhit()){
Tecla = getch();
switch(Tecla){
case Izquierda:
//Movimiento
if(DireccionSerpiente == "De"){
GameOver();
return;
}
Zona[SerpienteX - MinX +1][SerpienteY - MinY +1] = 4;
DireccionSerpiente = "Iz";
break;
case Derecha:
//Movimiento
if(DireccionSerpiente == "Iz"){
GameOver();
return;
}
Zona[SerpienteX - MinX +1][SerpienteY - MinY +1] = 2;
DireccionSerpiente = "De";
break;
case Arriba:
//Movimiento
if(DireccionSerpiente == "Ab"){
GameOver();
return;
}
Zona[SerpienteX - MinX +1][SerpienteY - MinY +1] = 1;
DireccionSerpiente = "Ar";
break;
case Abajo:
//Movimiento
if(DireccionSerpiente == "Ar"){
GameOver();
return;
}
Zona[SerpienteX - MinX +1][SerpienteY - MinY +1] = 3;
DireccionSerpiente = "Ab";
break;
} //End Case
Beep(900,5);
} //End If Tecla
// ------------------ MOVIMIENTO ----------------------
if (DireccionSerpiente == "Ar"){
SerpienteY = SerpienteY - 1;
}
if (DireccionSerpiente == "Iz"){
SerpienteX = SerpienteX - 1;
}
if (DireccionSerpiente == "Ab"){
SerpienteY = SerpienteY + 1;
}
if (DireccionSerpiente == "De"){
SerpienteX = SerpienteX + 1;
}
// -------------------- COMIDA ------------------------
if(SerpienteX == c1x + MinX && SerpienteY == c1y + MinY && c1v == true){
Comer(1);
}
if(SerpienteX == c2x + MinX && SerpienteY == c2y + MinY && c2v == true){
Comer(2);
}
if(SerpienteX == c3x + MinX && SerpienteY == c3y + MinY && c3v == true){
Comer(3);
}
// -------------------- CHOQUES -----------------------
//Paredes
if (SerpienteX < MinX || SerpienteY < MinY || SerpienteX > MaxX || SerpienteY > MaxY){
GameOver();
return;
}
//Simulación Cabeza vs Cuerpo.
sFinalSerpienteX = FinalSerpienteX; sFinalSerpienteY = FinalSerpienteY; DireccionsFinalSerpiente = DireccionFinalSerpiente;
for (int i=1; i!=Largura; i++){
//Comparación si coinciden
if (SerpienteX == sFinalSerpienteX && SerpienteY == sFinalSerpienteY){
GameOver();
return;
}
switch(Zona[sFinalSerpienteX - MinX +1][sFinalSerpienteY - MinY +1]){
case 1:
DireccionsFinalSerpiente = "Ar";
break;
case 2:
DireccionsFinalSerpiente = "De";
break;
case 3:
DireccionsFinalSerpiente = "Ab";
break;
case 4:
DireccionsFinalSerpiente = "Iz";
break;
default:
DireccionsFinalSerpiente = DireccionsFinalSerpiente;
break;
}
if (DireccionsFinalSerpiente == "Ar"){
sFinalSerpienteY = sFinalSerpienteY - 1;
}
if (DireccionsFinalSerpiente == "Iz"){
sFinalSerpienteX = sFinalSerpienteX - 1;
}
if (DireccionsFinalSerpiente == "Ab"){
sFinalSerpienteY = sFinalSerpienteY + 1;
}
if (DireccionsFinalSerpiente == "De"){
sFinalSerpienteX = sFinalSerpienteX + 1;
}
}
// COLA ----------------------------------------------
//Leer giros en la Matriz
switch(Zona[FinalSerpienteX - MinX +1][FinalSerpienteY - MinY +1]){
case 1:
DireccionFinalSerpiente = "Ar";
Zona[FinalSerpienteX - MinX +1][FinalSerpienteY - MinY +1] = 0;
break;
case 2:
DireccionFinalSerpiente = "De";
Zona[FinalSerpienteX - MinX +1][FinalSerpienteY - MinY +1] = 0;
break;
case 3:
DireccionFinalSerpiente = "Ab";
Zona[FinalSerpienteX - MinX +1][FinalSerpienteY - MinY +1] = 0;
break;
case 4:
DireccionFinalSerpiente = "Iz";
Zona[FinalSerpienteX - MinX +1][FinalSerpienteY - MinY +1] = 0;
break;
default:
DireccionFinalSerpiente = DireccionFinalSerpiente;
Zona[FinalSerpienteX - MinX +1][FinalSerpienteY - MinY +1] = 0;
break;
}
if (DireccionFinalSerpiente == "Ar"){
FinalSerpienteY = FinalSerpienteY - 1;
}
if (DireccionFinalSerpiente == "Iz"){
FinalSerpienteX = FinalSerpienteX - 1;
}
if (DireccionFinalSerpiente == "Ab"){
FinalSerpienteY = FinalSerpienteY + 1;
}
if (DireccionFinalSerpiente == "De"){
FinalSerpienteX = FinalSerpienteX + 1;
}
}
void PintarSerpiente(){
Color(10,0);
gotoxy(SerpienteX, SerpienteY); printf("%c", IconoSerpiente);
Color(15,0);
}
void Comer(int n){
switch (n){
case 1:
Puntos = Puntos + 10;
c1v = false;
break;
case 2:
Puntos = Puntos + 10;
c2v = false;
break;
case 3:
Puntos = Puntos + 10;
c3v = false;
break;
}
Beep(800,5);
AlargarSerpiente();
if (c1v == false && c2v == false && c3v == false){
MoverComida();
DibujarC = true;
}
}
void DibujarComida(){
Color(13,0);
gotoxy(c1x + MinX, c1y + MinY); printf("%c", IconoComida);
gotoxy(c2x + MinX, c2y + MinY); printf("%c", IconoComida);
gotoxy(c3x + MinX, c3y + MinY); printf("%c", IconoComida);
Color(15,0);
}
void MoverComida(){
c1x = (rand() % 76); c1y = (rand() % 18);
c2x = (rand() % 76); c2y = (rand() % 18);
c3x = (rand() % 76); c3y = (rand() % 18);
c1v = true; c2v = true; c3v = true;
}
void AlargarSerpiente(){
Largura = Largura + 1;
Velocidad = Velocidad - 2;
if (DireccionFinalSerpiente == "Ar"){
FinalSerpienteY = FinalSerpienteY + 1;
}
if (DireccionFinalSerpiente == "Iz"){
FinalSerpienteX = FinalSerpienteX + 1;
}
if (DireccionFinalSerpiente == "Ab"){
FinalSerpienteY = FinalSerpienteY - 1;
}
if (DireccionFinalSerpiente == "De"){
FinalSerpienteX = FinalSerpienteX - 1;
}
}
void GameOver(){
cls();
cout << "- Game Ov3r -" << endl;
cout << "Puntos: " << Puntos << endl;
cout << "> Pulsa Enter para Salir <" << endl;
do{Tecla = getch();}while(Tecla != 13);
exit(1);
}
void BorrarCola() {
//Borrar Cola Vieja
if (FinalSerpienteX == c1x && FinalSerpienteY == c1y && c1v == true){}else{
gotoxy(FinalSerpienteX,FinalSerpienteY); puts(IconoFondo);}
if (FinalSerpienteX == c2x && FinalSerpienteY == c2y && c2v == true){}else{
gotoxy(FinalSerpienteX,FinalSerpienteY); puts(IconoFondo);}
if (FinalSerpienteX == c3x && FinalSerpienteY == c3y && c3v == true){}else{
gotoxy(FinalSerpienteX,FinalSerpienteY); puts(IconoFondo);}
/*
gotoxy(SerpienteX,SerpienteY);
puts(IconoFondo);
*/
}
void PintarZona(){
for (int x=1; x<77;x++){
for (int y=1; y<19; y++){
gotoxy(1+x,4+y);
switch(Zona[x][y]){
case 0:
cout << " ";
break;
case 1:
cout << "1";
break;
case 2:
cout << "2";
break;
case 3:
cout << "3";
break;
case 4:
cout << "4";
break;
default:
cout << "?";
break;
}
}
}
}
void DibujarPuntos(int p){
gotoxy(54,2); cout << "PUNTOS: ";
Color(12,0); printf("%d", p);
Color(15,0);
}
void BorrarZona(){
for (int x=1; x<77;x++){
for (int y=1; y<19; y++){
Zona[x][y] = 0;
}}
}
void DibujarMapa(){
Color(15, 0);
Lineas(1,2,2,1,48);
Color(7, 0);
Lineas(2,53,2,1,25);
Color(15, 0);
Lineas(1,2,5,18,76);
//Mensaje Isc
Color(14, 0);
gotoxy(16,2); cout << "Snake - Black M4ster";
Color(15, 0);
}