用c语言写一个用定时器的控制台版本的贪吃蛇小游戏
时间: 2024-03-01 13:50:09 浏览: 100
c语言小游戏之贪吃蛇游戏的双人对战版源码
好的,以下是一个简单的用定时器的控制台版本的贪吃蛇小游戏的c语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#define WIDTH 30
#define HEIGHT 20
int snake[WIDTH * HEIGHT][2]; // 存储蛇身的数组
int food[2]; // 存储食物位置的数组
int len = 3; // 蛇身长度
int dir = 1; // 蛇移动的方向,1表示向右,2表示向下,3表示向左,4表示向上
void init(); // 初始化函数
void draw(); // 绘制函数
void update(); // 更新函数
void reset(); // 重置函数
void setFood(); // 设置食物函数
void gameOver(); // 游戏结束函数
int main()
{
init(); // 初始化游戏
while (1) {
draw(); // 绘制游戏界面
update(); // 更新游戏状态
if (kbhit()) { // 检测是否有键盘输入
char c = getch();
switch (c) {
case 'w':
if (dir != 2) dir = 4; // 防止蛇往相反方向移动
break;
case 's':
if (dir != 4) dir = 2;
break;
case 'a':
if (dir != 1) dir = 3;
break;
case 'd':
if (dir != 3) dir = 1;
break;
case 'q':
exit(0); // 按下q键退出游戏
}
}
Sleep(100); // 控制游戏速度
}
return 0;
}
void init()
{
reset(); // 初始化蛇身和食物位置
setFood();
}
void draw()
{
system("cls"); // 清屏
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
if (i == food[1] && j == food[0]) { // 绘制食物
printf("o");
} else {
int flag = 0;
for (int k = 0; k < len; k++) { // 绘制蛇身
if (snake[k][0] == j && snake[k][1] == i) {
printf("*");
flag = 1;
break;
}
}
if (!flag) printf(" ");
}
}
printf("\n");
}
}
void update()
{
int newHead[2];
switch (dir) { // 计算新的蛇头位置
case 1: // 向右移动
newHead[0] = snake[0][0] + 1;
newHead[1] = snake[0][1];
break;
case 2: // 向下移动
newHead[0] = snake[0][0];
newHead[1] = snake[0][1] + 1;
break;
case 3: // 向左移动
newHead[0] = snake[0][0] - 1;
newHead[1] = snake[0][1];
break;
case 4: // 向上移动
newHead[0] = snake[0][0];
newHead[1] = snake[0][1] - 1;
break;
}
if (newHead[0] == food[0] && newHead[1] == food[1]) { // 如果吃到了食物
len++; // 蛇身长度加1
setFood(); // 重新设置食物位置
}
for (int i = len - 1; i > 0; i--) { // 更新蛇身位置
snake[i][0] = snake[i - 1][0];
snake[i][1] = snake[i - 1][1];
}
snake[0][0] = newHead[0];
snake[0][1] = newHead[1];
if (snake[0][0] < 0 || snake[0][0] >= WIDTH || snake[0][1] < 0 || snake[0][1] >= HEIGHT) { // 判断是否撞墙
gameOver();
}
for (int i = 1; i < len; i++) { // 判断是否撞到自己
if (snake[i][0] == snake[0][0] && snake[i][1] == snake[0][1]) {
gameOver();
}
}
}
void reset()
{
len = 3;
for (int i = 0; i < len; i++) { // 初始化蛇身位置
snake[i][0] = WIDTH / 2 - i;
snake[i][1] = HEIGHT / 2;
}
}
void setFood()
{
srand(time(NULL)); // 生成随机数种子
int x, y;
while (1) { // 随机生成食物位置,不能和蛇身重合
x = rand() % WIDTH;
y = rand() % HEIGHT;
int flag = 0;
for (int i = 0; i < len; i++) {
if (snake[i][0] == x && snake[i][1] == y) {
flag = 1;
break;
}
}
if (!flag) break;
}
food[0] = x;
food[1] = y;
}
void gameOver()
{
system("cls");
printf("Game Over!\n");
exit(0);
}
```
希望能够帮到你,如果有不理解的地方,欢迎继续提问。
阅读全文