- C++
【20250602】字符贪吃蛇程序
- 2025-6-2 16:18:13 @
【20250524】信奥游戏课堂 “字符贪吃蛇”
一、课堂目标
- 让学生巩固对 C++ 中循环、条件语句、数组等知识的运用。
- 提升学生对游戏开发逻辑的理解和编程思维能力。
- 激发学生对编程的兴趣和创造力。
二、课堂流程
(一)游戏规则讲解
- 详细讲解字符贪吃蛇的游戏规则:
- 游戏在一个矩形区域内进行,用字符(如 ‘#’ 或其他符号)表示蛇的身体和食物。
- 蛇可以向上、向下、向左、向右四个方向移动,通过键盘输入相应的方向键来控制蛇的移动方向。
- 食物会随机出现在游戏区域内,当蛇的头部移动到食物所在位置时,蛇的身体会变长一段,同时得分增加。
- 如果蛇的头部撞到墙壁或者自己的身体,则游戏结束。
(二)代码实现讲解
-
初始化游戏区域和蛇、食物的初始位置:
- 使用二维数组来表示游戏区域,数组的元素可以是字符类型,初始时大部分元素为空格,表示空白区域。
- 在数组的某个位置用特定的字符(如 ‘O’)表示蛇的头部,用其他字符(如 ‘*’)表示蛇的身体其他部分。
- 随机生成食物的位置,确保食物不会出现在蛇的身体上。
-
实现蛇的移动逻辑:
- 通过键盘事件监听,获取用户输入的方向键。
- 根据当前方向,更新蛇的头部位置。
- 判断蛇是否撞墙或撞到自己,如果是,则设置游戏结束标志。
- 如果蛇吃到食物,则增加蛇的长度(在蛇尾部添加新的身体部分),并更新得分,同时重新生成食物的位置。
- 如果没有吃到食物,则蛇的尾部需要相应地移动,以保持蛇的长度不变。
-
游戏画面的更新和绘制:
- 每次蛇移动后,重新遍历二维数组,将蛇和食物的字符显示在相应位置,然后输出整个数组,形成新的游戏画面。
- 使用系统函数(如 system("cls"))来清屏,实现画面的刷新效果。
-
游戏的主循环:
- 设置一个循环结构,在游戏结束标志为假时不断执行蛇的移动、碰撞检测、画面更新等操作。
- 控制游戏的运行速度,可以通过设置适当的延时来实现。
以下是一个简单的字符贪吃蛇游戏的 C++ 代码:
#include <iostream>
#include <conio.h>
#include <Windows.h>
#include <cstdlib>
#include <ctime>
using namespace std;
const int width = 20; // 游戏区域宽度
const int height = 20; // 游戏区域高度
int snakeX, snakeY; // 蛇的坐标
int foodX, foodY; // 食物坐标
int score; // 得分
int tailX[100], tailY[100]; // 存储蛇尾部的坐标
int nTail; // 尾巴数量
enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN }; // 方向枚举
eDirection dir;
void Setup() {
// 初始化游戏
snakeX = width / 2;
snakeY = height / 2;
do {
foodX = rand() % width;
foodY = rand() % height;
} while (foodX == snakeX && foodY == snakeY); // 确保食物不生成在蛇头位置
score = 0;
dir = RIGHT;
nTail = 0;
cout<<"初始化完成!!!\n";
}
void Draw() {
// 绘制游戏区域
system("cls");
for (int i = 0; i < width + 2; i++)
cout << "#";
cout << endl;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (j == 0)
cout << "#";
if (i == snakeY && j == snakeX)
cout << "O"; // 蛇头
else if (i == foodY && j == foodX)
cout << "X"; // 食物
else {
bool print = false;
for (int k = 0; k < nTail; k++) {
if (tailX[k] == j && tailY[k] == i) {
cout << "#"; // 蛇身
print = true;
}
}
if (!print)
cout << " ";
}
if (j == width - 1)
cout << "#";
}
cout << endl;
}
for (int i = 0; i < width + 2; i++)
cout << "#";
cout << endl;
cout << "Score:" << score << endl;
cout<<"绘制游戏区域\n";
}
void Input() {
// 处理键盘输入
if (_kbhit()) {
switch (_getch()) {
case 'a':
if (dir != RIGHT) // 防止直接反向
dir = LEFT;
break;
case 'd':
if (dir != LEFT)
dir = RIGHT;
break;
case 'w':
if (dir != DOWN)
dir = UP;
break;
case 's':
if (dir != UP)
dir = DOWN;
break;
case 'x':
exit(0); // 按x退出游戏
break;
case 'p': // 暂停游戏
while (_getch() != 'p'); // 等待再次按下 p 键继续游戏
break;
}
}
}
void Logic() {
// 处理游戏逻辑
if (nTail > 0) {
int prevX = tailX[0];
int prevY = tailY[0];
int prev2X, prev2Y;
tailX[0] = snakeX;
tailY[0] = snakeY;
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 LEFT:
snakeX--;
break;
case RIGHT:
snakeX++;
break;
case UP:
snakeY--;
break;
case DOWN:
snakeY++;
break;
default:
break;
}
// 检测碰撞
if (snakeX >= width || snakeX < 0 || snakeY >= height || snakeY < 0)
dir = STOP; // 撞墙
if (nTail > 0) {
for (int i = 0; i < nTail; i++) {
if (tailX[i] == snakeX && tailY[i] == snakeY)
dir = STOP; // 撞到自己
}
}
// 检测是否吃到食物
if (snakeX == foodX && snakeY == foodY) {
score += 10;
do {
foodX = rand() % width;
foodY = rand() % height;
} while (foodX == snakeX && foodY == snakeY);
nTail++;
}
}
int main() {
srand(time(0)); // 初始化随机种子
char choice;
do {
Setup();
while (dir != STOP) {
Draw();
Input();
Logic();
Sleep(100); // 控制游戏速度
}
cout << "Game Over! Your score: " << score << endl;
cout << "Play again? (y/n): ";
cin >> choice;
} while (choice == 'y' || choice == 'Y');
return 0;
}
这份代码实现了字符贪吃蛇游戏的基本功能,包括:
- 使用
#
绘制游戏边界,O
表示蛇头,X
表示食物,#
表示蛇身。 - 可以用
a
(左)、d
(右)、w
(上)、s
(下)控制蛇的移动方向,按x
退出游戏。 - 当蛇吃到食物后,长度会增加,得分会提高。
- 如果蛇撞到墙壁或自己的身体,游戏结束。
你可以根据需要对代码进行修改和优化,例如调整游戏速度、增加难度级别、美化界面等。如果在运行代码时遇到问题,可以检查开发环境的设置是否正确,或者联系我获取进一步的帮助。
0 条评论
目前还没有评论...