这学期学了图形交互学,三个星期下来,突然意识到已经可以用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. [ARC062F]Painting Graphs with AtCoDeer

    题意:一个无向图,用$k$种不同的颜色给每条边染色,问能染出多少种不同的图,如果两张图能通过循环移位环边使得颜色相同,那么这两张图被认为是相同的 数学太差伤不起啊...补了一下Burnside定理的证 ...

  2. 【最小割】【Dinic】Gym - 101201G - Maximum Islands

    题意:方格内有些位置是水域,有些位置是陆地,有些位置是被云彩遮挡住了:让你自己规定被云彩遮挡住的地方是陆地还是水域,使得陆地个数最多.(均为四连通块) 显然与陆地邻接的云彩填成水比较优.其他云彩格子填 ...

  3. 中间件和auth模块

    中间件 1.什么是中间件 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用 ...

  4. Vue实例与渲染

    1 Vue框架 1.1 vue与jQuery区别 jQuery仍然是操作DOM的思想,jQuery主要用来写页面特效 Vue是前端框架(MVVM),对项目进行分层.处理数据 1.2 前端框架 angu ...

  5. Ubuntu 16.04修改MAC地址以及网络常用设置(IP/DNS/网关)

    1.先停止桌面版自带的NetworkManager,这东西很难用,且有些设置需要重启. sudo systemctl stop NetworkManager.service sudo systemct ...

  6. BlackBerry10 开发环境搭建

    最近开始学习BlackBerry10的开发,黑莓10系统是2013年1月30日黑莓公司正式发布的,目前网上资料比较少,这篇博客的内容基本上是按照官网上的文档写的.BlackBerry10目前支持C/C ...

  7. Arch linux

    这里将介绍Arch Linux使用问题的解决方法,在这里拿出来和大家分享一下Linux目前较适用于小型的网络,Arch Linux 是个针对 i686i686/x86-64 优化的 Linux 发行版 ...

  8. iOS 在某一个ViewController跳转到TabViewController中的某一个ViewController

    要做到这个分为两步 第一步, 导入app #import "AppDelegate.h" 第二步, 监听方法中先写加入以下代码: [self dismissViewControll ...

  9. jquer回显选中select下拉框

    公司使用的框架比较旧,没有使用el等表达式. <% String context = request.getContextPath(); String index = (String)reque ...

  10. latex 三个不同的图放在一行且每个图都有注释

    \begin{figure}[htbp] \begin{minipage}[t]{0.3\linewidth} \centering \includegraphics[width=.2.0.eps} ...