第二次做动画显示效果的小程序,心血来潮想做下儿时的经典游戏----贪吃蛇。由于时间有限,只是简单地做了基本功能,有时间后再完善更多功能。

由于个人水平有限,可能代码有些地方可以改进。不足之处敬请指出。

注:要运行该代码需要正确配置,连接好ege图形库的头文件,做好准备工作。具体教程请看http://jingyan.baidu.com/article/4b07be3c40d35f48b380f3c7.html

编程环境:codeblocks   windows10  corei5 cpu

源代码:

#include<stdio.h>
#include<graphics.h>
#include<windows.h>
#include<stdlib.h>
#define Random(x) (rand() % x)
struct position
{
int x;int y;
position* next;
};
class snake
{
private:
int direction;
public:
position *tail;
position *head;
position* gettail(){return tail;}
void settail(position* p){tail=p;}
position* gethead(){return head;}
void sethead(position* p){head=p;}
snake()
{
tail=new position;head=new position;
head->x=75;head->y=15;
tail->x=15;tail->y=15;
tail->next=new position;
tail->next->x=45;tail->next->y=15;
tail->next->next=head;
direction=4;
}
void setdirection(int a){direction=a;}
int getdirection(){return direction;}
void move(int x0,int y0,bool &newfood)
{
switch(direction)
{position*p;int xt;int yt;
case 1:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt;head->y=yt-30;p=tail->next;delete tail;tail=p;break;}
case 2:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt;head->y=yt+30;p=tail->next;delete tail;tail=p;break;}
case 3:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt-30;head->y=yt;p=tail->next;delete tail;tail=p;break;}
case 4:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt+30;head->y=yt;p=tail->next;delete tail;tail=p;break;}
}
if(head->x==x0&&head->y==y0)
{
newfood=1;
switch(direction)
{int xt;int yt;
case 1:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt;head->y=yt-30;break;}
case 2:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt;head->y=yt+30;break;}
case 3:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt-30;head->y=yt;break;}
case 4:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt+30;head->y=yt;break;}
}
}
}
void show()
{
position *p=gettail();int sum=0;
while(p!=gethead()->next)
{sum++;
if(head->x>0&&head->x<900&&head->y>0&&head->y<900)
{
setfillcolor(EGERGB(255,0,0));
bar(p->x-15,p->y-15,p->x+15,p->y+15);
setfillcolor(EGERGB(0,0,255));
bar(p->x-13,p->y-13,p->x+13,p->y+13);
p=p->next;
}
else
{
setcolor(EGERGB(255,0,0));
setfontbkcolor(EGERGB(0x80,0x00,0x80));
setfont(100,0,"宋体");
outtextxy(250,360,"GAMEOVER");
if(sum<20)outtextxy(250,460,"菜鸟水平");
if(sum>=20&&sum<40)outtextxy(250,460,"高手水平");
setfont(70,0,"宋体");
if(sum>=40&&sum<60)outtextxy(100,460,"你骨骼精奇,是个奇才");
if(sum>=60)outtextxy(200,360,"你已经成仙了");
Sleep(1000);
getch();
}
int hx,hy;
hx=head->x;hy=head->y;
position *p2=gettail();
while(p2!=gethead())
{
if(hx==p2->x&&hy==p2->y)
{
setcolor(EGERGB(255,0,0));
setfontbkcolor(EGERGB(0x80,0x00,0x80));
setfont(100,0,"宋体");
outtextxy(250,360,"GAMEOVER");
if(sum<20)outtextxy(250,460,"菜鸟水平");
if(sum>=20&&sum<40)outtextxy(250,460,"高手水平");
setfont(70,0,"宋体");
if(sum>=40&&sum<60)outtextxy(100,460,"你骨骼精奇,是个奇才");
if(sum>=60)outtextxy(200,360,"你已经成仙了");
Sleep(1000);
getch();
}
p2=p2->next;
}
}
}
};
int main()
{
INITGRAPH(900,900);
setfillcolor(EGERGB(255,0,0));
snake s1;
char k;
bool newfood=1;
for(;;)
{
delay_fps(8);
int fx;int fy;
if(newfood)
{
//下面的代码是食物的显示
L:fx=Random(30)+1;fy=Random(30)+1;//贪吃蛇的食物产生位置是随机的
fx=fx*30-15;fy=fy*30-15;
bool bo=1;
position *p=s1.gettail();
while(p!=s1.gethead()->next)
{
if(p->x==fx&&p->y==fy){bo=0;break;}//食物不能产生在蛇身体的位置;
p=p->next;
}
if(!bo)goto L;
newfood=0;
}
//手动模式:
if(kbhit())
{k=getch();
switch(k)
{
case 38:if(s1.getdirection()!=2)s1.setdirection(1);break;//根据键值修改对应的方向
case 40:if(s1.getdirection()!=1)s1.setdirection(2);break;
case 37:if(s1.getdirection()!=4)s1.setdirection(3);break;
case 39:if(s1.getdirection()!=3)s1.setdirection(4);break;
}
}
s1.move(fx,fy,newfood);
cleardevice();
s1.show();
setfillcolor(EGERGB(0,0,255));
bar(fx-15,fy-15,fx+15,fy+15);
setfillcolor(EGERGB(0,255,0));
bar(fx-15,fy-15,fx+15,fy+15);
//Sleep(80);
}
}

运行效果截图:

ege图形库之简单贪吃蛇(c++)的更多相关文章

  1. 用OpenGL简单编写的一个最简单贪吃蛇游戏

    刚学OpenGL的时候,写的一个最简单的贪吃蛇游戏代码 如下: //贪吃蛇游戏 #include<stdio.h> #include<stdlib.h> #include< ...

  2. java 简单贪吃蛇

    1. [代码]java 简单程序     跳至 [1] [全屏预览]package com.snake;import java.awt.*;import javax.swing.*;import ja ...

  3. Python实例:贪吃蛇(简单贪吃蛇编写)🐍

    d=====( ̄▽ ̄*)b 叮~ Python -- 简易贪吃蛇实现 目录: 1.基本原理 2.需要学习的库 3.代码实现 1.基本原理 基本贪吃蛇所需要的东西其实很少,只需要有一块让蛇动的屏幕, 在 ...

  4. python版本的简单贪吃蛇

    先看看效果,白色的条是蛇(简单勿怪,有研究的同学请告知做的美观点),做了一个笑脸是糖果,背景弄了一个图, 代码也是从其他人那边弄来的,改了一部分直接可以在window上直接运行 代码如下: #codi ...

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

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

  6. 一个简单的c# 贪吃蛇程序

    一个简单的c#贪吃蛇程序 程序分为界面设计和程序设计:界面设计和程序设计均参考了一些游戏实例,但是所有代码内容是本人编写. 由于看到别人写的程序并没有署名,这里的署名全部都是csdn官网. 游戏界面设 ...

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

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

  8. 做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)

    最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类似的情况,白天一直想不通的问题,晚上做梦有时会想到更好的版本,于是 ...

  9. 使用TypeScript实现简单的HTML5贪吃蛇游戏

    TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架构师,已 ...

随机推荐

  1. Kernel--试题

    1. 内核堆栈区别: 1.栈自动分配回收,函数里面声明的变量:2.堆:malloc kmalloc申请的空间,需要自己释放 https://blog.csdn.net/tainjau/article/ ...

  2. LRU算法简介

    LRU是什么? 按照英文的直接原义就是Least Recently Used,最近最久未使用法,它是按照一个非常注明的计算机操作系统基础理论得来的:最近使用的页面数据会在未来一段时期内仍然被使用,已经 ...

  3. 解决 Oracle TNSListener 服务启动找不到路径问题

    TNSListener服务无法启动,提示从系统无法找到指定路径! 解决方法: 在控制面板/管理工具/服务中双击打开OracleOraHome92TNSListener的服务看到其 “可执行文件的路径” ...

  4. 公共的强制保留两位小数的js方法

    强制保留两位小数的js方法 //写一个公共的强制保留两位小数的js方法 function toDecimal2 (x) { var f = parseFloat(x) if (isNaN(f)) { ...

  5. 使用webform、websevice来进行ajax请求操作

    通过使用webform(asp.net非mvc) .webservice 作为请求接口在前台发送ajax请求:1.前台代码: $.ajax({ type: "POST", //方法 ...

  6. 解决 VS Code「Code Runner」插件运行 python 时的中文乱码问题

    描述 这里整理了两种 VS Code「Code Runner」插件运行 python 时乱码的解决方案.至于设置「Auto Guess Encoding」为 true 的操作这里就不多描述了. 乱码截 ...

  7. react import 配置路径别名'@',简化import Component的方式

    摘要 在react中,大多数业务逻辑都组件化:极大的减轻了代码的冗余度,如果组件的层次比较深的话,组件的import就比较费劲,在import时使用“../../components/test”的方式 ...

  8. MUI 支付案例(支付宝/微信)

    首先说明一下,本文借鉴了多位博主的文章,所以会看到很多一样的代码. 写这篇博客主要目的是为了便于后期查看(不好之处,敬请留言吐槽),案例经本人测试,是可以使用的. 先上效果图 前端HTML代码: &l ...

  9. ORACLE数据库 自动备份 定时计划任务 windows

    疑问为什么没有输入oracle 的数据库安装目录就能直接备份呢,可能是因为oracle默认安装c盘,在docs命令直接能操作吧,不信可以使用sqlplus试试. 一共分三步: 一.建立一个.bat 批 ...

  10. SSISDB8:查看SSISDB记录Package执行的消息

    在执行Package时,SSISDB都会创建唯一的OperationID 和 ExecutionID,标识对package执行的操作和执行实例(Execution Instance),并记录opera ...