¿Cómo escribir Snake en C++?
#include
#include
usando el espacio de nombres std
#ifndef SNAKE_H
#define SNAKE_H
clase Cmp
{
clase amiga Csnake
int rSign; //abscisa
int lSign; //coordenada vertical
public:
// amigo bool isDead(const Cmp& cmp); l){setPoint(r,l);}
Cmp(){}
void setPoint(int r,int l){rSign=r;lSign=l;}
Operador Cmp-(const Cmp &m)const
{
return Cmp(rSign-m.rSign,lSign-m.lSign
);}
Cmp operador+(const Cmp &m)const
{
return Cmp(rSign+m.rSign,lSign+m.lSign) ;
}
};
const int maxSize = 5; //Longitud inicial del cuerpo de la serpiente
clase Csnake
{
Cmp firstSign; //Coordenadas de la cabeza de la serpiente
Cmp secondSign;//Coordenadas del cuello de la serpiente
Cmp lastSign; //Coordenadas de la cola de la serpiente
p >Cmp nextSign; //Prepara la cabeza de serpiente
int row; //Número de columnas
int line; //Número de filas
int count; / /Longitud del cuerpo de la serpiente
vector
queue
public :
int GetDirections()const;
char getSymbol(const Cmp& c)const
//Obtiene el carácter en la coordenada especificada punto
{
return SnakeMap[c.lSign][c.rSign]
}
Csnake(int n)
//Inicializa el tamaño de la interfaz del juego
{
if(n<20)line=22
else if(; n>30)línea=30 +2;
else línea=n+2
fila=línea*3+2
}
bool isDead( const Cmp& cmp)
{
return ( getSymbol(cmp)=='@' || cmp.rSign == fila-1
|| cmp .rSign== 0 || cmp.lSign == línea-1 ||
>
cmp.lSign == 0 );
}
void InitInstance(); //Inicializa la interfaz del juego
bool UpdataGame(); //Actualizar interfaz del juego
void ShowGame(); //Mostrar interfaz del juego
}
#endif // SNAKE_H
serpiente .cpp
#include
#include
#include
#include " Snake.h"
usando el espacio de nombres std
//Prueba exitosa
void Csnake::InitInstance()
{ < / p>
snakeMap.resize(line); // SnakeMap[coordenada vertical][abscisa]
for(int i=0;i { snakeMap[i].resize(row); for(int j=0;j { snakeMap[i][j]=' '; } } for(int m=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][coordenada vertical] } //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)<0) return 1; //1 significa presionar la tecla arriba if(GetKeyState(VK_DOWN)<0) return 2; significa presionar la tecla hacia abajo Key if(GetKeyState(VK_LEFT)<0) return 3; //3 significa presionar el botón izquierdo if(GetKeyState(VK_RIGHT)<0)return 4; //4 Indica 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 elección; p> choice=GetDirections(); cout<<"Puntuación total: "< //Generamos aleatoriamente las coordenadas de la ubicación de la comida int r,l; //Después de comer inicialmente, se genera una comida static bool eatFood= true; //Si comes uno, el segundo alimento aparecerá nuevamente if(eatFood) { do { //El rango de coordenadas está limitado a (1, 1) a (línea-2, fila-2) rectángulo de puntos srand(time( 0)); r=(rand()%(fila-2))+1; //abscisa l=(rand()%(línea-2) ) +1;//Coordenadas verticales //Si las coordenadas generadas aleatoriamente no son el cuerpo de la serpiente, es factible //De lo contrario, las coordenadas se regenerarán if( SnakeMap[l][r]!='@') {snakeMap[l][r]='*';} } while (snakeMap[ l][r ]=='@'); } cambiar (elección) { caso 1:/ /arriba p> //Si las abscisas de la cabeza de la serpiente y el cuello son diferentes, realice 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- secondSign romper; romper; else nextSign=firstSign+(firstSign-segundoSign); /down if(firstSign.rSign!=segundoSign.rSign)nextSign.setPoint(firstSign.rSign,firstSign.lSign+1 else nextSign=firstSign+(firstSign-segundoSign); romper; caso 3://left if(firstSign.lSign!=segundoSign .lSign)nextSign.setPoint(firstSign.rSign-); 1,firstSign.lSign); else nextSign=firstSign+(firstSign-segundoSign); romper caso 4://derecho if(firstSign.lSign!=segundoSign.lSign)nextSign.setPoint(firstSign.rSign+1,firstSign.lSign); else nextSign =firstSign+(firstSign-segundoSign); romper; predeterminado: nextSign=firstSign+(firstSign-segundoSign } //---); -------------------------------------- ------------ ------ if(getSymbol(nextSign)!='*' && !isDead(nextSign)) / /si no Cuando encuentre comida (y no ocurra la muerte), elimine la cola de serpiente e inserte una nueva cabeza de serpiente { //Elimine la cola de serpiente lastSign= cuerpo de serpiente.frente(); snakeMap[lastSign.lSign][lastSign.rSign]=' '; snakeBody.pop(); Actualizar cabeza de serpiente segundoSign=firstSign //Empujar la cabeza de serpiente snakeBody.push(nextSign firstSign); =snakeBody.back( ); snakeMap[firstSign.lSign][firstSign.rSign]='@'; //Sin comida eatFood= falso; devuelve verdadero; } //-----Come comida----- si no (getSymbol(nextSign)= ='*' && !isDead(nextSign)) { segundoSign=firstSign snakeMap[nextSign.lSign][ nextSign.rSign]=' @'; //Empuja solo la cabeza de serpiente snakeBody.push(nextSign); firstSign=snakeBody.back( eatFood=true; //Puntuaciones extra =20 devuelve verdadero; p>} //-----Muerte----- else {cout<<"Muerto"< } void Csnake::ShowGame() { for(int i=0; i { for(int j=0;j cout< cout< } Sueño(1); "cls"); p> } #include #include "snake.h" #include usando el espacio de nombres std; int main() { Csnake s(20) s.InitInstance( ); //s.ShowGame(); int noDead; > { s.ShowGame(); noDead=s.UpdataGame() }mientras (noDead sistema("pausa"); p > devuelve 0; }