贪吃蛇C语言图形化编程.docx
- 文档编号:3758943
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:17
- 大小:19.71KB
贪吃蛇C语言图形化编程.docx
《贪吃蛇C语言图形化编程.docx》由会员分享,可在线阅读,更多相关《贪吃蛇C语言图形化编程.docx(17页珍藏版)》请在冰豆网上搜索。
贪吃蛇C语言图形化编程
////////////////////////////////////////////
//程序名称:
贪吃蛇
//编译环境:
VisualC++6.0/2010,EasyX_2011惊蛰版
//程序编写:
轻雨漫步<512655756@>
//最后更新:
2011-3-11
//
////////////////////////////////////////////
//开始编写游戏需要的类
////////////////////////////////////////////
#include
#include
#include
#include
#defineUP1
#defineDOWN2
#defineLEFT3
#defineRIGHT4
////////////////////////////////////////////
//格子类,定义一个格子的属性及行为
////////////////////////////////////////////
classCell
{
public:
friendclassGameArea;//设置友元函数
voidsetxy(shortx,shorty)//设置格子左上角坐标
{
m_x=x,m_y=y;
}
voidsetfull(shortfull)//设置格子属性,0为空,1为障碍,2为食物
{
m_full=full;
}
voiddisplay(COLORREFcolor)//设置格子颜色并显示
{
m_color=color;
setfillstyle(m_color);
bar(m_x,m_y,m_x+7,m_y+7);
}
voidLaserDisplay()//显示镭射状态的格子
{
IMAGEimage(10,10);
SetWorkingImage(&image);
DWORD*pMem=GetImageBuffer(&image);
for(inti=0;i<10*10;i++)
pMem[i]=BGR(RGB(0,0,i*256/(10*10)));
SetWorkingImage(NULL);
putimage(m_x,m_y,&image);
}
shortReturnFull()//返回格子状态
{
returnm_full;
}
Cell()//构造函数
{
m_x=0,m_y=0,m_full=0;
m_color=BLACK;
}
private:
shortm_x;//格子的左上角X坐标
shortm_y;//格子的左上角Y坐标
shortm_full;//0为空,1为阻挡,2为食物
COLORREFm_color;//格子颜色
};
////////////////////////////////////////////
//游戏区类,编写有关游戏区的一些操作
////////////////////////////////////////////
classGameArea//游戏区域
{
public:
Cellm_game[60][60];//定义游戏区域(由360个格子组成)
friendvoidMessageDispose();//设置友元函数
boolCreatFood()//产生随机食物
{
srand(time(NULL));//初始化随机数种子
m_random1=rand()%58+1;//随机生成一个0-58的整数
m_random2=rand()%58+1;//随机一个0-58的整数
if(m_game[m_random2][m_random2].m_full==0)//检查生成的食物坐标是否在障碍上
{
m_game[m_random1][m_random2].display(GREEN);
m_game[m_random1][m_random2].m_full=2;
returntrue;
}
//如果随机的食物正好出现在蛇身上,则进入下面的循环寻找可以生成食物的地方
for(m_random1=1;m_random1<59;m_random1++)
{
for(m_random2=1;m_random2<59;m_random2++)
{
if(m_game[m_random2][m_random2].m_full==0)
{
m_game[m_random1][m_random2].display(GREEN);
m_game[m_random1][m_random2].m_full=2;
returntrue;
}
}
}
//如果没有找到可以生成食物的地方,则通关
returnfalse;//返回false即表示通关
}
voidDelFood()//删除食物
{
m_game[m_random1][m_random2].m_full=0;//设置为0即代表格子属性为空
}
voidChangeColor(intflag1,intflag2,COLORREFcolor)//设置指定格子的颜色
{
m_game[flag1][flag2].display(color);
}
voidInit()//初始化GAME区域
{
intflag1,flag2;//标识变量
BeginBatchDraw();//开始批量绘图
setfillstyle(BLACK);//设置当前颜色
bar(0,0,600,600);//画无边框填充矩形(在这里的用途是用黑色清空游戏区域)
for(flag1=0;flag1<60;flag1++)
{
for(flag2=0;flag2<60;flag2++)
{
if(flag1==0||flag1==59||flag2==0||flag2==59)//创建边界
{
m_game[flag1][flag2].setfull
(1);
m_game[flag1][flag2].setxy(flag1*10,flag2*10);
m_game[flag1][flag2].display(RGB(237,28,36));
}
else//创建游戏区域
{
m_game[flag1][flag2].setfull(0);
m_game[flag1][flag2].setxy(flag1*10,flag2*10);
m_game[flag1][flag2].display(BLACK);
}
}
}
CreatFood();
EndBatchDraw();
}
private:
intm_random1,m_random2;
};
////////////////////////////////////////////
//蛇类,定义蛇的数据结构以及蛇的行为
////////////////////////////////////////////
classSnake
{
public:
inttoward;//蛇头朝向
friendvoidMessageDispose();
friendintHitDetect();
friendvoidReInit();
Snake()
{
head=NULL;
last=NULL;
now=NULL;
}
voidInit()//初始化蛇的结构
{
if(head!
=NULL)//重玩游戏时,释放原先的链表所有结点
{
for(now=head->next;now->next!
=NULL;now=now->next)
{
free(now->prior);
}
}
head=(structnode*)malloc(sizeof(structnode));//为蛇头分配内存
head->prior=NULL;
head->m_x=300;
head->m_y=300;
now=(structnode*)malloc(sizeof(structnode));
head->next=now;
now->prior=head;
now->next=NULL;
now->m_x=300;
now->m_y=290;
last=now;
toward=DOWN;
}
voidSnakeAdd()
{
now=head;//当前指向蛇头
now->prior=(structnode*)malloc(sizeof(structnode));//为新增的结点分配内存
now=now->prior;//让当前指向新分配的结点
now->prior=NULL;//置空当前结点的前趋
now->next=head;//让当前结点的后继指向蛇头
switch(toward)//根据当前蛇头方向确定新增部分的坐标
{
caseUP:
now->m_x=head->m_x;
now->m_y=head->m_y-10;
break;
caseDOWN:
now->m_x=head->m_x;
now->m_y=head->m_y+10;
break;
caseLEFT:
now->m_x=head->m_x-10;
now->m_y=head->m_y;
break;
caseRIGHT:
now->m_x=head->m_x+10;
now->m_y=head->m_y;
break;
}
head=now;//设置当前结点为蛇头
}
voidSnakeDel()//释放蛇尾结点(删除蛇尾)
{
last=last->prior;
free(last->next);
last->next=NULL;
}
voidSnakeMove()//蛇身移动一格
{
SnakeAdd();//增加蛇头
SnakeDel();//删除蛇尾
}
private:
structnode//蛇身链表
{
intm_x;
intm_y;
structnode*next;//下个结点
structnode*prior;//上个结点
};
structnode*head;
structnode*last;
structnode*now;
};
////////////////////////////////////////////
//游戏类,用来初始化游戏的参数,及实现其他游戏操作
////////////////////////////////////////////
classGame
{
public:
voidInit()
{
closegraph();
initgraph(800,600);
setbkmode(TRANSPARENT);//设置输出文字背景为透明
LOGFONTf;
getfont(&f);//获取当前字体设置
f.lfHeight=50;//设置字体高度为48(包含行距)
_tcscpy(f.lfFaceName,_T("黑体"));//设置字体为“黑体”
f.lfQuality=ANTIALIASED_QUALITY;//设置输出效果为抗锯齿
setfont(&f);//设置字体样式
}
voidFailGame()//游戏失败显示的画面
{
setcolor(RED);
setfont(70,0,_T("微软雅黑"));
outtextxy(150,265,_T("YOULOSE!
"));
}
voidWinGame()//游戏胜利时显示的画面
{
setcolor(RED);
setfont(70,0,_T("微软雅黑"));
outtextxy(150,265,_T("YOUWIN!
"));
FlushBatchDraw();
Sleep(10000);
exit(0);
}
};
////////////////////////////////////////////
//管理区类,定义管理区域的相关操作
////////////////////////////////////////////
classManageArea
{
public:
friendvoidMessageDispose();
voidTimeAdd(doubleadd)//增加时间(可在类外直接调用实现动态刷新时间)
{
m_time+=add;
DisplayTime();
}
voidScoreAdd(shortadd)//增加分数(可在类外直接调用实现动态刷新分数)
{
m_score+=add;
DisplayScore();
}
voidDisplayPause()//显示暂停或者开始
{
BeginBatchDraw();
_stprintf(m_str_score,_T("%d"),m_score);
setfont(25,0,_T("微软雅黑"));
setcolor(BLUE);
if(m_pause)
outtextxy(625,490,_T("开始(P键)"));
else
outtextxy(625,490,_T("暂停(P键)"));
EndBatchDraw();
}
voidInit()//初始化管理界面
{
m_time=0.0;
m_score=0;
m_pause=false;
_stprintf(m_str_score,_T("%d"),m_score);//格式化转换类型
_stprintf(m_str_time,_T("%.1lf"),m_time);
m_bgcolor=BLACK;
BeginBatchDraw();
setfillstyle(BLACK);
bar(601,0,800,600);
setfont(60,0,_T("微软雅黑"));
setcolor(GREEN);
outtextxy(625,30,_T("贪吃蛇"));
setfont(30,0,_T("微软雅黑"));
setcolor(RGB(128,0,255));
outtextxy(625,140,_T("制作:
初恋年代"));
setfont(25,0,_T("微软雅黑"));
setcolor(BLUE);
outtextxy(625,390,_T("时间:
"));
outtextxy(625,420,_T("分数:
"));
outtextxy(625,460,_T("暂停(P键)"));
outtextxy(625,490,_T("重新游戏(R键)"));
outtextxy(625,520,_T("直接退出(ESC键)"));
setcolor(RED);
outtextxy(680,420,m_str_score);
outtextxy(680,390,m_str_time);
EndBatchDraw();
}
voidDisplayTime()//显示当前耗时
{
BeginBatchDraw();
_stprintf(m_str_time,_T("%.1lf"),m_time);
setfont(25,0,_T("微软雅黑"));
setfillstyle(m_bgcolor);
bar(680,390,800,415);
setcolor(RED);
outtextxy(680,390,m_str_time);
EndBatchDraw();
}
voidDisplayScore()//显示当前分数
{
BeginBatchDraw();
_stprintf(m_str_score,_T("%d"),m_score);
setfont(25,0,_T("微软雅黑"));
setfillstyle(m_bgcolor);
bar(680,420,800,445);
setcolor(RED);
outtextxy(680,420,m_str_score);
EndBatchDraw();
}
private:
doublem_time;
shortm_score;
boolm_pause;
TCHARm_str_leave[2],m_str_time[33],m_str_score[5];
COLORREFm_bgcolor;
};
////////////////////////////////////////////
//声明游戏需要的类
////////////////////////////////////////////
Gamegame;//用于初始化游戏、设置游戏相关参数
GameAreaa;//用于初始化游戏区域,设置,改变游戏区域相关参数
ManageAreamanager;//用于初始化管理区域,设置管理区相关参数
Snakes;//用于初始化蛇,数据化蛇,操作蛇
////////////////////////////////////////////
//游戏的消息控制,流程控制函数
////////////////////////////////////////////
voidMessageDispose()//消息处理函数
{
charc;
s.now=NULL;
boolKeepdown=false;
while(true)
{
Keepdown=false;//是否持续按WASD中的一个按键
if(kbhit())
{
switch(c=getch())//处理按键消息(WASD)
{
case'w':
case'W':
if(s.toward==UP)Keepdown=true;
elseif(s.toward!
=DOWN&&s.toward!
=UP)s.toward=UP;
break;
case's':
case'S':
if(s.toward==DOWN)Keepdown=true;
elseif(s.toward!
=UP&&s.toward!
=DOWN)s.toward=DOWN;
break;
case'a':
case'A':
if(s.toward==LEFT)Keepdown=true;
elseif(s.toward!
=RIGHT&&s.toward!
=LEFT)s.toward=LEFT;
break;
case'd':
case'D':
if(s.toward==RIGHT)Keepdown=true;
elseif(s.toward!
=LEFT&&s.toward!
=RIGHT)s.toward=RIGHT;
break;
case27:
closegraph();
exit(0);
case'p':
case'P':
manager.m_pause=!
manager.m_pause;//设置暂停或开始
manager.DisplayPause();//显示暂停或开始
break;
case'r':
case'R':
ReInit();
break;
}
}
if(true==manager.m_pause)//如果暂停,直接进行下次循环
{
continue;
}
BeginBatchDraw();
switch(a.m_game[s.head->m_x/10][s.head->m_y/10].ReturnFull())//检测蛇头遇到的情况
{
case2:
//遇到食物,蛇身加长
a.ChangeColor(s.head->m_x/10,s.head->m_y/10,BLUE);
s.SnakeAdd();//蛇增长
a.ChangeColor(s.head->m_x/10,s.head->m_y/10,BLUE);
a.DelFood();//删除食物
if(a.CreatFood()==false)//创建新食物,并检查是否通关
{
game.WinGame();//游戏通关(当地图没地方创建食物时)
}
manager.ScoreA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃 语言 图形 编程
![提示](https://static.bdocx.com/images/bang_tan.gif)