贪吃蛇(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) 今天在一论坛上看到一人发帖: 『最近遇到一个奇怪的问题,代码中的 ...
随机推荐
- 20款风格独特的搜索框 PSD 设计素材免费下载
搜索框是网站中的最常用的组件一直,但有时候,搜索框因为设计不够新颖容易被访客忽视.通过提高一个搜索框的外观设计,最终对整体的网页设计带来好的变化.这份列表将是一个很好的资源,尤其是对设计师.希望你会喜 ...
- JScript中的条件注释详解(转载自网络)
JScript中的条件注释详解-转载 这篇文章主要介绍了JScript中的条件注释详解,本文讲解了@cc_on.@if.@set.@_win32.@_win16.@_mac等条件注释语句及可用于条件编 ...
- HTML动画分类 HTML5动画 SVG库 SVG工具 Canvas动画工具
1.js配合传统css属性控制,可以使用setTimeout或者高级的requestAnimationFrame 2.css3 3.svg 4.canvas(当然,这个还是要配合js) 也许这么 ...
- Day Tip:SharePoint 2013 *.ascx.g.cs文件
在开发SharePoint2013的WebPart时,会产生一个*.ascx.g.cs文件.如果用TFS管理源代码经常遇到这个文件丢失.这让人很困扰,如果丢失了请在如下图中添加如下代码: ...
- Swift获取屏幕快照
// 获取屏幕快照 private func screenShot() -> UIImage{ let window = UIApplication.shared.keyWindow! UIGr ...
- WIFI热点
1.wifi热点是指把手机的接收GPRS.3G或4G信号转化为wifi信号再发出去,这样手机就成了一个WIFI热点. 2.手机必须有无线AP功能,才能当做热点.有些系统自带建热点这个功能比如IOS(比 ...
- linux 系统权限 数字含义
摘抄: sudo chmod XXX dir_name XXX是你要设置的权限代号,第一位代表Owner,第二位代表Group,第三位代表Others XXX中0代表什么都不可以,1代表可执行,2代表 ...
- 【Android】监听Notification被清除
前言 一般非常驻的Notification是可以被用户清除的,如果能监听被清除的事件就可以做一些事情,比如推送重新计数的问题. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www ...
- java反射机制一个例子
import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try ...
- Mac OS 下的解压缩软件——The Unarchiver
The Unarchiver 是 Mac 上最流行的解压软件,免费开源.操作方式与系统自带解压工具 Archive Utility.app 一样,双击自动解压.最爽的一点是把解压后原始文件直接仍进废纸 ...