一、建立背景

这里可以运用界面函数initgraph(a,b)来建立,其头文件为<grapgics.h>。

注意:为了防止卡退需要使用while(1){ }来一直循坏。

#include<stdio.h>
#include<graphics.h>//首先定义一个图形界面
int main() {initgraph(1000, 600);setbkcolor(RGB(28, 1115, 119));//设置背景颜色cleardevice();//用该颜色清除图形屏幕,也就是填充背景while (1) {}
}

如图:

二、定义蛇

由于蛇需要有节数大小、速度、方向、坐标,所以用结构体来定义蛇。

struct Point {int x;int y;
}; //蛇的坐标分为横坐标纵坐标typedef enum {up,down,left,right
}; //通过枚举分别列出蛇的四个方向struct Snake {int size;//节数int dir;//方向int speed;//速度struct Point point[100];//坐标
}snake;

由于还未初始化,这时界面任然未发生变化。

三、初始化蛇

蛇的轮廓定义完成之后,需要考虑蛇的身体,这里可以使用retrange()矩形函数或者solidcircle()画一个实心圆来表示蛇,其函数头文件为<conio.h>。也就是所谓“画蛇”drawsnake。由于画蛇需要蛇的节数,所以我们先初始化蛇。

即初始化蛇的身体,如蛇的节数、速度、初始位置等等。

void initsnake() {snake.size = 4;//设置蛇的初始节数为4snake.speed = 10;//设置蛇的速度为10snake.dir = right;//设置蛇的初始方向为向右移动for (int i = 0; i < snake.size; i++) {snake.point[i].x = 40 - 10 * i;//由于设置的是四节蛇,这样设置使每节相隔10snake.point[i].y = 10;//使初始蛇的纵坐标统一固定在同一水平线}
}
void drawsnake() {for (int i = 0; i < snake.size; i++) {rectangle(snake.point[i].x, snake.point[i].y, snake.point[i].x + 10, snake.point[i].y + 10);//画矩形,也可以用solidcircle(snake.point[i].x, snake.point[i].y,5)}
}

总代码如下:注意不要忘了函数头文件,以及在main函数中调用已写好的函数。

#include<stdio.h>
#include<graphics.h>
#include<conio.h>
struct Point {int x;int y;
}; //蛇的坐标分为横坐标纵坐标typedef enum {up,down,left,right
}; //通过枚举分别列出蛇的四个方向struct Snake {int size;//节数int dir;//方向int speed;//速度struct Point point[100];//坐标
}snake;void initsnake() {snake.size = 4;//设置蛇的初始节数为4snake.speed = 10;//设置蛇的速度为10snake.dir = right;//设置蛇的初始方向为向右移动for (int i = 0; i < snake.size; i++) {snake.point[i].x = 40 - 10 * i;//由于设置的是四节蛇,这样设置使每节相隔10snake.point[i].y = 10;//使初始蛇的纵坐标统一固定在同一水平线}
}
void drawsnake() {for (int i = 0; i < snake.size; i++) {rectangle(snake.point[i].x, snake.point[i].y, snake.point[i].x + 10, snake.point[i].y + 10);//画矩形,也可以用solidcircus(snake.point[i].x, snake.point[i].y,5)}
}
//首先定义一个图形界面
int main() {initgraph(1000, 600);setbkcolor(RGB(28, 1115, 119));//设置背景颜色cleardevice();//用该颜色清除图形屏幕,也就是填充背景initsnake();while (1) {drawsnake();}
}

这时的运行结果:

四、移动蛇

由于是简易版的贪吃蛇,所以设置了“穿墙”设定。


void movesnake() {for (int i = snake.size-1; i > 0;i--) {snake.point[i] = snake.point[i-1];//从蛇尾开始,蛇尾等于上一个蛇身,即每一个点等于它上一个点的坐标}switch (snake.dir) {case right: snake.point[0].x = snake.point[0].x + snake.speed;if (snake.point[0].x + snake.speed >= 1000) {snake.point[0].x = 0;//穿墙}break;case left:snake.point[0].x = snake.point[0].x - snake.speed;if (snake.point[0].x - snake.speed <= 0){snake.point[0].x = 1000;//穿墙}break;case up:snake.point[0].y = snake.point[0].y - snake.speed;if (snake.point[0].y - snake.speed <= 0){snake.point[0].y = 600;//穿墙}break;case down:snake.point[0].y = snake.point[0].y + snake.speed;//或者snake.point[0].y += snake.speed;if (snake.point[0].y + snake.speed >= 600){snake.point[0].y = 0;//穿墙}break;default:break;}
}

总代码:

#include<stdio.h>
#include<graphics.h>
#include<conio.h>
struct Point {int x;int y;
}; //蛇的坐标分为横坐标纵坐标typedef enum {up=72,down=80,left=75,right=77
}; //通过枚举分别列出蛇的四个方向struct Snake {int size;//节数int dir;//方向int speed;//速度struct Point point[100];//坐标
}snake;void initsnake() {snake.size = 4;//设置蛇的初始节数为4snake.speed = 10;//设置蛇的速度为10snake.dir = right;//设置蛇的初始方向为向右移动snake.point[0].x = 10;snake.point[0].y = 10;for (int i = 0; i < snake.size; i++) {snake.point[i].x = 40 - 10 * i;//由于设置的是四节蛇,这样设置使每节相隔10snake.point[i].y = 10;//使初始蛇的纵坐标统一固定在同一水平线}
}
void drawsnake() {for (int i = 0; i < snake.size; i++) {rectangle(snake.point[i].x, snake.point[i].y, snake.point[i].x + 10, snake.point[i].y + 10);//画矩形,也可以用solidcircle(snake.point[i].x, snake.point[i].y,5)}
}
void movesnake() {for (int i = snake.size-1; i > 0;i--) {snake.point[i] = snake.point[i-1];//从蛇尾开始,蛇尾等于上一个蛇身,即每一个点等于它上一个点的坐标}switch (snake.dir) {case right: snake.point[0].x = snake.point[0].x + snake.speed;if (snake.point[0].x + snake.speed >= 1000) {snake.point[0].x = 0;}break;case left:snake.point[0].x = snake.point[0].x - snake.speed;if (snake.point[0].x - snake.speed <= 0){snake.point[0].x = 1000;}break;case up:snake.point[0].y = snake.point[0].y - snake.speed;if (snake.point[0].y - snake.speed <= 0){snake.point[0].y = 600;}break;case down:snake.point[0].y = snake.point[0].y + snake.speed;//或者snake.point[0].y += snake.speed;if (snake.point[0].y + snake.speed >= 600){snake.point[0].y = 0;}break;default:break;}
}//首先定义一个图形界面
int main() {initgraph(1000, 600);setbkcolor(RGB(28, 1115, 119));//设置背景颜色cleardevice();//用该颜色清除图形屏幕,也就是填充背景initsnake();while (1) {drawsnake();movesnake();Sleep(80);//延时}return 0;
}

这里发现一个问题,蛇的轨迹并没有去除。

最后发现,是代码setbkcolor(RGB(28, 1115, 119));与cleardevice();的问题,需要放到循坏while(1)内部,或者放到“画蛇”里。

错误代码:

int main() {initgraph(1000, 600);setbkcolor(RGB(28, 1115, 119));//设置背景颜色cleardevice();//用该颜色清除图形屏幕,也就是填充背景while (1) {}return 0;
}

正确代码:

int main() {initgraph(1000, 600);while (1) {setbkcolor(RGB(28, 1115, 119));//设置背景颜色cleardevice();//用该颜色清除图形屏幕,也就是填充背景}return 0;
}

或者

void drawsnake() {setbkcolor(RGB(28, 1115, 119));//设置背景颜色cleardevice();//用该颜色清除图形屏幕,也就是填充背景}
}

四、键盘输入控制蛇的方向

通过键盘wsad键,或者上下左右键控制蛇的运动方向。

void KeyControl()
{// 判断有没有按键;if (_kbhit())//检测有没有按键,如果有就返回真,否则返回假;{//72 80 75 77上下左右键值;switch (_getch()){case 'w':case 'W':case 72:if (snake.dir != down){snake.dir = up;}break;case 's':case 'S':case 80:if (snake.dir != up){snake.dir = down;}break;case 'a':case 'A':case 75:if (snake.dir != right){snake.dir = left;}break;case 'd':case 'D':case 77:if (snake.dir != left){snake.dir = right;}break;case ' ':while (1){if (_getch() == ' ');return;}}}
}

总码:

#include<stdio.h>
#include<graphics.h>
#include<conio.h>
struct Point {int x;int y;
}; //蛇的坐标分为横坐标纵坐标typedef enum {up=72,down=80,left=75,right=77
}; //通过枚举分别列出蛇的四个方向struct Snake {int size;//节数int dir;//方向int speed;//速度struct Point point[100];//坐标
}snake;void initsnake() {snake.size = 4;//设置蛇的初始节数为4snake.speed = 10;//设置蛇的速度为10snake.dir = right;//设置蛇的初始方向为向右移动snake.point[0].x = 10;snake.point[0].y = 10;for (int i = 0; i < snake.size; i++) {snake.point[i].x = 40 - 10 * i;//由于设置的是四节蛇,这样设置使每节相隔10snake.point[i].y = 10;//使初始蛇的纵坐标统一固定在同一水平线}
}
void drawsnake() {for (int i = 0; i < snake.size; i++) {rectangle(snake.point[i].x, snake.point[i].y, snake.point[i].x + 10, snake.point[i].y + 10);//画矩形,也可以用solidcircle(snake.point[i].x, snake.point[i].y,5)}
}
void movesnake() {for (int i = snake.size-1; i > 0;i--) {snake.point[i] = snake.point[i-1];//从蛇尾开始,蛇尾等于上一个蛇身,即每一个点等于它上一个点的坐标}switch (snake.dir) {case right: snake.point[0].x = snake.point[0].x + snake.speed;if (snake.point[0].x + snake.speed >= 1000) {snake.point[0].x = 0;}break;case left:snake.point[0].x = snake.point[0].x - snake.speed;if (snake.point[0].x - snake.speed <= 0){snake.point[0].x = 1000;}break;case up:snake.point[0].y = snake.point[0].y - snake.speed;if (snake.point[0].y - snake.speed <= 0){snake.point[0].y = 600;}break;case down:snake.point[0].y = snake.point[0].y + snake.speed;//或者snake.point[0].y += snake.speed;if (snake.point[0].y + snake.speed >= 600){snake.point[0].y = 0;}break;default:break;}
}void KeyControl()
{// 判断有没有按键;if (_kbhit())//检测有没有按键,如果有就返回真,否则返回假;{//72 80 75 77上下左右键值;switch (_getch()){case 'w':case 'W':case 72:if (snake.dir != down){snake.dir = up;}break;case 's':case 'S':case 80:if (snake.dir != up){snake.dir = down;}break;case 'a':case 'A':case 75:if (snake.dir != right){snake.dir = left;}break;case 'd':case 'D':case 77:if (snake.dir != left){snake.dir = right;}break;case ' ':while (1){if (_getch() == ' ');return;}}}
}
//首先定义一个图形界面
int main() {initgraph(1000, 600);initsnake();while (1) {setbkcolor(RGB(28, 1115, 119));//设置背景颜色cleardevice();//用该颜色清除图形屏幕,也就是填充背景drawsnake();movesnake();KeyControl();Sleep(80);//延时}return 0;
}

最终结果

吃食物还没解决,下节继续哈~

c语言游戏开发之贪吃蛇相关推荐

  1. laya游戏开发之贪吃蛇大作战(一)

    laya游戏开发之贪吃蛇大作战 一.背景 二.引擎选择 三.整体架构 3.1 玩法分析 3.2 游戏架构 3.3 技术选型 一.背景 需要快速实现一个贪吃蛇的 demo 以验证功能,非传统贪吃蛇玩法, ...

  2. Win32 游戏开发:贪吃蛇 上篇

    1)贪吃蛇游戏介绍(摘抄自百度百科) 1976年,Gremlin平台推出了一款经典街机游戏Blockade.游戏中,两名玩家分别控制一个角色在屏幕上移动,所经之处砌起围栏.角色只能向左.右方向90度转 ...

  3. laya游戏开发之贪吃蛇大作战(二)—— 贪吃蛇客户端

    文章目录 一 功能分析 二 实现方案 1. 代码结构 2. 关键函数实现 2.1 游戏主循环(GameLoop) 2.2 数据层(Model) 2.3 画面绘制层(View) 帧同步的困难与解决方法 ...

  4. Win32 游戏开发:贪吃蛇 下篇

    因为个人原因更新来晚了,向各位关注的读者道个歉... 前排提示: 文章非常的长!!!(如有不懂的请在文章下方评论) 6)开始码代码啦 经过上面的前期工作,我们应该更清楚我们要做怎么做了(至少有一个方向 ...

  5. c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...

    求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束 /* 以下是主要的逻辑代码,还有些.c和.h就没发了 ...

  6. C语言贪吃蛇游戏代码,贪吃蛇C语言代码实现大全

    一.C语言贪吃蛇代码实现前言 设计贪吃蛇游戏的主要目的是让大家夯实C语言基础,训练编程思维,培养解决问题的思路,领略多姿多彩的C语言. 贪吃蛇是非常经典的一款游戏,本次我们模拟在控制台实现贪吃蛇游戏, ...

  7. 开发Windows贪吃蛇游戏——(二)代码实现

    目录 前言 窗体部分 Frame部分 声明全局变量 Panel的初始化 startGame方法 paintComponent方法 drawGame方法 newSnake方法 newFood方法 mov ...

  8. 计算机课程编程设计贪吃蛇游戏设计,c语言课程设计报告--贪吃蛇游戏系统

    c语言课程设计报告--贪吃蛇游戏系统 院 系 计算机科学技术学院 班 级 组 长 学 号 指导教师 2017 年 3 月 2 日 C 语言语言基础课程设计基础课程设计 贪贪贪贪吃吃吃吃蛇蛇蛇蛇游游游游 ...

  9. 完整版! 大一新手C语言数据结构实现简单贪吃蛇游戏

    大一新手C语言数据结构实现简单贪吃蛇游戏含源代码 贪吃蛇 1.前言简述 2.编写语言及工具 3.游戏的头文件代码(.h) 3.1map.h 3.2snake.h 3.3Food.h 4.游戏的源文件代 ...

最新文章

  1. 【只需4步】windows server系统下快速安装绿色版apache-tomcat-8.0.35(免安装版)
  2. CKedit在线编辑器
  3. js寻找两个数组的差集_js求两个数组的交集|并集|差集|去重
  4. python 均方误差_一个很随意的Python智能优化库,一个文件就是一个库-- PySwarm
  5. UIbutton系统按键(System)和图片按键(Custom)对比
  6. 云架构的基础转变会带来哪些变化?
  7. 【yii2】 yii框架如果控制器和方法都是多个单词组成应该怎样写请求链接
  8. js call(),apply(),对象冒充,改变变量作用域
  9. 蒙特卡罗算法与拉斯维加斯算法
  10. movcms能安装PHP吗,LzCMS-博客版 手动安装方法
  11. Android 垃圾回收机制★★★
  12. Robomaster视觉教程(二)Win10+VS201x+Opencv3.4.x环境搭建
  13. 【LISTENER】使用“alter system register;”解决动态监听注册缓慢问题
  14. 斗地主中的提示出牌算法(Lua)
  15. 佛理(引用别人的东西,怕忘记了不好找,拿来了,哈哈)
  16. blender摄像机怎么绕物体旋转
  17. 软考倒计时26天,最后冲刺阶段
  18. 【案例】用 turtle 绘制一个月饼
  19. 在 UltraEdit /UEStudio 中配置自动更正关键字
  20. ZUCC_BB平台-Quiz B-3-5-答案

热门文章

  1. MATLAB的assignin和evalin函数
  2. 软件技术专业就业方向分析
  3. MySQL练习(学生表,课程表,选课表)超详解
  4. JavaScript 精选:哪些能提高开发效率的es6 新语法糖
  5. Linux下ifconfig不显示ip地址问题总结
  6. 【Ruby on Rails全栈课程】4.1 点赞功能
  7. 学了mysql用户权限我直接把管理员禁闭了
  8. 米家对讲机_可以与手机互动的对讲机,小米米家对讲机
  9. setsockopt()函数和getsockopt()函数
  10. 小米4c如何添加语言,小米4C输入法怎么切换 小米4C输入法切换教程