贪吃蛇easyx版本
这学期学了图形交互学,三个星期下来,突然意识到已经可以用c++写一个贪吃蛇了。
于是就用了两天写了这个小游戏。
其中一天写了核心代码,半天找核心代码中的bug,还有半天进行了界面及操作的优化。
但是有些代码写的依旧有些累赘,比如难度选择界面,不停用if语句,代码太杂了,但是也懒得去优化了,毕竟还有很多事情要做。
下面是游戏运行程序,建议在win10下运行,因为找了几个win7win8系统的童鞋貌似都不能运行,给了他们运行库,运行库也安装不上去。
下面是游戏界面截图。
好了接下来就贴出这些代码。仅供参考。
#include "stdafx.h"
#include <time.h>
#include <conio.h>
#include <graphics.h>
#include <iostream>
using namespace std; //bug:运行游戏开始后不能按除方向键和wasd键外的其它键,不然会提示撞墙 /*画窗体边框*/
void drawBorder(bool i, int borderWidth)
{
if (i)
{
setfillcolor(GREEN);
}
else
{
setfillcolor(RED);
}
bar(, , getmaxx(), borderWidth - - );//上边框
bar(, , borderWidth - - , getmaxy());//左边框
bar(getmaxx() - borderWidth + , , getmaxx(), getmaxy());//右边框
bar(, getmaxy() - borderWidth + , getmaxx(), getmaxy());//下边框
} /*贪吃蛇结构体*/
struct Snake
{
int snakeX;
int snakeY;
};
void drawSnake(struct Snake snakeHeadTemp, int snakeR)
{
setfillcolor(WHITE);
solidcircle(snakeHeadTemp.snakeX, snakeHeadTemp.snakeY, snakeR);
}
//擦除蛇尾
bool eraseSnake(struct Snake snakeHeadTemp, struct Snake snakeTail, int snakeR, struct Snake snakeFood)
{
if ((snakeHeadTemp.snakeX == snakeFood.snakeX) && (snakeHeadTemp.snakeY == snakeFood.snakeY))
{
return true;//如果相同,则返回true,说明需要重新绘制一个食物并且不擦除当前蛇尾
}
else
{
setfillcolor(BLACK);
solidcircle(snakeTail.snakeX, snakeTail.snakeY, snakeR);
return false;
}
}
//检测是否和自身相撞
bool checkSnake(struct Snake *snake, struct Snake snakeHeadTemp, int * snakeLenPtr)
{
for (int i = ; i < *snakeLenPtr; i++)
{
if (((snake + i)->snakeX == snakeHeadTemp.snakeX) && ((snake + i)->snakeY == snakeHeadTemp.snakeY))
{
return false;
}
}
return true;
}
//对数组排序
void sortSnake(struct Snake *snake, struct Snake snakeHeadTemp, int * snakeLenPtr)
{
for (int i = *snakeLenPtr - ; i >= ; i--)//妈蛋,i>=0i>=0i>=0罚抄一百遍!这个bug找了整整半天啊卧槽!
{
(snake + i + )->snakeX = (snake + i)->snakeX;
(snake + i + )->snakeY = (snake + i)->snakeY;
}
snake->snakeX = snakeHeadTemp.snakeX;
snake->snakeY = snakeHeadTemp.snakeY;
}
//去除尾巴
void eraseTail(struct Snake snakeTail, int snakeR)
{
setfillcolor(BLACK);
solidcircle(snakeTail.snakeX, snakeTail.snakeY, snakeR);
}
//主函数
int main() {
int screenX = ;//窗口宽
int screenY = ;//窗口高
int borderWidth = ;//游戏边框宽度
int snakeX = ;
int snakeY = ;
int snakeR = ;
int snakeI;//声明食物的横个数
int snakeJ;//声明化食物的纵个数
char ch = 'd';
int foodCount = ;//初始化吃掉的食物个数
TCHAR str[];//用于存储提示文字 initgraph(screenX, screenY);
int speed = ; char choose;
int hard = ; restart:
//初始化开始界面
setfillcolor(BLUE);
bar(, , getmaxx(), getmaxy());
setbkcolor(BLUE);
setcolor(WHITE);
settextstyle(, , TEXT("黑体"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("英雄贪吃蛇"));
settextstyle(, , TEXT("黑体"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("请选择难度,切勿手滑"));
setcolor(YELLOW);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));//
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("脑残模式"));//
setcolor(WHITE);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("凡人模式"));//
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("大仙模式"));//
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("自虐模式"));//
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("退出游戏"));//退出
settextstyle(, , TEXT("黑体"));
outtextxy(getmaxx() / - , getmaxy() - , TEXT("版本 v1.1 made by cy")); //选择界面12 -32
while (choose = _getch())
{
if (choose == -) { choose = _getch(); }
if (choose == )
{
if (hard == ) { speed = ; }
if (hard == ) { speed = ; }
if (hard == ) { speed = ; }
if (hard == ) { speed = ; }
if (hard == ) { return ; }
break;
}
if (choose == )
{
if (hard > ) { hard--; }
else{ hard = ; }
}
if (choose == )
{
if (hard < ) { hard++; }
else { hard = ; }
}
if (hard == )
{
settextstyle(, , TEXT("黑体"));
setcolor(BLUE);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("->"));
setcolor(YELLOW);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("脑残模式"));
setcolor(WHITE);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("凡人模式"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("大仙模式"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("自虐模式"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("退出游戏"));
speed = ;
}
if (hard == )
{
settextstyle(, , TEXT("黑体"));
setcolor(BLUE);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("->"));
setcolor(WHITE);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("脑残模式"));
setcolor(YELLOW);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("凡人模式"));
setcolor(WHITE);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("大仙模式"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("自虐模式"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("退出游戏"));
speed = ;
}
if (hard == )
{
settextstyle(, , TEXT("黑体"));
setcolor(BLUE);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("->"));
setcolor(WHITE);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("脑残模式"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("凡人模式"));
setcolor(YELLOW);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("大仙模式"));
setcolor(WHITE);
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("自虐模式"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("退出游戏"));
speed = ;
}
if (hard == )
{
settextstyle(, , TEXT("黑体"));
setcolor(BLUE);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("->"));
setcolor(WHITE);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("脑残模式"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("凡人模式"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("大仙模式"));
setcolor(YELLOW);
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("自虐模式"));
setcolor(WHITE);
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("退出游戏"));
speed = ;
}
if (hard == )
{
settextstyle(, , TEXT("黑体"));
setcolor(BLUE);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("->"));
setcolor(WHITE);
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("脑残模式"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("凡人模式"));
outtextxy(getmaxx() / - , getmaxy() / - , TEXT("大仙模式"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("自虐模式"));
setcolor(YELLOW);
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("->"));
outtextxy(getmaxx() / - , getmaxy() / + , TEXT("退出游戏"));
}
} setfillcolor(BLACK);
settextstyle(, , TEXT("黑体"));
bar(, , getmaxx(), getmaxy());
setcolor(WHITE);
setbkcolor(BLACK);
outtextxy(getmaxx() / - , getmaxy()/-, TEXT("食物还有5秒到达战场,碾碎它们!"));
settextstyle(, , TEXT("黑体"));
outtextxy(getmaxx() / - , getmaxy() / , TEXT("小提示:除了方向键,还可以用wasd键来控制方向哦~"));
Sleep();
bar(, , getmaxx(), getmaxy()); drawBorder(true, borderWidth);
//初始化贪吃蛇
setfillcolor(YELLOW);
int snakeLen = ; int * snakeLenPtr = &snakeLen;//蛇的节点数,默认为1,即游戏一开始就有一个蛇头
struct Snake snake[];
snake->snakeX = borderWidth + ; snake->snakeY = borderWidth + ;//初始化蛇头
solidcircle(snake->snakeX, snake->snakeY, snakeR);//初始化蛇头
struct Snake snakeTail;//定义蛇尾snakeTail以及一个暂存蛇头的变量
struct Snake snakeHeadTemp;//snakeHeadTemp用于在进行数组向后移动的时候保证蛇头不被覆盖
struct Snake snakeFood;//snake的食物,随机产生
//整个游戏思路是,如果蛇头遇到了新的食物,那么不擦除蛇尾,反之则擦除蛇尾 //随机产生一个食物
srand(time(NULL));
snakeI = rand() % + ;
snakeJ = rand() % + ;
snakeFood.snakeX = borderWidth - + * snakeI;
snakeFood.snakeY = borderWidth - + * snakeJ;
setfillcolor(LIGHTRED);
solidcircle(snakeFood.snakeX, snakeFood.snakeY, snakeR); char c;//用于处理方向键控制和wasd键的冲突
while ()
{
if (_kbhit())
{
c = _getch();
if (c == 'a' || c == 'd' || c == 'w' || c == 's') { ch = c; }
else {
ch = _getch();
if (ch == ) { ch = 'a'; }
if (ch == ) { ch = 'd'; }
if (ch == ) { ch = 'w'; }
if (ch == ) { ch = 's'; }
}
}
//存储蛇尾以及待添加的位置的值
snakeTail.snakeX = snake[snakeLen - ].snakeX;
snakeTail.snakeY = snake[snakeLen - ].snakeY; switch (ch)
{
case 'a'://左
snakeHeadTemp.snakeX = snake->snakeX - ;
snakeHeadTemp.snakeY = snake->snakeY;
break;
case 'd'://右
snakeHeadTemp.snakeX = snake->snakeX + ;
snakeHeadTemp.snakeY = snake->snakeY;
break;
case 'w'://上
snakeHeadTemp.snakeY = snake->snakeY - ;
snakeHeadTemp.snakeX = snake->snakeX;
break;
case 's'://下
snakeHeadTemp.snakeY = snake->snakeY + ;
snakeHeadTemp.snakeX = snake->snakeX;
break;
default:
break;
}
//如果撞墙了
if (snakeHeadTemp.snakeX > || snakeHeadTemp.snakeX < || snakeHeadTemp.snakeY < || snakeHeadTemp.snakeY > )
{
drawBorder(false, borderWidth);
setfillcolor(LIGHTGRAY);
bar(, getmaxy() / - , getmaxx(), getmaxy() / + );//提示框
setbkcolor(LIGHTGRAY);
_stprintf_s(str, _T("你撞墙啦!总共吃了%d个食物,5秒后自动重新开始游戏,渣渣⋯⋯"), foodCount);
outtextxy(getmaxx() / - , getmaxy() / , str);
Sleep();
ch='d';
hard = ;
foodCount = ;
goto restart;
}
if (checkSnake(snake, snakeHeadTemp, snakeLenPtr))
{
drawSnake(snakeHeadTemp, snakeR);
sortSnake(snake, snakeHeadTemp, snakeLenPtr);//更新蛇身体内的数据
//如果为真,说明吃到了食物,则需要重新分配一个食物。并且要把snakeTail推入数组
if (eraseSnake(snakeHeadTemp, snakeTail, snakeR, snakeFood))
{
foodCount++;
snake[snakeLen].snakeX = snakeTail.snakeX;
snake[snakeLen].snakeY = snakeTail.snakeY;
snakeLen++;
eraseTail(snakeTail, snakeR);
sortSnake(snake, snakeHeadTemp, snakeLenPtr);//更新蛇身体内的数据
//随机产生一个食物
snakeI = rand() % + ;
snakeJ = rand() % + ;
snakeFood.snakeX = borderWidth - + * snakeI;
snakeFood.snakeY = borderWidth - + * snakeJ;
}
//每一步都刷新一下食物,因为有时会生成在蛇的身体上,如果不刷新就会被蛇的身体遮挡掉
setfillcolor(LIGHTRED);
solidcircle(snakeFood.snakeX, snakeFood.snakeY, snakeR);
}
else
{
drawBorder(false, borderWidth);
setfillcolor(LIGHTGRAY);
bar(, getmaxy() / - , getmaxx(), getmaxy() / + );//提示框
setbkcolor(LIGHTGRAY);
_stprintf_s(str, _T("居然会有人撞到自己!噗笑尿!总共吃了%d个食物,5秒后自动重新开始游戏,渣渣⋯⋯"), foodCount);
outtextxy(getmaxx() / - , getmaxy() / , str);
Sleep();
ch = 'd';
hard = ;
foodCount = ;
goto restart;
}
Sleep(speed);
}
closegraph();
return ;
}
贪吃蛇easyx版本的更多相关文章
- Java实现贪吃蛇游戏【代码】
花了两个下午写了一个贪吃蛇小游戏,本人想写这游戏很长时间了.作为以前诺基亚手机上的经典游戏,贪吃蛇和俄罗斯方块一样,都曾经在我们的童年给我们带来了很多乐趣.世间万物斗转星移,诺基亚曾经作为手机业的龙头 ...
- 基于EasyX库的贪吃蛇游戏——C语言实现
接触编程有段时间了,一直想学习怎么去写个游戏来练练手.在看了B站上的教学终于可以自己试试怎么实现贪吃蛇这个游戏了.好了,废话不多说,我们来看看如何用EasyX库来实现贪吃蛇. 一.准备 工具vc++6 ...
- easyx图形库做贪吃蛇游戏
编程总是对着一个黑窗口,可以说是非常乏味了,于是喵喵就翻出来了以前用easyx图形库做图形界面的贪吃蛇游戏. 不过大家只是当做提高编程的乐趣来学习吧,想进一步做的话可以学习QT,还有其他的框架. 这是 ...
- 互评beta版本 - 探路者【贪吃蛇】
基于NABCD评论,及改进建议 1)N(Need 需求) 开发本软件一方面是为了让80,90后用户重温童年的美好记忆,另一方面也是为了增加对英语学习兴趣较弱.意志力薄弱的中小学生学习英语的兴趣和动力, ...
- 贪吃蛇—C—基于easyx图形库(上):基本控制函数实现 画图程序
自从学了c语言,就一直想做个游戏,今天将之付之行动,第一次写的特别烂,各种bug:就不贴了.今天网上看了好几个贪吃蛇,重新写了一次,做出来的效果还可以. p.s. easyx图形库是为了方便图形学教 ...
- 贪吃蛇(C++实现,VC6.0编译,使用了EasyX图形库)
程序效果: 代码: //main.cpp 1 #include <iostream> #include<fstream> #include <graphics.h> ...
- 贪吃蛇—C—基于easyx图形库(下):从画图程序到贪吃蛇【自带穿墙术】
上节我们用方向控制函数写了个小画图程序,它虽然简单好玩,但我们不应该止步于此.革命尚未成功,同志还需努力. 开始撸代码之前,我们先理清一下思路.和前面画图程序不同,贪吃蛇可以有很多节,可以用一个足够大 ...
- 贪吃蛇游戏(printf输出C语言版本)
这一次我们应用printf输出实现一个经典的小游戏—贪吃蛇,主要难点是小蛇数据如何存储.如何实现转弯的效果.吃到食物后如何增加长度. 1 构造小蛇 首先,在画面中显示一条静止的小蛇.二维数组canva ...
- 用C++实现的贪吃蛇游戏
我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...
随机推荐
- 【带权并查集】【离散化】vijos P1112 小胖的奇偶
每个区间拆成r和l-1两个端点,若之内有偶数个1,则这两个端点对应的前缀的奇偶性必须相同,否则必须相反. 于是可以用带权并查集维护,每个结点储存其与其父节点的奇偶性是否相同,并且在路径压缩以及Unio ...
- bzoj 3728: PA2014Final Zarowki
3728: PA2014Final Zarowki Description 有n个房间和n盏灯,你需要在每个房间里放入一盏灯.每盏灯都有一定功率,每间房间都需要不少于一定功率的灯泡才可以完全照亮.你可 ...
- Uncaught SyntaxError: Invalid shorthand property initializer
$.ajax({ url : '../../collateralQuery/getCollateralQueryDetail', type : 'POST', data : {}, dataType ...
- js 封装的自动创建表格的相关操作
因为要做一个动态输入的表格,现在积累一下资料,在网上找了一些资料,经过总结是使用更加方便些,谁有更好的插件和封装的东西,请大家分享一下. <script type="text/java ...
- jquer总结
前端jq总结 选择器********************************************************************** 1,基本选择 器 #id .clss ...
- javacripr基础总结
js中一切皆为对象 方法=函数 其实也是内建对象 函数都可以用,包括数组,函数 都可以获取 核心dom编程 -- dom d document文档 o 对象 1用户自定义对象, 2内建对象 如Arr ...
- css一些我所不熟练的属性
<hr /> 表示一条横线 css的三种创建方式: 外部样式表 <head> <link rel="stylesheet" type="t ...
- tile xml格式
<map> version: The TMX format version, generally 1.0. orientation: Map orientation. Tiled supp ...
- 提升JavaScript递归效率:Memoization技术详解[转载]
递归是拖慢脚本运行速度的大敌之一,太多的递归会让浏览器变得越来越慢直到死掉或者莫名其妙的突然自动退出.这里我们可以通过memoization技术来替代函数中太多的递归调用,提升JavaScript效率 ...
- unity shader 编译时间过长
去掉opengles2.0能省一半时间 换ssd Compiled shader 'Shader Forge/Scenes_Ground_Standard_M' in 315.51s gles ...