这学期学了图形交互学,三个星期下来,突然意识到已经可以用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. 【FFT(母函数)+容斥】BZOJ3771-Triple

    [题目大意] 给出 n个物品,价值为别为Xi且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? *顺序不同算一种 [思路] 显然是个母函数,A表示每种物品取一个的情况,B表示每种物品取二 ...

  2. Java本地方法(native方法)的实现

    Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能. 可以将 ...

  3. Problem C: 调用函数,求a+aa+aaa+....+aa...aa(n个a)

    #include <stdio.h> int fn(int a,int n)//定义函数 { ; ;i<=n;i++) { m=m+a;//当a=3时,m=3,然后a=30,m=33 ...

  4. Educational Codeforces Round 9 F. Magic Matrix 最小生成树

    F. Magic Matrix 题目连接: http://www.codeforces.com/contest/632/problem/F Description You're given a mat ...

  5. CentOS 5/6安装后的必备设置(转)

    说明:转自各大优化方案,相当于是一个大杂烩,后续会搞成是一个Shell脚本简化操作. 1.修改ip地址.网关.主机名.DNS等 (这个操作可以使用Setup工具进行配置,但不建议使用,封装太多,没有配 ...

  6. vscode快捷键-for mac

    默认显示当前所有页面: command p ?: 显示可操作方法 >: 打开命令面板, 同comand shift p : : 跳转到对应行数 @: 搜索并跳转到应变量或函数 @: : 同上,分 ...

  7. VMware 8安装Mac OS X 10.7

    (Windows 7 X64环境下,VMware 8.0正式版)虚拟机首尝MAC OS X 10.7 Lion系统成功,特将此好消息分享.2年了,终于我也装上了Mac,我也成功的尝到了苹果味道,看着那 ...

  8. 三.rocketmq-console

    ⦁    rocketmq-console来源于https://github.com/rocketmq/rocketmq-console 1.配置IP 2.启动运行:出现此信息则表示成功  访问:in ...

  9. gridcontrol表头设置

    点击Run Disigner进入设计界面,设置颜色字体等信息在Appearance分支下面,设置行为功能,显示区域等在Options分支下面.

  10. Android面试,简要介绍一下asynctask和handler的优缺点

    1 )AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以 ...