1、 void LaserDisplay() /显示镭射状态的格子 IMAGE image(10,10); SetWorkingImage(&image); DWORD* pMem = GetImageBuffer(& for(int i = 0; i 10 * 10; i+) pMemi = BGR(RGB(0, 0, i * 256 / (10*10) ); SetWorkingImage(NULL); putimage(m_x,m_y,& short ReturnFull() /返回格子状态 return m_full; Cell() /构造函数 m_x = 0,m_y = 0,m_full
2、 = 0; m_color = BLACK;private: short m_x; /格子的左上角X坐标 short m_y; /格子的左上角Y坐标 short m_full; /0为空,1为阻挡,2为食物 COLORREF m_color; /格子颜色;/游戏区类,编写有关游戏区的一些操作class GameArea /游戏区域 Cell m_game6060; /定义游戏区域(由360个格子组成) friend void MessageDispose(); bool CreatFood() /产生随机食物 srand(time(NULL); /初始化随机数种子 m_random1 = ra
3、nd()%58+1; /随机生成一个0 - 58的整数 m_random2 = rand()%58+1; /随机一个0 - 58的整数 if(m_gamem_random2m_random2.m_full = 0) /检查生成的食物坐标是否在障碍上 m_gamem_random1m_random2.display(GREEN); m_gamem_random1m_random2.m_full = 2; return true; /如果随机的食物正好出现在蛇身上,则进入下面的循环寻找可以生成食物的地方 for(m_random1 = 1;m_random1 59;m_random1+) for(
4、m_random2 = 1;m_random2 m_random2+) if(m_gamem_random2m_random2.m_full = 0) m_gamem_random1m_random2.display(GREEN); m_gamem_random1m_random2.m_full = 2; return true; /如果没有找到可以生成食物的地方,则通关 return false; /返回false即表示通关 void DelFood() /删除食物 m_gamem_random1m_random2.m_full = 0; /设置为0即代表格子属性为空 void Change
5、Color(int flag1,int flag2,COLORREF color) /设置指定格子的颜色 m_gameflag1flag2.display(color); void Init() /初始化GAME区域 int flag1,flag2; /标识变量 BeginBatchDraw(); /开始批量绘图 setfillstyle(BLACK); /设置当前颜色 bar(0,0,600,600); /画无边框填充矩形(在这里的用途是用黑色清空游戏区域) for(flag1 = 0;flag1 60;flag1+) for(flag2 = 0;flag2 next;now-next !=
6、 NULL;now = now-next) free(now-prior); head = (struct node*)malloc(sizeof(struct node); /为蛇头分配内存 head-prior = NULL;m_x = 300;m_y = 300; now = (struct node*)malloc(sizeof(struct node);next = now; now-prior = head;next = NULL;m_y = 290; last = now; toward = DOWN; void SnakeAdd() now = head; /当前指向蛇头pri
7、or = (struct node*)malloc(sizeof(struct node); /为新增的结点分配内存 now = now-prior; /让当前指向新分配的结点 /置空当前结点的前趋next = head; /让当前结点的后继指向蛇头 switch(toward) /根据当前蛇头方向确定新增部分的坐标 case UP: now-m_x = head-m_x;m_y = head-m_y -10; break; case DOWN:m_y + 10; case LEFT:m_x - 10;m_y; case RIGHT:m_x + 10; head = now; /设置当前结点为
8、蛇头 void SnakeDel() /释放蛇尾结点(删除蛇尾) last = last- free(last-next); last- void SnakeMove() /蛇身移动一格 SnakeAdd(); /增加蛇头 SnakeDel(); /删除蛇尾 struct node /蛇身链表 int m_x; int m_y; struct node *next; /下个结点 struct node *prior; /上个结点 ; struct node *head; struct node *last; struct node *now;/游戏类,用来初始化游戏的参数,及实现其他游戏操作c
9、lass Game void Init() closegraph(); initgraph(800,600); setbkmode(TRANSPARENT); /设置输出文字背景为透明 LOGFONT f; getfont(&f); / 获取当前字体设置 f.lfHeight = 50; / 设置字体高度为 48(包含行距) _tcscpy(f.lfFaceName, _T(黑体); / 设置字体为“黑体” f.lfQuality = ANTIALIASED_QUALITY; / 设置输出效果为抗锯齿 setfont(& / 设置字体样式 void FailGame() /游戏失败显示的画面
10、setcolor(RED); setfont(70, 0, _T(微软雅黑 outtextxy(150, 265, _T(YOU LOSE! void WinGame() /游戏胜利时显示的画面YOU WIN! FlushBatchDraw(); Sleep(10000); exit(0);/管理区类,定义管理区域的相关操作class ManageArea void TimeAdd(double add) /增加时间(可在类外直接调用实现动态刷新时间) m_time += add; DisplayTime(); void ScoreAdd(short add) /增加分数(可在类外直接调用实现
11、动态刷新分数) m_score += add; DisplayScore(); void DisplayPause() /显示暂停或者开始 _stprintf(m_str_score, _T(%d), m_score); setfont(25, 0, _T( setcolor(BLUE); if(m_pause) outtextxy(625, 490, _T(开始(P键) else暂停(P键) void Init() /初始化管理界面 m_time = 0.0; m_score = 0; m_pause = false; /格式化转换类型 _stprintf(m_str_time, _T(%.
12、1lf), m_time); m_bgcolor = 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(制作:初恋年代 outtextxy(625, 390, _T(时间: outtextxy(625, 420, _T(分数: outtextxy(625, 460, _T(重新游戏(R键) outtextxy(625, 520, _T(
13、直接退出(ESC键) outtextxy(680, 420, m_str_score); outtextxy(680, 390, m_str_time); void DisplayTime() /显示当前耗时 setfillstyle(m_bgcolor); bar(680,390,800,415); outtextxy(680,390,m_str_time); void DisplayScore() /显示当前分数 bar(680,420,800,445); outtextxy(680,420,m_str_score); double m_time; short m_score; bool
14、m_pause; TCHAR m_str_leave2, m_str_time33, m_str_score5; COLORREF m_bgcolor;/声明游戏需要的类Game game; /用于初始化游戏、设置游戏相关参数GameArea a; /用于初始化游戏区域,设置,改变游戏区域相关参数ManageArea manager; /用于初始化管理区域,设置管理区相关参数Snake s; /用于初始化蛇,数据化蛇,操作蛇/游戏的消息控制,流程控制函数void MessageDispose() /消息处理函数 char c; s.now = NULL; bool Keepdown = fal
15、se; while(true) Keepdown = false; /是否持续按W A S D 中的一个按键 if(kbhit() switch(c = getch() /处理按键消息(W A S D) case w:W if(s.toward = UP)Keepdown = true; else if(s.toward != DOWN&s.toward != UP)s.toward = UP; break;sS if(s.toward = DOWN)Keepdown = true;= UP&= DOWN)s.toward = DOWN;aA if(s.toward = LEFT)Keepdo
16、wn = true;= RIGHT&= LEFT)s.toward = LEFT;dD if(s.toward = RIGHT)Keepdown = true;= LEFT&= RIGHT)s.toward = RIGHT; case 27: closegraph(); exit(0);pP manager.m_pause = !manager.m_pause; /设置暂停或开始 manager.DisplayPause(); /显示暂停或开始rR ReInit(); if(true = manager.m_pause) /如果暂停,直接进行下次循环 continue; switch(a.m_games.head-m_x/10s.head-m_y/10.ReturnFull() /检测蛇头遇到的情况 case 2: /遇到食物,蛇身加长 a.ChangeColor(s.head-m_x/10,s.head-m_y/10,BLUE); s.SnakeAdd(); /蛇增长 a.DelFood(); /删除食物 if(a.CreatFood() = false) /创建新食物,并检查是否通关 game.WinGame(); /游戏通关(当地图没地方创建食物时) manager.ScoreA
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1