【C语言项目】贪吃蛇游戏(上)
00. 目录
01. 开发背景
贪吃蛇起源于西方,来自于蛇骗夏娃和亚当偷吃禁果的神话。人们为了说明蛇的一个“贪”字,开发出了贪吃蛇游戏。本公开课使用C语言开发一个贪吃蛇游戏。
贪吃蛇最初为人们所知的是诺基亚手机附带的一个小游戏,它伴随着诺基亚手机走向世界。现在的贪吃蛇出现了许多衍生版本,并被移植到各种平台上。
通过本公开课的学习,大家可以学到:
Visual Studio 2017开发环境
C语言中的三大结构和函数
C语言中动态内存申请和释放
C语言中文件基本操作
C语言中的简单单向链表
控制终端基本设置和监听按键
C语言简单游戏开发流程
C语言简单游戏开发调试技巧
02. 功能介绍
贪吃蛇的游戏规则也很简单,具体为:蛇出现在封闭的空间中,同时在地图上会随机出现食物,玩家通过键盘上的上下左右方向键来控制蛇的前进方向。蛇头撞到食物,则食物消失,表示被蛇吃掉了,蛇身增加一节,增加玩家的得分。接着又随机出现一个食物,等待蛇来吃。如果蛇在前进的过程中撞到墙或者咬到蛇身或者玩家按下ESC键,则游戏退出。
项目演示
03. 欢迎界面设计
欢迎界面如下
3.1 常用终端控制函数
SetConsoleTextAttribute函数介绍
BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput,WORD wAttributes);
功能:设置控制台文本属性(颜色),可以设置前景色FOREGROUND(文本颜色)和背景色BACKGROUND
参考示例:
HANDLE hOut;
hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标注输出句柄 */
SetConsoleTextAttribute(hOut, FOREGROUND_BLUE); /* 设置控制台颜色,前景色为蓝色*/
SetConsoleTextAttribute(hOut, BACKGROUND_RED); /* 背景色为红色 */
SetConsoleCursorPosition函数介绍
BOOL SetConsoleCursorPosition(HANDLE hConsoleOutput, COORD dwCursorPosition);
功能:设置控制台光标坐标
SetConsoleCursorPosition官方文档介绍
参考示例:
COORD pos = {x, y};/* x是横坐标 y是纵坐标 */
HANDLE hOut;
hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标注输出句柄 */
SetConsoleCursorPosition(hOut,pos); /* 设置控制台光标坐标(设备句柄, 光标坐标) */
3.2 设置文本颜色函数
//设置终端字体颜色
int setColor(int c)
{
//GetStdHandle: 获取指定的标准设备的句柄
//STD_OUTPUT_HANDLE 标准输出句柄
//c 颜色值
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
return 0;
}
十进制颜色对照表
3.3 设置光标位置函数
//设置光标的坐标
int gotoXY(int x, int y)
{
COORD c;
//设置横坐标
c.X = x;
//设置纵坐标
c.Y = y;
//设置光标的位置
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
return 0;
}
3.4 绘制字符画(蛇)
参考代码:
//绘制字符画 --蛇
int printSnake(void)
{
//清屏
system("cls");
gotoXY(35, 1);
setColor(6);
printf("/^\\/^\\"); //蛇眼睛
gotoXY(34, 2);
printf("|__| O|"); //蛇眼睛
gotoXY(33, 2);
setColor(2);
printf("_");
gotoXY(25, 3);
setColor(12);
printf("\\/"); //蛇信
gotoXY(31, 3);
setColor(2);
printf("/");
gotoXY(37, 3);
setColor(6);
printf(" \\_/"); //蛇眼睛
gotoXY(41, 3);
setColor(10);
printf(" \\");
gotoXY(26, 4);
setColor(12);
printf("\\____"); //舌头
gotoXY(32, 4);
printf("_________/");
gotoXY(31, 4);
setColor(2);
printf("|");
gotoXY(43, 4);
setColor(10);
printf("\\");
gotoXY(32, 5);
setColor(2);
printf("\\_______"); //蛇嘴
gotoXY(44, 5);
setColor(10);
printf("\\");
gotoXY(39, 6);
printf("| | \\"); //下面都是画蛇身
gotoXY(38, 7);
printf("/ / \\");
gotoXY(37, 8);
printf("/ / \\ \\");
gotoXY(35, 9);
printf("/ / \\ \\");
gotoXY(34, 10);
printf("/ / \\ \\");
gotoXY(33, 11);
printf("/ / _----_ \\ \\");
gotoXY(32, 12);
printf("/ / _-~ ~-_ | |");
gotoXY(31, 13);
printf("( ( _-~ _--_ ~-_ _/ |");
gotoXY(32, 14);
printf("\\ ~-____-~ _-~ ~-_ ~-_-~ /");
gotoXY(33, 15);
printf("~-_ _-~ ~-_ _-~");
gotoXY(35, 16);
printf("~--______-~ ~-___-~");
return 0;
}
测试代码如下:
int main()
{
//设置控制台的宽高
system("mode con cols=100 lines=30");
printSnake();
system("pause");
return 0;
}
测试效果如下:
3.5 欢迎界面函数
界面设计分析
参考代码:
//欢迎界面
int welcomGame(void)
{
int i;
int j;
int n = 0;
//绘制字符画蛇
printSnake();
//输出文字
setColor(11);
gotoXY(45, 18);
printf("贪吃蛇游戏");
setColor(14);
//边框范围20--26行 27--74列
for (i = 20; i <= 26; i++)
{
for (j = 27; j <= 74; j++)
{
gotoXY(j, i);
if (i == 20 || i == 26)
{
printf("-");
}
else if (j == 27 || j == 74)
{
printf("|");
}
}
}
setColor(12);
gotoXY(35, 22);
printf("1. 开始游戏");
gotoXY(55, 22);
printf("2. 游戏说明");
gotoXY(35, 24);
printf("3. 退出游戏");
gotoXY(27, 27);
printf("请选择[1 2 3]: ");
scanf("%d", &n);
//清空换行符
getchar();
return n;
}
主函数参考代码如下:
int main()
{
int choice;
//设置控制台的宽高
system("mode con cols=100 lines=30");
while (1)
{
choice = welcomGame();
switch (choice)
{
//开始游戏
case 1:
printf("开始游戏");
break;
//游戏说明
case 2:
printf("游戏说明");
break;
//退出游戏
case 3:
break;
default:
setColor(12);
gotoXY(45, 28);
printf("请做出有效选择[1~3]");
//输入任意键
getchar();
}
}
system("pause");
return 0;
}
04. 游戏帮助界面设计
游戏说明模块如下:
游戏帮助界面参考代码
//游戏帮助界面
int aboutGame(void)
{
int i = 0;
int j = 0;
//清屏
system("cls");
setColor(13);
gotoXY(44, 3);
printf("游戏说明");
setColor(2);
//画出边框
//6~22行 20~75列
for (i = 6; i <= 22; i++)
{
for (j = 20; j <= 75; j++)
{
gotoXY(j, i);
//画上下边框
if (i == 6 || i == 22)
{
printf("=");
}
else if (j == 20 || j == 75)
{
printf("||");
}
}
}
setColor(3);
gotoXY(30, 8);
printf("★ 1.不能撞到墙壁,不能咬到自己");
setColor(5);
gotoXY(30, 11);
printf("★ 2.F1加速前进,F2减速前进");
setColor(11);
gotoXY(30, 14);
printf("★ 3.使用空格暂停游戏和继续游戏");
setColor(13);
gotoXY(30, 17);
printf("★ 4.使用方向键控制前进的方向");
setColor(14);
gotoXY(30, 20);
printf("★ 5.按下ESC键退出游戏");
setColor(12);
gotoXY(22, 24);
printf("按下回车键返回主界面...");
getchar();
return 0;
}
主函数代码修改如下:
int main()
{
int choice;
//设置控制台的宽高
system("mode con cols=100 lines=30");
while (1)
{
choice = welcomGame();
switch (choice)
{
//开始游戏
case 1:
printf("开始游戏");
break;
//游戏说明
case 2:
aboutGame();
break;
//退出游戏
case 3:
break;
default:
setColor(12);
gotoXY(45, 28);
printf("请做出有效选择[1~3]");
//输入任意键
getchar();
}
}
system("pause");
return 0;
}
05. 退出游戏实现
在主菜单中, 当用户选择3的时候,直接退出游戏
在主函数case 3中添加如下代码:
//退出游戏
case 3:
exit(0);
break;
大学生C/C++开发交流群
【C语言项目】贪吃蛇游戏(上)的更多相关文章
- C语言实现贪吃蛇游戏
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/times.h> ...
- 小项目特供 贪吃蛇游戏(基于C语言)
C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- 贪吃蛇游戏——C语言双向链表实现
采用了双向链表结点来模拟蛇身结点: 通过C语言光标控制函数来打印地图.蛇身和食物: /************************** *************************** 贪吃 ...
- 贪吃蛇游戏(printf输出C语言版本)
这一次我们应用printf输出实现一个经典的小游戏—贪吃蛇,主要难点是小蛇数据如何存储.如何实现转弯的效果.吃到食物后如何增加长度. 1 构造小蛇 首先,在画面中显示一条静止的小蛇.二维数组canva ...
- Love2D游戏引擎制作贪吃蛇游戏
代码地址如下:http://www.demodashi.com/demo/15051.html Love2D游戏引擎制作贪吃蛇游戏 内附有linux下的makefile,windows下的生成方法请查 ...
- 使用Love2D引擎开发贪吃蛇游戏
今天来介绍博主近期捣腾的一个小游戏[贪吃蛇],贪吃蛇这个游戏相信大家都不会感到陌生吧.今天博主将通过Love2D这款游戏引擎来为大家实现一个简单的贪吃蛇游戏,在本篇文章其中我们将会涉及到贪吃蛇的基本算 ...
- WebGL实现HTML5的3D贪吃蛇游戏
js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...
- 【BZOJ-4213】贪吃蛇 有上下界的费用流
4213: 贪吃蛇 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 58 Solved: 24[Submit][Status][Discuss] Desc ...
随机推荐
- Android Studio提示忽略大小写
Android Studio的自动提示功能非常之强大,但是,如果你要输入“String”,你输入“string”,这个是不会提示的,也就是大小写敏感的,不爽是吗? 选择大小写不敏感就ok了!这样你想怎 ...
- TP5之安全机制
防止sql注入 1.查询条件尽量使用数组方式,具体如下: $wheres = array(); $wheres['account'] = $account; $wheres['password'] = ...
- Codeforces702C【二分】
题意: 给你几个城市,蜂窝塔量: 给出城市和塔的坐标可以重叠,非递减的方式给出: 输出最小的r,以至于所有的城市能被覆盖到: 思路: 目的就是要使每个城市覆盖到,那我对每个城市找离最近塔的距离,然后在 ...
- Unity里的人物驱动/换装备/换武器/换衣服/卡通重定位(转)
Unity里的人物驱动/换装备/换武器/换衣服/动画重定位 刚学的过程被这个问题困扰最多. 首先,基本的,大家都知道驱动人物需要骨架.绑骨的Mesh和动画(这三个要是不知道的话就得考虑看看计算机图形学 ...
- bzoj 2064: 分裂【状压dp】
参考:https://www.cnblogs.com/liu-runda/p/6019426.html 有点神奇 大概就是显然最直观的转移是全部合起来再一个一个拆,是n+m次,然后设f[i][j]为分 ...
- 用纯XMLHttpRequest实现AJAX
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- NOIp2005 过河【dp+离散化】By cellur925
题目传送门 $30pts$ 状态和转移都比较好想:设$f[i]$表示跳到$i$位置,踩到的最小石子数.转移方程也很明了,为$f[i]$=$min${$f[i-j]$),,这个位置有石子时答案再加1,$ ...
- jQuery同时监听两个事件---实现同时操控两个按键
我们都知道因为js是单线程的,所以没有可以同时触发键盘两个事件的方法 今天我们就来做一个可以实现这个功能方法 先来看一下成品图效果 接下来我们来看下具体是怎么实现的 注释写在了代码里面 <!DO ...
- Hexo瞎折腾系列(6) - 将博客同时部署到Github和Coding
前言 由于本人只是将Hexo博客同时部署到 Github 和 Coding.net ,所以这里只介绍怎么同时部署到这两个网站的pages. 之所以选择这两个网站,是因为国外用户可以访问 Github, ...
- safari 日期显示NAN
解决方案: 1.服务器端将时间转换为时间戳,前端再进行处理,问题解决. fastjson,JSON.toJSONString() 自动将时间字段转换为时间戳类型,然后传到前端. @RequestMap ...