0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过C语言设计的贪吃蛇游戏(控制台终端)

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2023-06-30 09:53 次阅读

一、项目介绍

当前通过控制台终端实现一个贪吃蛇小游戏,实现游戏的绘制、更新、控制等功能。

二、实现效果

image-20230618211315514

image-20230618211408842

三、完整代码

下面贴出的代码在Windows系统上编译运行,需要使用conio.h头文件中的getch()函数来获取键盘输入,用于控制蛇的移动。可以通过按下'w'、's'、'a'、'd'四个键来分别控制蛇的向上、向下、向左、向右移动。同时还有一个暂停函数Pause(),用于控制蛇的移动速度,可以根据需要调整暂停时间。

设计思路:

程序定义了一些常量,包括游戏界面的宽度和高度、不同状态下的符号表示等,并在全局变量中定义了蛇头、蛇身、食物等的位置、得分、长度、行进方向等参数。同时还定义了一个二维字符数组board,用于表示整个游戏界面。

在InitGame()函数中进行游戏初始化,设置游戏界面的边框、蛇头、蛇身、随机生成食物等操作。

DrawGame()函数用于绘制游戏画面,将board数组中的字符逐行输出,并在末尾输出得分。UpdateGame()函数用于更新游戏状态,包括蛇的移动、游戏结束判断等。CheckGameOver()函数用于检查游戏是否结束,包括墙壁碰撞、蛇身碰撞、得分达到上限等情况。GenerateFood()函数用于随机生成食物位置,调用rand()函数获取随机数并进行判断。Move()函数用于蛇的移动,根据当前行进方向进行移动。Control()函数用于用户操作,读取键盘输入并更新蛇的行进方向。Pause()函数用于控制游戏速度,通过调用Sleep()函数控制暂停时间。GameOver()函数用于输出最终得分和游戏结束信息,并直接退出程序。

image-20230618211229060

#include < stdio.h >
 #include < stdlib.h >
 #include < conio.h >  //需要使用getch()函数
 #include < time.h >   //需要使用time()函数
 #include < Windows.h >
 ​
 ​
 #define WIDTH 40    //游戏界面宽度
 #define HEIGHT 20   //游戏界面高度//定义符号常量,表示各种不同的状态
 #define BLANK ' '   //空白
 #define WALL '*'    //墙壁
 #define SNAKEHEAD '@'  //蛇头
 #define SNAKEBODY 'o'  //蛇身
 #define FOOD '$'    //食物//定义坐标结构体
 struct Position
 {
     int x;    //横坐标
     int y;    //纵坐标
 };
 ​
 //定义枚举类型,表示游戏状态
 enum GameState
 {
     Over = -1,   //游戏结束
     Running = 0, //游戏进行中
     Win = 1      //游戏胜利
 };
 ​
 int score = 0;   //得分
 struct Position head;   //蛇头位置
 struct Position body[WIDTH * HEIGHT];  //蛇身位置
 struct Position food;   //食物位置
 char board[WIDTH][HEIGHT];   //游戏界面
 int length = 3;     //蛇身长度,初始为3
 int direction = 0;  //蛇的行进方向,0表示向右,1表示向下,2表示向左,3表示向上//函数声明
 void InitGame();    //初始化游戏界面和蛇的初始位置
 void DrawGame();    //绘制游戏画面
 void UpdateGame();  //更新游戏状态
 enum GameState CheckGameOver();  //检查游戏是否结束
 void GenerateFood();   //生成随机食物
 void Move();     //蛇的移动
 void Control();  //用户操作,控制蛇的移动
 void Pause();    //游戏暂停
 void GameOver(); //游戏结束int main()
 {
     srand(time(NULL));   //用当前时间作为随机数种子,使每次运行的随机食物位置不同
     InitGame();   //初始化游戏
     DrawGame();   //绘制游戏画面
     while (1)
     {
         UpdateGame();  //更新游戏
         DrawGame();    //绘制游戏画面
         Control();     //用户操作,控制蛇的移动
         Pause();       //游戏暂停     
     }
     return 0;
 }
 ​
 //初始化游戏界面和蛇的初始位置
 void InitGame()
 {
     for (int i = 0; i < WIDTH; i++)
     {
         for (int j = 0; j < HEIGHT; j++)
         {
             if (i == 0 || j == 0 || i == WIDTH - 1 || j == HEIGHT - 1) //设置墙壁
                 board[i][j] = WALL;
             else
                 board[i][j] = BLANK;    //其他为空白
         }
     }
 ​
     //初始化蛇的位置,由一个蛇头和两节身体组成,初始位置在游戏界面的中心
     head.x = WIDTH / 2;
     head.y = HEIGHT / 2;
     board[head.x][head.y] = SNAKEHEAD;
 ​
     body[0].x = head.x - 1;
     body[0].y = head.y;
     board[body[0].x][body[0].y] = SNAKEBODY;
 ​
     body[1].x = head.x - 2;
     body[1].y = head.y;
     board[body[1].x][body[1].y] = SNAKEBODY;
 ​
     GenerateFood();   //生成随机食物
 }
 ​
 //绘制游戏画面
 void DrawGame()
 {
     system("cls");   //清屏,避免前一帧的内容残留for (int i = 0; i < HEIGHT; i++)
     {
         for (int j = 0; j < WIDTH; j++)
         {
             printf("%c", board[j][i]);  //输出一个字符
         }
         printf("\\n");    //每行输出完后,换行
     }
 ​
     printf("Score: %d\\n", score);   //输出得分
 }
 ​
 //更新游戏状态
 void UpdateGame()
 {
     Move();   //蛇的移动
     enum GameState state = CheckGameOver();  //检查游戏是否结束
     if (state != Running)  //如果游戏结束,则进行相应操作
     {
         GameOver();
     }
 }
 ​
 //检查游戏是否结束
 enum GameState CheckGameOver()
 {
     //蛇头碰到墙壁,游戏结束
     if (board[head.x][head.y] == WALL)
         return Over;
 ​
     //蛇头碰到蛇身,游戏结束
     for (int i = 0; i < length; i++)
     {
         if (head.x == body[i].x && head.y == body[i].y)
             return Over;
     }
 ​
     //吃到食物后,更新分数和蛇的长度,并生成新的食物
     if (head.x == food.x && head.y == food.y)
     {
         score += 10;
         length++;
         GenerateFood();
     }
 ​
     //蛇的长度达到游戏界面总格子数减去墙壁的个数,也就是蛇填满游戏界面,游戏胜利
     if (length == (WIDTH - 2) * (HEIGHT - 2) - 4)
         return Win;
 ​
     return Running;   //游戏继续进行
 }
 ​
 //生成随机食物
 void GenerateFood()
 {
     int x, y;
     do
     {
         x = rand() % (WIDTH - 2) + 1;    //随机x坐标,排除在边框上的墙壁位置
         y = rand() % (HEIGHT - 2) + 1;   //随机y坐标,排除在边框上的墙壁位置
     } while (board[x][y] != BLANK);   //如果随机到的位置不为空白,则重新随机
     food.x = x;
     food.y = y;
     board[x][y] = FOOD;  //在随机位置生成食物
 }
 ​
 //蛇的移动
 void Move()
 {
     //更新蛇身的位置,从后往前移动
     for (int i = length - 1; i > 0; i--)
     {
         body[i].x = body[i - 1].x;
         body[i].y = body[i - 1].y;
         board[body[i].x][body[i].y] = SNAKEBODY;
     }
 ​
     //更新蛇头的位置
     switch (direction)   //根据蛇头行进方向进行移动
     {
     case 0:  //向右
         head.x++;
         break;
     case 1:  //向下
         head.y++;
         break;
     case 2:  //向左
         head.x--;
         break;
     case 3:  //向上
         head.y--;
         break;
     }
     board[head.x][head.y] = SNAKEHEAD;   //更新蛇头位置
     board[body[length - 1].x][body[length - 1].y] = BLANK;  //清除蛇尾
 }
 ​
 //用户操作,控制蛇的移动
 void Control()
 {
     if (kbhit())   //如果有按键按下
     {
         char ch = getch();   //获取按键字符
         switch (ch)
         {
         case 'w':
             if (direction != 1)  //避免蛇头掉头
                 direction = 3;
             break;
         case 's':
             if (direction != 3)
                 direction = 1;
             break;
         case 'a':
             if (direction != 0)
                 direction = 2;
             break;
         case 'd':
             if (direction != 2)
                 direction = 0;
             break;
         case 'q':
             GameOver();  //按下'q'键退出游戏
             break;
         }
     }
 }
 ​
 //游戏暂停
 void Pause()
 {
     Sleep(150);   //每次循环暂停一段时间,控制蛇的移动速度
 }
 ​
 //游戏结束
 void GameOver()
 {
     system("cls");   //清屏,输出最终得分和游戏结束信息
     printf("Game over!\\n");
     printf("Your score: %d\\n", score);
     exit(0);  //直接退出程序
 }

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128723
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66771
收藏 人收藏

    评论

    相关推荐

    贪吃蛇游戏

    编的简单的贪吃蛇游戏
    发表于 05-05 16:40

    如何c语言控制贪吃蛇走向(单片机 16*16点阵)

    我想做一个贪吃蛇的小游戏,用4个8*8的点阵拼成,如何用c语言写一个控制贪吃蛇的走向的程序,先写
    发表于 06-09 01:03

    [热]基于FPGA的贪吃蛇游戏

    本帖最后由 eehome 于 2013-1-5 09:59 编辑 基于FPGA的贪吃蛇游戏,大家有兴趣的下载来看看~~
    发表于 08-20 09:49

    FPGA VGA 贪吃蛇游戏

    FPGAVGA贪吃蛇游戏 资料
    发表于 04-22 20:08

    贪吃蛇游戏

    贪吃蛇游戏的下载
    发表于 03-04 18:24

    基于51单片机c语言贪吃蛇游戏

    基于51单片机的C语言贪吃蛇游戏仿真
    发表于 11-25 21:05

    贪吃蛇游戏的电路实现

    最近论坛好冷清,在此发一贴暖暖身,回到正题,大家都玩过“贪吃蛇游戏,用代码实现该游戏想必难不倒大神,在网上也有一大堆针对该游戏的代码实现,如果摆脱代码,用硬件来实现“
    发表于 11-19 17:52

    【教学基地】制作贪吃蛇游戏(底层支持部分)

    [tr=transparent]【教学基地006】制作贪吃蛇游戏(底层支持部分)大家尾部提供源文件下载,键盘上下左右控制移动,本节要点:1.贪吃蛇
    发表于 05-16 13:11

    贪吃蛇游戏

    Labview制作贪吃蛇游戏,值得学习研究
    发表于 09-07 21:39

    C语言写个贪吃蛇游戏

    C语言写个贪吃蛇游戏 贪吃蛇是个非常经典的游戏,用C
    发表于 04-10 10:44

    基于51单片机的贪吃蛇游戏设计 精选资料分享

    的理解,编写程序实现对贪吃蛇的有效控制;(2)通过对51单片机硬件的学习,学会运用面包板,独立按键、点阵屏等,完成对完整电路的搭建过程;(3)通过对Proteus仿真软件的学习,实现基
    发表于 07-16 06:48

    基于51单片机的贪吃蛇游戏 精选资料分享

    1.简介本设计为一款贪吃蛇游戏,显示器采用8*8点阵,主控制器采用51单片机,并通过按键实现对游戏的操作。2.
    发表于 07-21 06:21

    【FPGA DEMO】Lab 9:贪吃蛇游戏

    基于Perf-V开发板,实现贪吃蛇游戏的设计。实验中用开发板上key1-key4按键来控制小蛇的移动,VGA设计该游戏的界面。基本步骤如上所示,可前往RVBoards文档中心下载教程
    发表于 07-30 15:53

    利用LED矩阵、 键盘编写一个简单的贪吃蛇游戏

    ** 贪吃蛇**By草木灰### 一、实验内容1、利用LED矩阵、 键盘编写一个简单的贪吃蛇游戏2、通过编写贪吃蛇
    发表于 12-15 09:20

    基于stm32的贪吃蛇游戏的设计资料分享

    目录前言一、主要功能二、主要模块1.贪吃蛇链表2.ADC3.定时器中断三、实际显示效果前言自学完电阻触摸屏之后做的小项目。我采用了C语言链表的方式来形成贪吃蛇。利用相关封装好的函数,将
    发表于 02-21 07:27