贪吃蛇C语言图形化编程.docx

上传人:b****4 文档编号:3758943 上传时间:2022-11-25 格式:DOCX 页数:17 大小:19.71KB
下载 相关 举报
贪吃蛇C语言图形化编程.docx_第1页
第1页 / 共17页
贪吃蛇C语言图形化编程.docx_第2页
第2页 / 共17页
贪吃蛇C语言图形化编程.docx_第3页
第3页 / 共17页
贪吃蛇C语言图形化编程.docx_第4页
第4页 / 共17页
贪吃蛇C语言图形化编程.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

贪吃蛇C语言图形化编程.docx

《贪吃蛇C语言图形化编程.docx》由会员分享,可在线阅读,更多相关《贪吃蛇C语言图形化编程.docx(17页珍藏版)》请在冰豆网上搜索。

贪吃蛇C语言图形化编程.docx

贪吃蛇C语言图形化编程

////////////////////////////////////////////

//程序名称:

贪吃蛇

//编译环境:

VisualC++6.0/2010,EasyX_2011惊蛰版

//程序编写:

轻雨漫步<512655756@>

//最后更新:

2011-3-11

//

////////////////////////////////////////////

//开始编写游戏需要的类

////////////////////////////////////////////

#include//EasyX_2011惊蛰版(绘图库)

#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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1