这学期学了图形交互学,三个星期下来,突然意识到已经可以用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版本的更多相关文章

  1. Java实现贪吃蛇游戏【代码】

    花了两个下午写了一个贪吃蛇小游戏,本人想写这游戏很长时间了.作为以前诺基亚手机上的经典游戏,贪吃蛇和俄罗斯方块一样,都曾经在我们的童年给我们带来了很多乐趣.世间万物斗转星移,诺基亚曾经作为手机业的龙头 ...

  2. 基于EasyX库的贪吃蛇游戏——C语言实现

    接触编程有段时间了,一直想学习怎么去写个游戏来练练手.在看了B站上的教学终于可以自己试试怎么实现贪吃蛇这个游戏了.好了,废话不多说,我们来看看如何用EasyX库来实现贪吃蛇. 一.准备 工具vc++6 ...

  3. easyx图形库做贪吃蛇游戏

    编程总是对着一个黑窗口,可以说是非常乏味了,于是喵喵就翻出来了以前用easyx图形库做图形界面的贪吃蛇游戏. 不过大家只是当做提高编程的乐趣来学习吧,想进一步做的话可以学习QT,还有其他的框架. 这是 ...

  4. 互评beta版本 - 探路者【贪吃蛇】

    基于NABCD评论,及改进建议 1)N(Need 需求) 开发本软件一方面是为了让80,90后用户重温童年的美好记忆,另一方面也是为了增加对英语学习兴趣较弱.意志力薄弱的中小学生学习英语的兴趣和动力, ...

  5. 贪吃蛇—C—基于easyx图形库(上):基本控制函数实现 画图程序

    自从学了c语言,就一直想做个游戏,今天将之付之行动,第一次写的特别烂,各种bug:就不贴了.今天网上看了好几个贪吃蛇,重新写了一次,做出来的效果还可以. p.s.  easyx图形库是为了方便图形学教 ...

  6. 贪吃蛇(C++实现,VC6.0编译,使用了EasyX图形库)

    程序效果: 代码: //main.cpp 1 #include <iostream> #include<fstream> #include <graphics.h> ...

  7. 贪吃蛇—C—基于easyx图形库(下):从画图程序到贪吃蛇【自带穿墙术】

    上节我们用方向控制函数写了个小画图程序,它虽然简单好玩,但我们不应该止步于此.革命尚未成功,同志还需努力. 开始撸代码之前,我们先理清一下思路.和前面画图程序不同,贪吃蛇可以有很多节,可以用一个足够大 ...

  8. 贪吃蛇游戏(printf输出C语言版本)

    这一次我们应用printf输出实现一个经典的小游戏—贪吃蛇,主要难点是小蛇数据如何存储.如何实现转弯的效果.吃到食物后如何增加长度. 1 构造小蛇 首先,在画面中显示一条静止的小蛇.二维数组canva ...

  9. 用C++实现的贪吃蛇游戏

    我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...

随机推荐

  1. [CodeForces-759D]Bacterial Melee

    题目大意: 有一串n个字母,每个位置的字母可以同化边上的一个字母, 比如:ab可以变成aa或者bb. 相对的两个同化不能同时发生,比如ab不能变成ba. 现在给你一个字符串,问你经过任意次数的同化过程 ...

  2. 浅析HashMap和Hashtable的区别

    HashMap和Hashtable两个类都实现了Map接口,二者保存键值对(key-value对): HashMap和HashTable区别 第一,继承的父类不同.HashMap继承自Abstract ...

  3. js 数字键盘

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. [转]Spring 中的p标签

    spring的bean配置文件中p:代表什么 <bean id="daoTemplate" abstract="true" lazy-init=" ...

  5. 阿里云ECS使用SSH连接CentOS 6.9经常断线的问题解决:OperationTimedOut

    说明:不一定有效,可以试一下. 设置: vi /etc/ssh/sshd_config #添加或修改以下配置 ClientAliveInterval #每隔多少秒给SSH客户端发送一次信号 Clien ...

  6. 基于tiny4412的Linux内核移植 -- DM9621NP网卡驱动移植(四)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  7. webService 三要素

    WebService(jax-ws)三要素 SOAP: 基于HTTP协议,采用XML格式,用来传递信息的格式. WSDL: 用来描述如何访问具体的服务.(相当于说明书) UDDI: 用户自己可以按UD ...

  8. 一份不太简短的LaTeX教程 lshort – A short in­tro­duc­tion to LATEX 2elshort – A short in­tro­duc­tion to LATEX 2e

    Lshort started as a trans­la­tion and ra­tio­nal­i­sa­tion of a ground-break­ing Ger­man-lan­guage i ...

  9. 如何将你的github仓库部署到github pages(github.io博客)

    详细的git教程:http://www.cnblogs.com/tugenhua0707/p/4050072.html#!comments 作为教程,很重要的一点就是要最大化的傻瓜化,本文将从新建一个 ...

  10. SQL手工注入小结

    第一步先把IE菜单=>工具=>Internet选项=>高级=>显示友好 HTTP 错误信息前面的勾去掉.否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误, ...