(不完善,只是實現了基本的操作以及分數的統計)
方法:用一個二維數組保存蛇的座標,之後依次輸出蛇。
蛇的位置每次只移動一下,蛇頭座標改變,則第一個蛇身座標等於蛇頭,依次下去,第二個蛇身等於第一個蛇身 ,··· 。
蛇每次移動的過程中之前的蛇尾用空格來擦除。
以下是代碼:代碼寫得醜,求輕噴!
#include<iostream>
#include<Windows.h>
#include<conio.h>
#include<time.h>
using namespace std;
using std::cout;
typedef enum { UP = 1, DOWN, RIGHT, LEFT } Direct;
Direct Dir = LEFT; //蛇初始方向
int boundX = 40;int boundY = 20; // 界面大小
int Score = 0; //分數
short ScoX = 42;short ScoY = 10; //分數輸出位置
short FoodX, FoodY;
bool Alive = true;bool NoFood = true;
int LastX;int LastY; //記錄要擦除的蛇座標
int len = 3; //蛇初始長度
int Snake[200][2];
void Goto_xy(short X, short Y);
void HideCursor();
void paint();
bool logic();
void Getkey();
void GameOver();
void PrintScore();
void init();
void Paint_Map() //畫邊框
{
for (int y = 0, x = 0; y < boundY; y++) {
for (x = 0; x < boundX; x++) {
if (y == 0 || y == boundY - 1)
cout << "=";
else if (x == 0 || x == boundX - 1)
cout << "#";
else cout << " ";
}
cout << endl;
}
return;
}
void Goto_xy(short X,short Y) //移動光標位置
{
HANDLE hOut;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = { X,Y};
SetConsoleCursorPosition(hOut, pos);
}
void HideCursor() //隱藏光標
{
CONSOLE_CURSOR_INFO cursor_info = { 1,0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
bool logic() //遊戲大體邏輯
{
Sleep(150);
LastX = Snake[len-2][0]; //更新數組中的蛇各個位置座標
LastY = Snake[len - 2][1];
for (int i = len -2; i >0; --i) {
Snake[i][0] = Snake[i - 1][0];
Snake[i][1] = Snake[i - 1][1];
}
Snake[0][0] = Snake[len - 1][0];
Snake[0][1] = Snake[len - 1][1];
switch (Dir) { //由蛇的方向來改變蛇頭的座標
case UP:
Snake[len-1][1]--;
break;
case DOWN:
Snake[len-1][1]++;
break;
case RIGHT:
Snake[len-1][0]++;
break;
case LEFT:
Snake[len-1][0]--;
break;
}
for (int i = 0; i < len - 1; ++i) { //判斷蛇頭是否撞到自己
if (Snake[len - 1][0] == Snake[i][0] && Snake[len - 1][1] == Snake[i][1]) {
Alive = false;
break;
}
}
if (Snake[len - 1][0] == FoodX && Snake[len - 1][1] == FoodY) { //蛇頭座標等於食物座標
++len;
Snake[len - 1][0] = FoodX;
Snake[len - 1][1] = FoodY;
Score += 10;
NoFood = true;
}
if (NoFood) { //如果喫到食物,更新座標
int tmpX = Snake[len - 2][0];
int tmpY = Snake[len - 2][1];
for (int i = len - 2; i > 0; --i) {
Snake[i][0] = Snake[i - 1][0];
Snake[i][1] = Snake[i - 1][1];
}
Snake[0][0] = tmpX;
Snake[0][1] = tmpY;
}
if (Snake[len - 1][0] < 1 || Snake[len - 1][0] > boundX - 2 || Snake[len - 1][1] < 1 || Snake[len - 1][1]> boundY - 2) //判斷蛇撞牆
Alive = false;
return Alive;
}
void paint()
{
Goto_xy(42, 2);
cout << "W上,A左,S下,D右"; //輸出操作方法
Goto_xy(ScoX,ScoY);
cout << "您的分數是:" << Score; //輸出分數
Goto_xy(LastX, LastY);
cout << " "; //用空格擦除蛇尾
for (int i = 0; i < len; ++i) { //遍歷數組將蛇打印出來
Goto_xy(Snake[i][0], Snake[i][1]);
if (i == len - 1)
switch (Dir) {
case UP: cout << "W"; break;
case DOWN: cout << "S"; break;
case RIGHT: cout << "D"; break;
case LEFT: cout << "A"; break;
}
else
cout << "o";
}
if (NoFood) { //如果食物被喫,則輸出新的事物
srand((unsigned int)time(NULL));
FoodX = rand() % 38 + 1;
FoodY = rand() % 18 + 1;
Goto_xy(FoodX, FoodY);
cout << "*";
NoFood = false;
}
return;
}
void GameOver() //遊戲結束
{
system("cls");
for (int i = 0; i < 5;++i)
cout << endl;
for (int i = 0; i < 29; ++i)
cout << " ";
cout << "Gameover and press any key to quit";
while (1)
if (_kbhit())
break;
return;
}
void Getkey()
{
char key;
if (_kbhit()){ //獲得鍵盤消息更改蛇位置
key = _getch();
switch (key) {
case 'w':
Dir = UP;
break;
case 'a':
Dir = LEFT;
break;
case 's':
Dir = DOWN;
break;
case 'd':
Dir = RIGHT;
break;
}
}
}
void init()
{
len = 3;
Snake[0][0] = 19;
Snake[0][1] = 9;
Snake[1][0] = 20;
Snake[1][1] = 9;
Snake[2][0] = 18;
Snake[2][1] = 9;
}
int main()
{
init();
HideCursor();
Paint_Map();
while(Alive){
paint();
Getkey();
Alive = logic();
}
GameOver();
return 0;
}