Programación en lenguaje C para el juego Snake
#include lt;windows.hgt;
#include lt;ctimegt;
#include lt;iostreamgt;
#include lt;vectorgt;
#include lt;queuegt;
usando el espacio de nombres std;
#ifndef SNAKE_H
#define SNAKE_H p> p>
clase Cmp
{
clase amiga Csnake;
int rSign; //abscisa
int lSign; ; //Coordenada vertical
public:
// amigo bool isDead(const Cmpamp; cmp);
Cmp(int r, int l){setPoint ( r, l);}
Cmp(){}
void setPoint(int r, int l){rSign=r; lSign=l;}
Cmp operador-(const Cmp amp; m)const
{
return Cmp(rSign-m.rSign, lSign-m.lSign);
}
Operador Cmp (const Cmp amp; m)const
{
return Cmp(rSign m.rSign, lSign m.lSign); p >
}
};
const int maxSize = 5; //Longitud inicial de la serpiente
clase Csnake
{
Cmp firstSign; //Coordenadas de la cabeza de la serpiente
Cmp secondSign; //Coordenadas del cuello de la serpiente
Cmp lastSign; p> Cmp nextSign; //Preparar cabeza de serpiente
int row; //Número de columnas
int line; //Número de filas
int count; // Longitud del cuerpo de la serpiente
vectorlt; chargt; gt; SnakeMap; // Toda la interfaz del juego
queuelt;
público:
p>
int GetDirections()const;
char getSymbol(const Cmpamp; c)const
//Obtener el carácter en el punto de coordenadas especificado
{
return SnakeMap[c.lSign][c.rSign];
}
Csnake (int n)
// Inicializa el tamaño de la interfaz del juego
{
if(nlt;20)line=20 2;
else if(ngt;30)line=30 2;
else line=n 2;
fila=line*3
} p>
bool está muerto(const Cmpamp; cmp)<
/p>
{
return ( getSymbol(cmp)=='@' || cmp.rSign == fila-1
|| cmp.rSign== 0 || cmp.lSign == línea-1 ||
cmp.lSign == 0 );
}
void InitInstance(); Interfaz del juego
bool UpdataGame(); //Actualizar la interfaz del juego
void ShowGame(); //Mostrar la interfaz del juego
};
#endif // SNAKE_H
usando el espacio de nombres std;
//Prueba exitosa
void Csnake::InitInstance()
{
snakeMap.resize(line); // SnakeMap[coordenada vertical][abscisa]
for(int i=0; ilt; line; i)
{
mapa de serpientes[i].resize(fila);
for(int j=0; jlt; fila; j)
{
mapa de serpientes[i][j]=" ';
}
}
for(int m=1;mlt; maxSize 1; m )
{
//Cuerpo de serpiente inicial
snakeMap[line/2][m]='@';
//Empuja las coordenadas del cuerpo de la serpiente a la cola
snakeBody.push(Cmp(m, (line/2)));
//snakeBody[abscissa][ Coordenadas verticales]
}
//Cabeza y cola de la lista enlazada
firstSign=snakeBody.back();
segundoSign .setPoint(maxSize- 1, línea/2);
}
//Prueba exitosa
int Csnake::GetDirections()const
{
if(GetKeyState(VK_UP)lt; 0) return 1; //1 significa presionar la tecla arriba
if(GetKeyState(VK_DOWN)lt; 0) return 2; //2 Indica que el botón hacia abajo está presionado
if(GetKeyState(VK_LEFT)lt; 0) return 3 //3 indica que está presionado el botón izquierdo
if (GetKeyState(VK_RIGHT)lt; 0) return 4; //4 significa presionar el botón derecho
return 0;
}
bool Csnake::UpdataGame ()
{
//------------------------------- ---------- ------
//Puntuación de inicialización 0
static int score=0;
// Obtener información clave del usuario
int Choice;
choice=GetDirections();
coutlt;lt;"Puntuación total: "lt;lt;scorelt;lt
;endl;
//Generar aleatoriamente las coordenadas de la ubicación del alimento
int r, l;
//Después de comer inicialmente, se genera un alimento
static bool eatFood=true;
//Si comes uno, el segundo alimento aparecerá nuevamente
if(eatFood)
{
hacer
{
//El rango de coordenadas está limitado a (1, 1) a (línea-2, fila-2) rectángulo de puntos
srand(tiempo(0));
r=(rand()(fila-2)) 1; //abscisa
l=(rand ( )(line-2)) 1; //Coordenadas verticales
//Si las coordenadas generadas aleatoriamente no son el cuerpo de la serpiente, es factible
//De lo contrario, las coordenadas serán regenerado
if(snakeMap[l][r]!='@')
{snakeMap[l][r]='*';}
}mientras (snakeMap[l][r]=='@');
}
cambiar (elección)
{
caso 1 ://Arriba
//Si las abscisas de la cabeza de la serpiente y el cuello son diferentes, realiza las siguientes operaciones
if(firstSign.rSign!= secondSign. rSign)nextSign.setPoint(firstSign .rSign, firstSign.lSign-1);
//De lo contrario, continúe moviéndose en la dirección original de la siguiente manera
else nextSign=firstSign (firstSign -segundoSigno);
descanso;
caso 2: //abajo
if(firstSign.rSign!=segundoSign.rSign)nextSign.setPoint(firstSign. rSign, firstSign.lSign 1);
else nextSign=firstSign (firstSign-segundoSign);
break
caso 3: //izquierda
if(firstSign .lSign!=segundoSign.lSign)nextSign.setPoint(firstSign.rSign-1, firstSign.lSign);
else nextSign=firstSign (firstSign-segundoSign);
romper;
caso 4: //A la derecha
if(firstSign.lSign!=segundoSign.lSign)nextSign.setPoint(firstSign.rSign 1, firstSign. lSign);
else nextSign=firstSign (firstSign-segundoSign);
romper;
predeterminado:
nextSign=firstSign (firstSign -segundoSigno);
}
//----------------------------- ---------------- ---------------------
si(
getSymbol(nextSign)!='*' amp; !isDead(nextSign))
//Si no se encuentra comida (y no se produce la muerte), elimina la cola de la serpiente e introduce una nueva serpiente. head
{
//Eliminar cola de serpiente
lastSign=snakeBody.front();
snakeMap[lastSign.lSign][ lastSign. rSign]=' ';
snakeBody.pop();
//Actualizar cabeza de serpiente
segundoSign=firstSign;
// Empuja la cabeza de serpiente
snakeBody.push(nextSign);
firstSign=snakeBody.back();
snakeMap[firstSign.lSign][ firstSign.rSign] ='@';
//No hay comida
eatFood=false;
return true;
}
//-----Comer-----
else if(getSymbol(nextSign)=='*' amp;amp; !isDead(nextSign)) p>
{
segundoSign=firstSign;
snakeMap[nextSign.lSign][nextSign.rSign]='@';
//Presione sólo la cabeza de serpiente
snakeBody.push(nextSign);
firstSign=snakeBody.back();
eatFood=true;
//Puntos extra
puntuación =20;
devuelve verdadero
}
//-----Muerte- ----
else {coutlt;lt;"Muerto"lt;lt;endl;coutlt;lt;"Tu última puntuación total es "lt;lt;scorelt;lt;endl; }
}
void Csnake::ShowGame()
{
for(int i=0; ilt; line; i )
{
for(int j=0;jlt;row;j)
coutlt;lt;sakeMap[i][j]; p>
coutlt;lt;endl;
}
Sueño(1);
sistema("cls");
} p>
int main()
{
Csnake s(20);
s.InitInstance(); p>
//s.ShowGame();
int noDead;
hacer
{
s.ShowGame( );
noDead=s.UpdataGame();
}mientras (noDead);
sistema("pausa");
return 0;
}
Esto
Si el código se puede ejecutar, recuerda dar puntos