Red de conocimiento informático - Material del sitio web - ¿Cómo escribir Snake en C++?

¿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 > SnakeMap;//Interfaz completa del juego

queue SnakeBody; //Cuerpo de la serpiente

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

//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;

}