• 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 条评论

目前还没有评论...