Dev-C++实现的贪吃蛇(Windows平台)

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 的值为当前蛇节的位置,为下一次循环迭代做准备。

通过这段代码,蛇的每一节都根据前一节的位置进行更新,从而实现了蛇身整体的移动。

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用Dev-C++编写的贪吃蛇代码,仅供参考: ```c #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> #include <time.h> #define MAX_X 20 #define MAX_Y 20 int foodX, foodY; int snakeX[100], snakeY[100]; int snakeLen = 4; int dir = 0; // 0-上,1-右,2-下,3-左 int score = 0; // 初始化蛇和食物位置 void init() { snakeX[0] = 5; snakeY[0] = 5; snakeX[1] = 5; snakeY[1] = 6; snakeX[2] = 5; snakeY[2] = 7; snakeX[3] = 5; snakeY[3] = 8; snakeLen = 4; dir = 0; srand((unsigned)time(NULL)); foodX = rand() % MAX_X + 1; foodY = rand() % MAX_Y + 1; score = 0; } // 显示游戏界面 void show() { system("cls"); for (int i = 0; i <= MAX_X + 1; i++) { printf("#"); } printf("\n"); for (int i = 1; i <= MAX_Y; i++) { printf("#"); for (int j = 1; j <= MAX_X; j++) { if (i == foodY && j == foodX) { printf("F"); } else { int flag = 0; for (int k = 0; k < snakeLen; k++) { if (i == snakeY[k] && j == snakeX[k]) { printf("O"); flag = 1; break; } } if (flag == 0) { printf(" "); } } } printf("#\n"); } for (int i = 0; i <= MAX_X + 1; i++) { printf("#"); } printf("\n"); printf("Score: %d\n", score); } // 移动蛇 void move() { int tailX = snakeX[snakeLen - 1]; int tailY = snakeY[snakeLen - 1]; for (int i = snakeLen - 1; i > 0; i--) { snakeX[i] = snakeX[i - 1]; snakeY[i] = snakeY[i - 1]; } if (dir == 0) { snakeY[0]--; } else if (dir == 1) { snakeX[0]++; } else if (dir == 2) { snakeY[0]++; } else if (dir == 3) { snakeX[0]--; } if (snakeX[0] == foodX && snakeY[0] == foodY) { snakeX[snakeLen] = tailX; snakeY[snakeLen] = tailY; snakeLen++; score++; foodX = rand() % MAX_X + 1; foodY = rand() % MAX_Y + 1; } } // 判断游戏是否结束 int isGameOver() { if (snakeX[0] <= 0 || snakeX[0] > MAX_X || snakeY[0] <= 0 || snakeY[0] > MAX_Y) { return 1; } for (int i = 1; i < snakeLen; i++) { if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) { return 1; } } return 0; } int main() { init(); while (1) { show(); move(); if (isGameOver()) { printf("Game Over!\n"); break; } Sleep(200); if (_kbhit()) { int ch = _getch(); if (ch == 'w' || ch == 'W') { if (dir != 2) { dir = 0; } } else if (ch == 'd' || ch == 'D') { if (dir != 3) { dir = 1; } } else if (ch == 's' || ch == 'S') { if (dir != 0) { dir = 2; } } else if (ch == 'a' || ch == 'A') { if (dir != 1) { dir = 3; } } } } return 0; } ``` 该程序使用了Windows API函数`Sleep()`和`_kbhit()`,需要在`<windows.h>`头文件中声明。`Sleep()`函数可以让程序暂停一段时间,这里用于控制蛇的移动速度;`_kbhit()`函数用于检测键盘是否有输入,如果有则获取键盘输入并修改蛇的移动方向。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值