c语言游戏开发之贪吃蛇
一、建立背景
这里可以运用界面函数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语言游戏开发之贪吃蛇相关推荐
- laya游戏开发之贪吃蛇大作战(一)
laya游戏开发之贪吃蛇大作战 一.背景 二.引擎选择 三.整体架构 3.1 玩法分析 3.2 游戏架构 3.3 技术选型 一.背景 需要快速实现一个贪吃蛇的 demo 以验证功能,非传统贪吃蛇玩法, ...
- Win32 游戏开发:贪吃蛇 上篇
1)贪吃蛇游戏介绍(摘抄自百度百科) 1976年,Gremlin平台推出了一款经典街机游戏Blockade.游戏中,两名玩家分别控制一个角色在屏幕上移动,所经之处砌起围栏.角色只能向左.右方向90度转 ...
- laya游戏开发之贪吃蛇大作战(二)—— 贪吃蛇客户端
文章目录 一 功能分析 二 实现方案 1. 代码结构 2. 关键函数实现 2.1 游戏主循环(GameLoop) 2.2 数据层(Model) 2.3 画面绘制层(View) 帧同步的困难与解决方法 ...
- Win32 游戏开发:贪吃蛇 下篇
因为个人原因更新来晚了,向各位关注的读者道个歉... 前排提示: 文章非常的长!!!(如有不懂的请在文章下方评论) 6)开始码代码啦 经过上面的前期工作,我们应该更清楚我们要做怎么做了(至少有一个方向 ...
- c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...
求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束 /* 以下是主要的逻辑代码,还有些.c和.h就没发了 ...
- C语言贪吃蛇游戏代码,贪吃蛇C语言代码实现大全
一.C语言贪吃蛇代码实现前言 设计贪吃蛇游戏的主要目的是让大家夯实C语言基础,训练编程思维,培养解决问题的思路,领略多姿多彩的C语言. 贪吃蛇是非常经典的一款游戏,本次我们模拟在控制台实现贪吃蛇游戏, ...
- 开发Windows贪吃蛇游戏——(二)代码实现
目录 前言 窗体部分 Frame部分 声明全局变量 Panel的初始化 startGame方法 paintComponent方法 drawGame方法 newSnake方法 newFood方法 mov ...
- 计算机课程编程设计贪吃蛇游戏设计,c语言课程设计报告--贪吃蛇游戏系统
c语言课程设计报告--贪吃蛇游戏系统 院 系 计算机科学技术学院 班 级 组 长 学 号 指导教师 2017 年 3 月 2 日 C 语言语言基础课程设计基础课程设计 贪贪贪贪吃吃吃吃蛇蛇蛇蛇游游游游 ...
- 完整版! 大一新手C语言数据结构实现简单贪吃蛇游戏
大一新手C语言数据结构实现简单贪吃蛇游戏含源代码 贪吃蛇 1.前言简述 2.编写语言及工具 3.游戏的头文件代码(.h) 3.1map.h 3.2snake.h 3.3Food.h 4.游戏的源文件代 ...
最新文章
- 【只需4步】windows server系统下快速安装绿色版apache-tomcat-8.0.35(免安装版)
- CKedit在线编辑器
- js寻找两个数组的差集_js求两个数组的交集|并集|差集|去重
- python 均方误差_一个很随意的Python智能优化库,一个文件就是一个库-- PySwarm
- UIbutton系统按键(System)和图片按键(Custom)对比
- 云架构的基础转变会带来哪些变化?
- 【yii2】 yii框架如果控制器和方法都是多个单词组成应该怎样写请求链接
- js call(),apply(),对象冒充,改变变量作用域
- 蒙特卡罗算法与拉斯维加斯算法
- movcms能安装PHP吗,LzCMS-博客版 手动安装方法
- Android 垃圾回收机制★★★
- Robomaster视觉教程(二)Win10+VS201x+Opencv3.4.x环境搭建
- 【LISTENER】使用“alter system register;”解决动态监听注册缓慢问题
- 斗地主中的提示出牌算法(Lua)
- 佛理(引用别人的东西,怕忘记了不好找,拿来了,哈哈)
- blender摄像机怎么绕物体旋转
- 软考倒计时26天,最后冲刺阶段
- 【案例】用 turtle 绘制一个月饼
- 在 UltraEdit /UEStudio 中配置自动更正关键字
- ZUCC_BB平台-Quiz B-3-5-答案
热门文章
- MATLAB的assignin和evalin函数
- 软件技术专业就业方向分析
- MySQL练习(学生表,课程表,选课表)超详解
- JavaScript 精选:哪些能提高开发效率的es6 新语法糖
- Linux下ifconfig不显示ip地址问题总结
- 【Ruby on Rails全栈课程】4.1 点赞功能
- 学了mysql用户权限我直接把管理员禁闭了
- 米家对讲机_可以与手机互动的对讲机,小米米家对讲机
- setsockopt()函数和getsockopt()函数
- 小米4c如何添加语言,小米4C输入法怎么切换 小米4C输入法切换教程