你还在觉得c语言编程很无聊吗?

我们来用c语言编写一个简单的小游戏  贪吃蛇 ,想必大家都玩过吧!
下面完全是个人知道和了解的相关知识,希望不足的地方有大神可以指出,一起讨论学习!
本人也是初次用c语言做这样的小游戏,这个贪吃蛇是比较简单的,主要用链表完成的
我在看到原版代码的时候也是好多地方不明白,我当时不明白的地方都做了注释,下面的代码是本人自己参考源代码自己写的,经过调试可以正常运行!
为了你看完代码懒得看下面的内容,我把带码里我认为新鲜的东西写在前面:
首先是游戏界面显示时必须的光标定位,代码中为COORD,这是定义在<windows.h>中的一个结构体,其源代码为
typedef struct _COORD
{SHORT X;  //horizontal coordinate水平坐标SHORT Y; //vertical coordinate 垂直坐标
}COORD;

下面我们引用一段代码:

void Pos(int x, int y) // 光标定位
{COORD pos;HANDLE hOutput;pos.X = x;pos.Y = y;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOutput, pos);
}
这是一段运用windows api相关知识的代码,所谓API全称是Application Programming Interface,应用程序编程接口,其实就是一些已经写好的子程序,说白了就是操作系统为程序员提供的一组函数库,程序员可以通过调用api简单的实现一些操作系统提供的已经写好了的功能。我们来说一下我们的代码其中,HANDLE hOutput是声明了一个句柄对象,对于句柄的概念和功能大家自行google.hOutput = GetStdHandle(STD_OUTPUT_HANDLE); 这句的意思是用句柄对象接收一个标准输出设备句柄。标准输出句柄的参数SetConsoleCursorPosition(hOutput, pos); 这句的意思是在标准输出设备hOutput上定位坐标pos然后大家就可以结合下面的代码进一步了解它们在代码中的具体作用啦!第二个本人认为新鲜的东西就是kbhit()
函数名:kbhit()
功 能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
用 法:int kbhit(void);
包含头文件: include <conio.h>

贪吃蛇源码

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include<conio.h>
#include <time.h>
#include <string.h>#define Key_Right 'd'//按键向右
#define Key_Left 'a'//按键向组左
#define Key_Up 'w'//按键向上
#define Key_Down 's'//按键向下
#define Key_Space ' '//暂停键 空格//标记状态量
#define R 1
#define L 2
#define W 3
#define D 4typedef struct node
{int x;int y;struct node *next;
}Snake;//蛇身结构体//必要的全局变量
Snake *head; //蛇头
Snake *p; //遍历蛇身
int score=0; //记录分数
int food_x, food_y; //食物位置坐标
int Status = R; //初始状态量
int key; //接收字符
int endgamestatus = 0; //判断游戏是否结束的状态量
//
//全局函数声明
void Pos(int x, int y); //光标定位符
void CreatMap();//创建地图
void CreatFood(); //生成食物
void CrossWall(); //蛇头与墙相撞
int  BitSelf(); //舌头与自身相撞
void SnakeMoving(); //蛇移动
void Endgame(); //游戏结束
void gamecircle(); //游戏循环
void pause();//游戏暂停void Pos(int x, int y) // 光标定位符
{COORD pos;HANDLE hOutput;pos.X = x;pos.Y = y;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOutput, pos);
}void CreatMap()//创建地图
{for(int i = 0; i < 54; ++i){for(int j = 0; j < 26; ++j){Pos(i, 0);printf("*");Pos(i, 26);printf("*");Pos(0, j);printf("*");Pos(54, j);printf("*");}}
}void CreatFood()
{srand(time(NULL));food_x = rand()%50+2;food_y = rand()%24+2;Pos(food_x, food_y);printf("@");
}void InitSnake()//蛇身初始化
{Snake *tail; //蛇尾head = (Snake *)malloc(sizeof(Snake));head->x = 25;head->y = 5;head->next = NULL;for(int i = 1; i < 4; ++i){tail = (Snake *)malloc(sizeof(Snake));tail->x = 25 + i*1;tail->y = 5;tail->next = head;head = tail;}while(tail){Pos(tail->x, tail->y);printf("@");tail = tail->next;}
}void CrossWall()//撞墙
{if(head->x == 0 || head->x == 54 || head->y == 0 || head->y == 26){endgamestatus = 1;Endgame();}
}int BitSelf()//撞到自己身体
{p = head->next;while(p){if(p->x == head->x && p->y == head->y){return 1;}p = p->next;}return 0;
}void SnakeMoving()
{Snake *newhead;newhead = (Snake *)malloc(sizeof(Snake));CrossWall();if(BitSelf()){endgamestatus = 2;Endgame();}if(Status == R){if(head->x == food_x && head->y == food_y){score += 10;newhead->x = head->x+1;newhead->y = head->y;newhead->next = head;head = newhead;p = head;while(p){Pos(p->x, p->y);printf("@");p = p->next;}CreatFood();}else{newhead->x = head->x+1;newhead->y = head->y;newhead->next = head;head = newhead;p = head;while(p->next->next){Pos(p->x,p->y);printf("@");p=p->next;}Pos(p->next->x, p->next->y);printf(" ");free(p->next);p->next=NULL;}}if(Status == L){if(head->x == food_x && head->y == food_y){score += 10;newhead->x = head->x-1;newhead->y = head->y;newhead->next = head;head = newhead;p = head;while(p){Pos(p->x, p->y);printf("@");p = p->next;}CreatFood();}else{newhead->x = head->x-1;newhead->y = head->y;newhead->next = head;head = newhead;p = head;while(p->next->next){Pos(p->x,p->y);printf("@");p=p->next;}Pos(p->next->x,p->next-> y);printf(" ");free(p->next);p->next=NULL;}}if(Status == W){if(head->x == food_x && head->y == food_y){score += 10;newhead->x = head->x;newhead->y = head->y-1;newhead->next = head;head = newhead;p = head;while(p){Pos(p->x, p->y);printf("@");p = p->next;}CreatFood();}else{newhead->x = head->x;newhead->y = head->y-1;newhead->next = head;head = newhead;p = head;while(p->next->next){Pos(p->x,p->y);printf("@");p=p->next;}Pos(p->next->x,p->next-> y);printf(" ");free(p->next);p->next=NULL;}}if(Status == D){if(head->x == food_x && head->y == food_y){score += 10;newhead->x = head->x+1;newhead->y = head->y;newhead->next = head;head = newhead;p = head;while(p){Pos(p->x, p->y);printf("@");p = p->next;}CreatFood();}else{newhead->x = head->x;newhead->y = head->y+1;newhead->next = head;head = newhead;p = head;while(p->next->next){Pos(p->x,p->y);printf("@");p=p->next;}Pos(p->next->x, p->next->y);printf(" ");free(p->next);p->next=NULL;}}
}void Endgame()
{system("cls");Pos(13,13);if(endgamestatus == 1)printf("撞墙啦!");if(endgamestatus == 2)printf("撞到自己啦!");Pos(13,14);printf("你的游戏得分为: %d",score);exit(0);
}
void gamecircle()
{Pos(57,4);printf("操作说明");Pos(57,5);printf("w a s d分别对应上 左 下 右 ");Pos(57,6);printf("按空格键暂停");while(1){Pos(57,7);printf("游戏分数:%d",score);if(kbhit())key=getch();switch(key){case Key_Right:if(Status!=L)Status=R;break;case Key_Left:if(Status!=R)Status=L;break;case Key_Up:if(Status!=D)Status=W;break;case Key_Down:if(Status!=W)Status=D;break;case Key_Space:pause();break;default:break;}Sleep(300);SnakeMoving();}
}
void Welcome()
{Pos(27,13);printf("欢迎来到贪吃蛇游戏");system("pause");system("cls");/* Pos(50,9);printf("欢迎大家对源代码进行修改");Pos(50,11);printf("开发出更多好玩的玩法");*/Pos(50,12);system("pause");system("cls");
}void pause()//暂停
{while(1){if((key=getchar()) == ' ')break;}
}
int main()
{Welcome();CreatMap();CreatFood();InitSnake();gamecircle();return 0;
}
void Pos(int x, int y) // 光标定位符
{COORD pos;HANDLE hOutput;pos.X = x;pos.Y = y;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOutput, pos);
}

用c语言编写小游戏:贪吃蛇相关推荐

  1. 【从入门到入土系列】C语言制作小游戏-贪吃蛇:Copy+运行即可另附注释

    系列文章 本系列持续更新中,欢迎您的访问! 系列简介 本系列由唐文疏撰写,负责记录博主的学习生涯中的一点一滴.独乐乐不如众乐乐,故此分享给大家.欢迎大家一起讨论.学习和批评指点. 博主只是一个普普通通 ...

  2. c语言入门级小游戏 · 贪吃蛇 | 激发你的编程兴趣

    目录 前言 拓展知识 介绍system("pause") First:制作可控移动的小蛇 Second:添加食物 Third:如何Game Over 完整代码 前言 声明:本游戏参 ...

  3. C语言实战小游戏:贪吃蛇大战

    代码如下: #include<easyx.h> #include<stdio.h> #include<conio.h> // 需要使用_kbhit和_getch函数 ...

  4. go语言编程小游戏--贪吃蛇

    前提准备条件:安装gcc环境,可以百度也 可以安装这个链接:https://pan.baidu.com/s/1BbXFcBZywK-k-eIkWqY3Ug 提取码:04wp 复制这段内容后打开百度网盘 ...

  5. 用pygame做一个简单的python小游戏---贪吃蛇

    用pygame做一个简单的python小游戏-贪吃蛇 贪吃蛇游戏博客链接:(方法一样,语言不一样) c++贪吃蛇:https://blog.csdn.net/weixin_46791942/artic ...

  6. 做一个简单的java小游戏--贪吃蛇

    做一个简单的java小游戏–贪吃蛇 贪吃蛇游戏博客链接:(方法一样,语言不一样) c++贪吃蛇:https://blog.csdn.net/weixin_46791942/article/detail ...

  7. Python命令行小游戏—贪吃蛇

    Python命令行小游戏-贪吃蛇 前言 一.贪吃蛇游戏初始界面及地图 1.游戏初始界面 2.游戏地图 二.命令符的设置.输出刷新和按键检测 1.库支持 2.c语言代码 3.Python代码(变量初始化 ...

  8. 【python小游戏】用python写一款小游戏--贪吃蛇

    大家好,我是爱吃饼干的小白鼠,今天给大家分享一款自制小游戏.如何用python编写贪吃蛇. 今天,突发奇想的想用python写一款小游戏--贪吃蛇.相信大家都玩过,那么玩一款自己写的是一种什么样的体验 ...

  9. 用c语言编写的打字母游戏,用C语言编写小游戏——“井字棋”

    原标题:用C语言编写小游戏--"井字棋" 作者:Milo Yip 来源:知乎 原文链接:https://zhuanlan.zhihu.com/p/39581573 在 Milo Y ...

  10. 微信小游戏——贪吃蛇

    博客简介 本篇博客介绍的是微信小游戏贪吃蛇的案例,详细的开发过程,并且提供代码压缩包下载. 案例简介 布局 构建对象 响应事件 蛇头对象的移动 蛇身的移动 食物刷新 绘制得分 碰撞检验 开始界面和结束 ...

最新文章

  1. Java 数据类型转换
  2. 如何确定线程池的大小?
  3. Java对象序列化详解6,Java对象的序列化与反序列化详解
  4. Java中泛型的使用场景
  5. spark之2:原理介绍
  6. 最新安卓手机性价比榜公布:Redmi连夺三冠
  7. linux tar 命令
  8. mysql全文索引 插件,如何编写MySQL全文索引插件
  9. java中的类、成员变量、方法的修饰符。
  10. DevC++ 软件下载及安装教程(详细、具体)
  11. discuz 3.1 修改浏览器顶部小图标
  12. 饥荒dns服务器未响应,DNS服务器未响应怎么办
  13. 安卓面试中高级安卓开发工程师总结之——如何写一份让HR主动邀请你面试的简历
  14. 金属结构保温板的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  15. 基本数据结构--字典和常用内置序列函数
  16. MapGuide源码分析----MapGuide服务器源码分析
  17. 如何在 R 中读取 Zip 文件
  18. 西安电子科技大学期末C语言考试2022年真题 --LXY
  19. 常用网络工具1:全能终端神器MobaXterm
  20. 使用winhex对MBR分析

热门文章

  1. Ubuntu20.04 安装在U盘上
  2. JCreator 使用技巧
  3. Centos 安装配置 Dynamips
  4. SQL2005下载版本之区别
  5. sql2005安装图解
  6. 动态SLIC加载(DBSLDR)激活win7
  7. 人工智能写诗全程测试输出的诗句
  8. 真人秀制作网站_真人秀正在毁掉中国的明星
  9. 运放专题:电压比较器
  10. 计算机组成与体系结构