用C语言编写一个贪吃蛇游戏的程序
时间: 2023-09-15 11:15:12 浏览: 135
用C语言编写的“贪吃蛇游戏源程序”.7z
以下是一个简单的贪吃蛇游戏程序,使用了C语言和标准库函数:
```c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
// 定义界面大小
#define WIDTH 30
#define HEIGHT 20
// 定义蛇的最大长度
#define MAX_LENGTH WIDTH*HEIGHT
// 定义蛇的方向
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
// 定义蛇身体和食物的标识符
#define BODY '*'
#define FOOD '$'
// 定义全局变量
int score = 0; // 得分
int direction = RIGHT; // 初始方向为向右
int length = 3; // 初始长度为3
int x[MAX_LENGTH] = {0}, y[MAX_LENGTH] = {0}; // 蛇的坐标数组
int food_x, food_y; // 食物的坐标
// 初始化游戏
void init() {
// 隐藏光标
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut, &cci);
cci.bVisible = FALSE;
SetConsoleCursorInfo(hOut, &cci);
// 初始化蛇的坐标
x[0] = WIDTH/2;
y[0] = HEIGHT/2;
for (int i = 1; i < length; i++) {
x[i] = x[i-1]-1;
y[i] = y[i-1];
}
// 随机生成食物的坐标
srand((unsigned) time(NULL));
food_x = rand()%WIDTH;
food_y = rand()%HEIGHT;
}
// 绘制界面
void draw() {
system("cls"); // 清屏
// 绘制上边界
for (int i = 0; i < WIDTH+2; i++) {
printf("#");
}
printf("\n");
// 绘制中间部分
for (int i = 0; i < HEIGHT; i++) {
printf("#");
for (int j = 0; j < WIDTH; j++) {
// 判断当前位置是否为蛇身体
int is_body = 0;
for (int k = 0; k < length; k++) {
if (x[k] == j && y[k] == i) {
printf("%c", BODY);
is_body = 1;
break;
}
}
// 判断当前位置是否为食物
if (!is_body && j == food_x && i == food_y) {
printf("%c", FOOD);
} else if (!is_body) {
printf(" ");
}
}
printf("#\n");
}
// 绘制下边界
for (int i = 0; i < WIDTH+2; i++) {
printf("#");
}
printf("\n");
// 显示得分
printf("Score: %d\n", score);
}
// 控制蛇的移动
void move() {
// 获取键盘输入
if (_kbhit()) {
char ch = _getch();
switch (ch) {
case 'w':
case 'W':
if (direction != DOWN) {
direction = UP;
}
break;
case 's':
case 'S':
if (direction != UP) {
direction = DOWN;
}
break;
case 'a':
case 'A':
if (direction != RIGHT) {
direction = LEFT;
}
break;
case 'd':
case 'D':
if (direction != LEFT) {
direction = RIGHT;
}
break;
}
}
// 更新蛇的坐标
for (int i = length-1; i > 0; i--) {
x[i] = x[i-1];
y[i] = y[i-1];
}
switch (direction) {
case UP:
y[0]--;
break;
case DOWN:
y[0]++;
break;
case LEFT:
x[0]--;
break;
case RIGHT:
x[0]++;
break;
}
// 判断是否吃到食物
if (x[0] == food_x && y[0] == food_y) {
// 随机生成新的食物坐标
food_x = rand()%WIDTH;
food_y = rand()%HEIGHT;
// 增加蛇的长度
length++;
score++;
}
// 判断是否撞墙或撞到自己
if (x[0] < 0 || x[0] >= WIDTH || y[0] < 0 || y[0] >= HEIGHT) {
printf("Game Over!\n");
exit(0);
}
for (int i = 1; i < length; i++) {
if (x[i] == x[0] && y[i] == y[0]) {
printf("Game Over!\n");
exit(0);
}
}
}
int main() {
init(); // 初始化游戏
// 主循环
while (1) {
draw(); // 绘制界面
move(); // 控制蛇的移动
Sleep(100); // 暂停100毫秒
}
return 0;
}
```
这个程序使用了Windows API中的一些函数,如`GetStdHandle`、`CONSOLE_CURSOR_INFO`和`SetConsoleCursorInfo`等,用于隐藏光标。`_kbhit`和`_getch`函数用于读取键盘输入,`Sleep`函数用于暂停程序一定的时间。
阅读全文