贪吃蛇(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) 今天在一论坛上看到一人发帖: 『最近遇到一个奇怪的问题,代码中的 ...
随机推荐
- jQ函数after、append、appendTo的区别
1.after函数定义和用法:after() 方法在被选元素后插入指定的内容.参考:http://keleyi.com/a/bjac/cfyxd60g.htm 语法:$(selector).after ...
- CSS选择符详解
一.类型选择符 什么是类型选择符?指以网页中已有的标签类型作为名称的行径符.body是网页中的一个标签类型,div,p,span都是. 如下: body {} div {} p {} span {} ...
- SAP 录屏BDC使用—实例
1) 输入TCode:SHDB进入BDC录制初始界面,该界面可以实现已创建BDC Session信息的查看.删除及锁定等操作 2) 单击工具栏 Newrecording 按钮创建一个新的BDC,系 ...
- DevExpress应用案例--语音识别器Dual Writer
Dual Writer是 一个以语音识别为特色的文档处理器,无需安装其他软件,只需要插入你的麦克风就可以开始录入口述文字.它不仅支持MS Word的DOCX格式,还支持 RTF.ODT.TXT等常见文 ...
- Java虚拟机JVM学习05 类加载器的父委托机制
Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...
- Android Handler机制(二)---MessageQueue源码解析
MessageQueue 1.变量 private final boolean mQuitAllowed;//表示MessageQueue是否允许退出 @SuppressWarnings(" ...
- Android通过PHP服务器实现登录
Android客户端和PHP.MySQL搭建的服务器之间的简单交互,实现登录功能 . 实现原理图: Handler消息机制原理: Handler机制主要包括4个关键对象,分别是Message.Hand ...
- Phonegap 之 iOS银联在线支付(js调用ios端银联支付控件)
Phonegap项目,做支付的时候,当把网站打包到ios或android端成app后,在app上通过wap调用银联在线存在一个问题: 就是当从银联支付成功后,再从服务器返回到app客户端就很难实现. ...
- Android TextView 高亮字体并添加点击事件
运行效果 package com.zutil.lib; import android.graphics.Typeface; import android.os.Bundle; import andro ...
- Java中的static的使用
Java中的static使用之静态变量 神话丿小王子的博客主页 1.Java 中被static修饰的成员称为静态成员或类成员.它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享.且优先于对象 ...