贪吃蛇(C++实现,VC6.0编译,使用了EasyX图形库)
程序效果:
代码:
//main.cpp
1 #include <iostream>
#include<fstream>
#include <graphics.h>
#include <conio.h>
#include<ctime>
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"Winmm.lib") #define IMGWIDTH 20
#define IMGHEIGHT 20
#define WIDTH 1100
#define HEIGHT 650
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
#define HEADUP "headup.jpg"
#define HEADDOWN "headdown.jpg"
#define HEADLEFT "headleft.jpg"
#define HEADRIGHT "headright.jpg"
#define BODYLR "bodylr.jpg"
#define BODYUD "bodyud.jpg"
#define TAILL "taill.jpg"
#define TAILR "tailr.jpg"
#define TAILU "tailu.jpg"
#define TAILD "taild.jpg"
#define WALL "wall.jpg"
#define FOOD "food.jpg"
#define GAMEOVER "gameover.jpg"
#define SNAKE "snake.jpg"
#define L 60 //左
#define U 80 //上
#define R 900 //右
#define D 600 //下
using namespace std; IMAGE wallimg;
int score=,grade=,rec[];
class Food;
class BodyNode{
private:
IMAGE img;
int x;
int y;
BodyNode* next;
BodyNode(){}
friend class Body;
friend bool check(Body& snake,Food& food);
public:
BodyNode(char* str,int X,int Y){
x=X;
y=Y;
loadimage(&img, _T(str));
next=NULL;
}
BodyNode(BodyNode& bodynode){
x=bodynode.x;
y=bodynode.y;
next=bodynode.next;
img=bodynode.img;
}
};
class Body{
private:
BodyNode* head;
BodyNode* tail;
int length;
public:
friend bool check(Body& snake,Food& food);
Body(){
head=new BodyNode(HEADRIGHT,L+(*(IMGWIDTH)),U+(*(IMGHEIGHT)));
head->next=new BodyNode(BODYLR,head->x-head->img.getwidth(),head->y);
head->next->next=new BodyNode(TAILR,head->next->x-head->img.getwidth(),head->y);
tail=head->next->next;
length=;
}
int Length(){return length;}
bool IsDead(){
BodyNode* p=head->next;
while(p!=NULL){
if(head->x==p->x&&head->y==p->y){
return true;
}
p=p->next;
}
return false;
}
int Move(int dir){ //1 上 2下 3左 4 右
BodyNode* p=head->next;
int tempx=head->x,tempy=head->y,temp_x,temp_y;
while(p!=tail->next){
temp_x=p->x;
temp_y=p->y;
p->x=tempx;;
p->y=tempy;
tempx=temp_x;
tempy=temp_y;
p=p->next;
}
if(dir==){
loadimage(&(head->img), _T(HEADUP));
head->y=head->next->y-head->img.getheight();
}
if(dir==){
loadimage(&(head->img), _T(HEADDOWN));
head->y=head->next->y+head->img.getheight();
}
if(dir==){
loadimage(&(head->img), _T(HEADLEFT));
head->x=head->next->x-head->img.getwidth();
}
if(dir==){
loadimage(&(head->img), _T(HEADRIGHT));
head->x=head->next->x+head->img.getwidth();
}
if((head->x+head->img.getwidth())>R){head->x=L;}
if(head->x<L){head->x=R-head->img.getwidth();}
if((head->y+head->img.getheight())>D){head->y=U;}
if(head->y<U){head->y=D-head->img.getheight();}
p=head;
while(p->next!=tail){
p=p->next;
}
if(p->x-tail->x>){loadimage(&(tail->img), _T(TAILR));}
if(p->x-tail->x<){loadimage(&(tail->img), _T(TAILL));}
if(p->y-tail->y>){loadimage(&(tail->img), _T(TAILD));}
if(p->y-tail->y<){loadimage(&(tail->img), _T(TAILU));}
return ;
}
int Grow(){
BodyNode*p=head;
while(p->next!=tail){
p=p->next;
}
tail->img=p->img;
tail->next=new BodyNode(&(TAILL[]),tail->x-(p->x-tail->x),tail->y-(p->y-tail->y)); tail=tail->next;
if(p->x-tail->x>){loadimage(&(tail->img), _T(TAILR));}
if(p->x-tail->x<){loadimage(&(tail->img), _T(TAILL));}
if(p->y-tail->y>){loadimage(&(tail->img), _T(TAILD));}
if(p->y-tail->y<){loadimage(&(tail->img), _T(TAILU));}
tail->next=NULL;
length++;
return ;
}
int Show(){
BodyNode* p=head;
while(p!=NULL){
putimage(p->x, p->y, &(p->img));
p=p->next;
}
return ;
}
};
class Food{
private:
int x;
int y;
IMAGE rat;
public:
friend bool check(Body& snake,Food& food);
Food(){
x=;
y=;
loadimage(&(rat), _T(FOOD));
}
int givefood(Body& snake){
srand((unsigned)time());
while(check(snake,*this)==true){
x=;y=;
while(!(x>L&&y>U)){
x= rand()%;
y= rand()%;
}
x=x-(x%);
y=y-(y%);
}
return ;
}
int Show(){
putimage(x,y,&(rat));
return ;
}
};
int showgame(Body& snake,Food food){ cleardevice();
BeginBatchDraw();
setbkcolor(RGB(,,)); //设置背景色
setcolor(YELLOW); //设置绘图色
outtextxy((WIDTH/)-, , "贪吃蛇");
outtextxy(L+, U-IMGHEIGHT-, "按空格 暂停");
outtextxy(R+IMGWIDTH+, U+IMGHEIGHT+, "最高记录:");
char rec1[];//,rec2[10],rec3[10];
for(int index=;index<=;index++){
sprintf(rec1, "%d",rec[index]);
outtextxy(R+IMGWIDTH+, U+IMGHEIGHT++(index+)*, rec1);
}
int i,j;
for(i=L-IMGWIDTH;i<=R;i=i+IMGWIDTH){
j=U-IMGHEIGHT;
putimage(i,j,&(wallimg));
}
for(j=U;j<=D;j=j+IMGHEIGHT){
i=L-IMGWIDTH;
putimage(i,j,&(wallimg));
}
for(j=U;j<=D;j=j+IMGHEIGHT){
i=R;
putimage(i,j,&(wallimg));
}
for(i=L-IMGWIDTH;i<=R;i=i+IMGWIDTH){
j=D;
putimage(i,j,&(wallimg));
}
outtextxy(L-, U-IMGHEIGHT-, "得分:");
char s[];
sprintf(s, "%d",score);
outtextxy(L+, U-IMGHEIGHT-, s);
outtextxy(L+, U-IMGHEIGHT-, "长度:");
char l[];
sprintf(l, "%d",snake.Length());
outtextxy(L+, U-IMGHEIGHT-, l); snake.Show(); food.Show();
FlushBatchDraw();
Sleep(*grade); return ;
}
bool check(Body& snake,Food& food){
BodyNode* pl=snake.head;
bool flag=false;
while(pl!=snake.tail->next){ if((pl->x==food.x)&&(pl->y==food.y)){flag=true;break;} pl=pl->next;
}
return flag;
}
DWORD WINAPI Fun1Proc(LPVOID IpParameter)
{
mciSendString("play yeah.mp3 repeat", NULL, , NULL);//播放
return ;
}
int menu(){
//cleardevice();
outtextxy((WIDTH/)-, , "贪吃蛇");
outtextxy((WIDTH/)-, , "按↑和↓选择难度");
outtextxy((WIDTH/)-, , "按空格键确定选择");
return ;
}
int record(){
fstream f1("record.txt"); //打开文件,若文件不存在就创建它
if(!f1) return -;
//int a=0,b=0,c=0;
f1>>rec[]>>rec[]>>rec[]; f1.close();
return ;
}
int saverecord(){
system("del record.txt ");
ofstream f1("record.txt"); //打开文件,若文件不存在就创建它
if(!f1) return -;
int flag=;
int temp;
rec[]=score;
while(flag==){
flag=;
for(int i=;i<=;i++){
if(rec[i]<rec[i+]){
flag=;
temp=rec[i];
rec[i]=rec[i+];
rec[i+]=temp;
}
}
} f1<<rec[]<<"\n"<<rec[]<<"\n"<<rec[]; f1.close();
if(score!=rec[]){
settextstyle(, , _T("宋体"));
outtextxy(WIDTH/-(*),U+, "恭喜你创造了新纪录!");
}
return ;
}
int main(){
for(int i=;i<=;i++){
rec[i]=;
}
record();
IMAGE snakeimg; HANDLE hThread1;
hThread1 = CreateThread(NULL,,Fun1Proc,NULL,,NULL);
char key;
int movekey=;
int movekeyold=movekey;
initgraph(WIDTH,HEIGHT);
char temp=,choose;
while(temp!=' '){
cleardevice();
if(kbhit()){
choose=getch();
fflush(stdin);
switch(choose){
case UP:{
grade++;
};break;
case DOWN:{
grade--;
};
}
}
if(grade==){grade=;}
if(grade==){grade=;}
outtextxy(,,"简单");
outtextxy(,,"中等");
outtextxy(,,"难");
// cleardevice();
menu();
outtextxy(,,"请选择难度:");
if(grade==){
outtextxy(,,"→");
}
if(grade==){
outtextxy(,,"→");
}
if(grade==){
outtextxy(,,"→");
}
temp=getch();
}
loadimage(&(wallimg), _T(WALL));
Body snake;
Food food;
showgame(snake,food);
while(snake.IsDead()==false){
while(snake.IsDead()==false&&(!kbhit())){ if(movekey==&&movekeyold==||movekey==&&movekeyold==||movekey==&&movekeyold==||movekey==&&movekeyold==){
movekey=movekeyold;}
movekeyold=movekey;
snake.Move(movekey);
showgame(snake,food);
if(check(snake,food)==true){
mciSendString("play yeah.wav", NULL, , NULL);//播放
cout<<'\a';
score+=;
food.givefood(snake);
snake.Grow();
snake.Grow();
snake.Grow();
}
}
if(kbhit()){
key=getch();
switch(key){
case UP:{movekey=;
};break;
case DOWN:{movekey=;
};break;
case LEFT:{movekey=;
};break;
case RIGHT:{movekey=;
};break;
case ' ':{int t=;
while(t==){
if(kbhit()){
key=getch();
if(key==' '){
t=;
}
}
}
};
}
}
}
CloseHandle(hThread1);
BeginBatchDraw();
showgame(snake,food);
IMAGE gameoverimg;
loadimage(&(gameoverimg), _T(GAMEOVER));
putimage(WIDTH/-(gameoverimg.getwidth()/),HEIGHT/-(gameoverimg.getheight()/),&(gameoverimg)); saverecord();
FlushBatchDraw();
while()
{
Sleep();
}
saverecord();
return ;
}
素材:
wall.jpg
tailu.jpg
tailr.jpg
taill.jpg
taild.jpg
headup.jpg
headright.jpg
headleft.jpg
headdown.jpg
food.jpg
bodylr.jpg
gameover.jpg
record.txt 内容:
yeah.mp3 :游戏背景音乐。
yeah.wav :蛇吃到食物时的哔声。
程序写于大二上学期。
2016.4.12更新博客。
END
贪吃蛇(C++实现,VC6.0编译,使用了EasyX图形库)的更多相关文章
- 校园导游系统(C++实现,VC6.0编译,使用EasyX图形库)
运行效果: 说明: 由于当年还不会使用多线程,所以很多获取用户点击的地方都是使用循环实现的...CPU占用率会比较高. 代码: //校园导游系统.cpp 1 #include <graphics ...
- VC6.0编译boost
今天学习了下VC6.0下boost的编译,只是对regex进行了编译,据说全部编译需要2个多小时,在此记录下学习过程中遇到的问题以便今后查看. 最开始直接从网上(www.boost.org)下载了当前 ...
- 比特币初始版本VC6.0编译
1 源码下载 github上初始版本是bitcoin-0.1.5,可以从https://github.com/bitcoin/bitcoin下载,但是从网上可以找到更老版本bitcoin-0.1.0, ...
- 让VC6.0编译出来的程序支持XP样式或XP风格
(1)VC6.0编译出来的win32程序不支持winxp样式的原因:微软WINXP系统更新了Comctl32.dll(ver 6.0)这个“XP风格”的控件.为了保留传统的Windows界面风格,特地 ...
- VC6.0编译DLL,使用VS2010调用问题及解决方法
1.做驱动的时候.做应用程序须要和驱动通信,必须建立一个DLL. 2.由于客户使用版本号太低,须要使用到VC6.0编写DLL 3.在VC6.0上编写DLL的时候,导出的函数名会出现和原函数名不正确,导 ...
- Berkeley DB (VC6.0 编译环境配置)
操作系统:winxp VC环境:VC6.0 必需文件:Berkeley DB安装文件(db-.msi) 下载地址:http://www.oracle.com/technology/software/p ...
- pcre7.0在vc6.0编译
(0)从http://gnuwin32.sourceforge.net/packages/pcre.htm (pcre windows)下下载最新的windows平台源代码pcre-7.0-src. ...
- VC6.0 编译 gdlib 库
环境 WinXP, MSVC6.0 1 从 https://bitbucket.org/libgd/gd-libgd/downloads 下载最新版本 libgd 2 可以用 nmake 编译 w ...
- 使用VC6.0编译C++代码的时候报错:fatal error C1071: unexpected end of file found in comment(Mark ZZ)
fatal error C1071: unexpected end of file found in comment(Mark ZZ) 今天在一论坛上看到一人发帖: 『最近遇到一个奇怪的问题,代码中的 ...
随机推荐
- SyBase Powerdesigner生成数据库详细表
工具: Sybase PowerDesigner 15.1 Microsoft SQL Server 2005 第一步概要设计: 打开PowerDesigner软件,设计“概念数据模型”(Concep ...
- SQLServer表内自关联级联删除
今天处理SQLServer级联删除遇到了很蛋疼的事. SQLServer 不支持表内自关联级联删除,而MySql和Oracle却支持. 貌似原因是SQLServer 会产生循环级联,就不给这样弄.所以 ...
- IOS中限制TextField中输入的类型以及长度
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementSt ...
- iOS 全局断点崩溃
设置全局断点出现奔溃,可以点击继续运行不影响程序,不是程序的问题,webview和自定义xib View使用的时候
- UI控件闪灯
做出点一个控件然后他和他上下左右的4个控件一起变色. #import "ViewController.h" @interface ViewController () @end @i ...
- 禁止uiscrollview垂直方向滚动,只允许水平方向滚动;或只允许垂直方向滚动
禁止UIScrollView垂直方向滚动,只允许水平方向滚动 scrollview.contentSize = CGSizeMake(你要的长度, 0); 禁止UIScrollView水平方向滚动, ...
- EMC Documentum DQL整理(一)
1.Get user SELECT * FROM dm_user WHERE r_is_group = 0 2.Get Group SELECT * FROM dm_group WHERE gro ...
- 3、软件评测师要阅读的书籍 - IT软件人员书籍系列文章
软件评测师在项目组的作用也是非常大的.微软的做法是一个软件工程师搭配两个软件评测师,这样能够减少软件系统存在的问题.但是,笔者发现,软件评测在这些年的发展还是比较缓慢的,除了人力进行的测试外,就是软件 ...
- openstack新建虚机、网络、路由时候对应的ovs网桥的变化
[root@wb5 ~]# [root@wb5 ~]# [root@wb5 ~]# [root@wb5 ~]# [root@wb5 ~]# [root@wb5 ~]# [root@wb5 ~]# [r ...
- What every programmer should know about memory 笔记
What every programmer should know about memory, Part 1(笔记) 每个程序员都应该了解的内存知识[第一部分] 2.商用硬件现状 现在硬件的 ...