ISO 11标准.
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;
const int width = 40;
const int height = 20;
int x, y, fruitX, fruitY, score;
int tailX[100], tailY[100];
int nTail;
enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN};
eDirection dir;
bool gameOver;
HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
void gotoxy(int x, int y) {
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(console, pos);
}
void Setup()
{
dir = STOP;
gameOver = false;
fruitX = rand() % width;
fruitY = rand() % height;
x = width / 2;
y = height / 2;
score = 0;
}
void Draw()
{
gotoxy(0, 0);
for (int i = 0; i < width; i++)
cout << "#";
cout << endl;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
if (j == 0 || j == width - 1) cout << "#";
else if (j == x && i == y) cout << "O";
else if (j == fruitX && i == fruitY) cout << "F";
else
{
bool flag = false;
for (int k = 0; k < nTail; k++)
{
if (j == tailX[k] && i == tailY[k])
{
cout << "o";
flag = true;
}
}
if (!flag) cout << " ";
}
}
cout << endl;
}
gotoxy(0, height + 1);
for (int i = 0; i < width; i++)
cout << "#";
cout << endl << endl << "score:" << score;
}
void Input()
{
if (_kbhit())
{
switch(_getch())
{
case 'w' : dir = UP;break;
case 's' : dir = DOWN;break;
case 'a' : dir = LEFT;break;
case 'd' : dir = RIGHT;break;
case 'e' : gameOver = true;
}
}
}
void Logic()
{
int prevX = tailX[0];
int prevY = tailY[0];
int prev2X, prev2Y;
tailX[0] = x;
tailY[0] = y;
for (int i = 1; i < nTail; i++)
{
prev2X = tailX[i];
prev2Y = tailY[i];
tailX[i] = prevX;
tailY[i] = prevY;
prevX = prev2X;
prevY = prev2Y;
}
switch (dir)
{
case UP : y--;break;
case DOWN : y++;break;
case LEFT : x--;break;
case RIGHT : x++;break;
default : break;
}
if (x < 0) x = width - 1;else if (x >= width) x = 0;
if (y < 0) y = height- 1;else if (y >= height) y = 0;
for (int i = 0; i < nTail; i++)
if (tailX[i] == x&& tailY[i] == y)
gameOver = true;
if (x == fruitX && y == fruitY)
{
score += 10;
fruitX = rand() % width;
fruitY = rand() % height;
nTail++;
}
}
int main()
{
Setup();
while(!gameOver)
{
Draw();
Input();
Logic();
// Sleep(100);
}
return 0;
}
你可以修改Sleep的值调整游戏的运行速度。
这段代码是负责更新蛇的尾部位置的部分,具体解释如下:
1. `int prevX = tailX[0];` 和 `int prevY = tailY[0];`:这两行代码用于保存蛇尾部的第一个节的位置,即尾部的初始位置。
2. `tailX[0] = x;` 和 `tailY[0] = y;`:这两行代码将蛇尾的第一个节移动到蛇头的当前位置,即使得蛇的整体移动向前。
3. `for (int i = 1; i < nTail; i++) {`:这个循环从蛇的第二个节开始,遍历到最后一个节(nTail - 1)。
4. `prev2X = tailX[i];` 和 `prev2Y = tailY[i];`:这两行代码保存当前蛇节的位置,以备下一步使用。
5. `tailX[i] = prevX;` 和 `tailY[i] = prevY;`:这两行代码将当前蛇节的位置设置为前一个蛇节的位置,即实现了蛇身的一节节往前移动。
6. `prevX = prev2X;` 和 `prevY = prev2Y;`:这两行代码更新 prevX 和 prevY 的值为当前蛇节的位置,为下一次循环迭代做准备。
通过这段代码,蛇的每一节都根据前一节的位置进行更新,从而实现了蛇身整体的移动。