C语言吃豆人小游戏源代码配注释
时间: 2023-07-09 11:15:41 浏览: 545
以下是一个简单的 C 语言实现的“吃豆人”游戏的源代码,注释在代码中:
```c
#include <stdio.h>
#include <conio.h> // conio.h 库提供了一些控制台输入输出的函数,比如 getch() 函数
#include <stdlib.h>
#include <time.h>
#define ROW 10 // 定义行数
#define COL 20 // 定义列数
// 定义地图上的不同元素
#define BLANK ' ' // 空地
#define WALL '#' // 墙壁
#define DOT '.' // 豆子
#define PACMAN 'O' // 吃豆人
#define GHOST 'X' // 幽灵
// 定义吃豆人的方向
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
// 定义吃豆人和幽灵的初始位置
#define PACMAN_ROW 1
#define PACMAN_COL 1
#define GHOST_ROW 5
#define GHOST_COL 10
// 定义全局变量
int score = 0; // 得分
int pacman_row = PACMAN_ROW, pacman_col = PACMAN_COL; // 记录吃豆人的位置
int ghost_row = GHOST_ROW, ghost_col = GHOST_COL; // 记录幽灵的位置
char map[ROW][COL]; // 地图
// 初始化地图
void init_map()
{
int i, j;
// 随机放豆子
srand(time(NULL)); // srand() 函数需要传入一个种子值,通常使用 time() 函数的返回值作为种子值,以确保每次运行程序时都会产生不同的随机数序列
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (i == 0 || i == ROW - 1 || j == 0 || j == COL - 1) // 地图边缘放墙壁
{
map[i][j] = WALL;
}
else if (rand() % 4 == 0) // 25% 的概率放豆子
{
map[i][j] = DOT;
}
else
{
map[i][j] = BLANK;
}
}
}
// 放置吃豆人和幽灵
map[pacman_row][pacman_col] = PACMAN;
map[ghost_row][ghost_col] = GHOST;
}
// 显示地图
void show_map()
{
int i, j;
system("cls"); // 清空控制台屏幕
printf("得分:%d\n", score);
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
printf("%c", map[i][j]);
}
printf("\n");
}
}
// 移动吃豆人
void move_pacman(int direction)
{
switch (direction)
{
case UP:
if (map[pacman_row - 1][pacman_col] != WALL) // 判断上方是否是墙壁
{
pacman_row--;
}
break;
case DOWN:
if (map[pacman_row + 1][pacman_col] != WALL) // 判断下方是否是墙壁
{
pacman_row++;
}
break;
case LEFT:
if (map[pacman_row][pacman_col - 1] != WALL) // 判断左方是否是墙壁
{
pacman_col--;
}
break;
case RIGHT:
if (map[pacman_row][pacman_col + 1] != WALL) // 判断右方是否是墙壁
{
pacman_col++;
}
break;
}
if (map[pacman_row][pacman_col] == DOT) // 吃到豆子
{
score++;
map[pacman_row][pacman_col] = BLANK;
}
map[pacman_row][pacman_col] = PACMAN; // 更新地图上的吃豆人位置
}
// 移动幽灵
void move_ghost()
{
int direction;
// 随机选择幽灵的移动方向
direction = rand() % 4 + 1;
switch (direction)
{
case UP:
if (map[ghost_row - 1][ghost_col] != WALL) // 判断上方是否是墙壁
{
ghost_row--;
}
break;
case DOWN:
if (map[ghost_row + 1][ghost_col] != WALL) // 判断下方是否是墙壁
{
ghost_row++;
}
break;
case LEFT:
if (map[ghost_row][ghost_col - 1] != WALL) // 判断左方是否是墙壁
{
ghost_col--;
}
break;
case RIGHT:
if (map[ghost_row][ghost_col + 1] != WALL) // 判断右方是否是墙壁
{
ghost_col++;
}
break;
}
map[ghost_row][ghost_col] = GHOST; // 更新地图上的幽灵位置
}
// 判断游戏是否结束
int is_game_over()
{
if (pacman_row == ghost_row && pacman_col == ghost_col) // 吃豆人和幽灵相遇,游戏结束
{
return 1;
}
int i, j;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (map[i][j] == DOT) // 还有豆子未吃完,游戏继续
{
return 0;
}
}
}
return 1; // 豆子已经被吃完,游戏结束
}
int main()
{
int direction;
init_map();
while (1)
{
show_map();
if (kbhit()) // 判断是否有键盘输入
{
direction = getch(); // 获取键盘输入
switch (direction)
{
case 'w':
case 'W':
case 72: // 上箭头
move_pacman(UP);
break;
case 's':
case 'S':
case 80: // 下箭头
move_pacman(DOWN);
break;
case 'a':
case 'A':
case 75: // 左箭头
move_pacman(LEFT);
break;
case 'd':
case 'D':
case 77: // 右箭头
move_pacman(RIGHT);
break;
}
}
move_ghost();
if (is_game_over())
{
show_map();
printf("游戏结束!得分:%d\n", score);
break;
}
Sleep(100); // 休眠 100 毫秒,以控制游戏速度
}
return 0;
}
```
这是一个简单的控制台程序,它实现了一个简单的“吃豆人”游戏。玩家需要使用方向键控制吃豆人的移动,吃掉地图上的豆子,同时还要避开幽灵。游戏得分会随着吃掉的豆子数量增加而增加。当吃豆人和幽灵相遇,或者所有豆子都被吃掉时,游戏结束,显示得分。
阅读全文