1 贪吃蛇大作战实际效果展现
引言:C语言新手全是在操纵台子上开发一些小手机游戏哪些,因为沒有页面(例如照片、歌曲,不可以作出有着自身特点的程序流程)学起來较为枯燥,难以坚持到底。因此我在这就教大伙儿应用简易的图形界面专用工具——easyx用户界面库,做一些好玩儿的,超丝滑的贪吃蛇大作战
2 环境专业知识
开发贪吃蛇小游戏,让新手也可以体会页面的风采。做的没有很健全,期待我们可以亲自动手健全它表白程序结构设计:
第一步,大家必须一张地形图,图形库复位的对话框是内置坐标的(左上方为0,0)。
第二步,大家必须一条蛇,这一条蛇由蛇头和蛇身构成(这儿大家复位三节蛇)。
第三步,大家必须食物,而且在蛇吞掉食物以后将蛇的身体拉长,并且再次形成一个食物。
第四步,蛇必须挪动,这应该是较难完成的(实现蛇身坐标的传值,除蛇头之外,每一节蛇的坐标全是以前蛇的上一次健身运动以前的坐标,有点儿绕~)。
第五步,大家必须能用电脑键盘操纵蛇的运作方位,这一会和蛇的挪动有一些联络。
第六步,蛇撞倒墙或是撞倒自身的身体便会身亡(分辨坐标是不是重叠就可以)。
3 不正确及决然计划方案
此系统应用Vs209 easyx开发。刚开始学习C语言或是没了解过easyx的小伙伴,取得编码以后毫无疑问有很多的不正确,这就是所说的给了源代码也不可以运作,因此配备自然环境和查询出错也是做为编程学习者,务必要熟练掌握的专业技能。有关常识的基本解读可收看栏目实例教程:
4. 话不多说上编码
4.1 库函数snake.h
大家把一些函数公式的申明,和结构体的概念放到库函数中:
#ifndef _SNAKE_H_
#define _SNAKE_H_
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<time.h>
#define WIN_WIDTH 640 //对话框高宽
#define WIN_HEIGHT 480
#define MAX_SNAKE 10000 //蛇的较大长度
enum DIR //蛇的方位
{
UP,
DOWN,
LEFT,
RIGHT,
};
//每一节蛇的位置信息
typedef struct _Pos
{
int x;
int y;
DWORD color;
}Pos;
typedef struct Snake_tlg //蛇的结构体
{
int num;
int dir;//蛇的方向
int score;//成绩
int size;//蛇的间距和相对高度
int speed;//挪动速率
Pos coor[MAX_SNAKE];
}Snake;
typedef struct Food_tlg
{
int x;
int y;
int r;
int flag;
DWORD color;
}Food;
//画眼睛函数公式
void DrawEye(int x, int y);
//复位数据信息
void GameInit();
//手机游戏的制作
void GameDraw();
//蛇的挪动
void SnakeMove();
//操纵方位
void KeyControl();
//吃食物
void EatFood();
//中止手机游戏 按空格符中止和再次
void stop();
//计时器
bool Timer(clock_t ms);
#endif
4.2 完成文档snake.cpp
OK,库函数一部分结束,下面进到snake.cpp编码撰写阶段。
#include\"snake.h\"
Snake snake;
Food food;
//画眼睛函数公式
void DrawEye(int x, int y)
{
setfillcolor(WHITE);
solidcircle(x, y, 3);
setfillcolor(BLACK);
solidcircle(x, y, 2);
}
void GameInit()
{
srand(GetTickCount());
//复位蛇
snake.num = 10;
snake.dir = RIGHT;
snake.score = 0;
snake.size = 10;
snake.speed = 1;
snake.coor[0].x = 20;
snake.coor[0].y = 10;
for (int i = 0; i < snake.num; i )
{
snake.coor[i].color = GREEN;
}
//初始化食物
food.x = rand() % (WIN_WIDTH - 10);
food.y = rand() % (WIN_HEIGHT - 10);
food.flag = 1;
food.r = rand() % 3 2;
food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
}
void GameDraw()
{
//设定背景色
setbkcolor(RGB(191, 215, 215));
cleardevice();
//画蛇
for (int i = 0; i < snake.num; i )
{
setfillcolor(snake.coor[i].color);
solidcircle(snake.coor[i].x, snake.coor[i].y, snake.size / 2);
}
//画眼睛
int eyewidth = 5;
switch (snake.dir)
{
case UP:
case DOWN:
DrawEye(snake.coor[0].x - eyewidth, snake.coor[0].y);
DrawEye(snake.coor[0].x eyewidth, snake.coor[0].y);
break;
case LEFT:
case RIGHT:
DrawEye(snake.coor[0].x, snake.coor[0].y - eyewidth);
DrawEye(snake.coor[0].x, snake.coor[0].y eyewidth);
break;
}
//画食物
if (food.flag == 1)
{
setfillcolor(food.color);
solidcircle(food.x, food.y, food.r);
}
//表明成绩
char temp[20] = \"\";
sprintf(temp, \"分数:%d\", snake.score);
setbkmode(TRANSPARENT);
outtextxy(20, 20, temp);
}
void SnakeMove()
{
for (int i = snake.num - 1; i > 0; i--)//从最终一节蛇逐渐,每一节蛇都相当于前一节蛇的上一次坐标
{
snake.coor[i].x = snake.coor[i - 1].x;
snake.coor[i].y = snake.coor[i - 1].y;
}
//依据方位挪动
switch (snake.dir)
{
case UP:
snake.coor[0].y -= snake.speed;
if (snake.coor[0].y 10 <= 0)
{
snake.coor[0].y = WIN_HEIGHT;
}
break;
case DOWN:
snake.coor[0].y = snake.speed;
if (snake.coor[0].y - 10 >= WIN_HEIGHT)
{
snake.coor[0].y = 0;
}
break;
case LEFT:
snake.coor[0].x -= snake.speed;
if (snake.coor[0].x 10 <= 0)
{
snake.coor[0].x = WIN_WIDTH;
}
break;
case RIGHT:
snake.coor[0].x = snake.speed;
if (snake.coor[0].x - 10 >= WIN_WIDTH)
{
snake.coor[0].x = 0;
}
break;
}
}
void KeyControl()
{
//应用win32API获得电脑键盘信息
if (GetAsyncKeyState(VK_UP) && snake.dir != DOWN)
{
snake.dir = UP;
}
if (GetAsyncKeyState(VK_DOWN) && snake.dir != UP)
{
snake.dir = DOWN;
}
if (GetAsyncKeyState(VK_LEFT) && snake.dir != RIGHT)
{
snake.dir = LEFT;
}
if (GetAsyncKeyState(VK_RIGHT) && snake.dir != LEFT)
{
snake.dir = RIGHT;
}
//按A键加快,不按回应初始值
if (GetAsyncKeyState(\'A\') && snake.speed == 1)
{
snake.speed = 5;
}
else if (snake.speed == 5)
{
snake.speed = 1;
}
}
void EatFood()
{
if (snake.coor[0].x >= food.x - food.r && snake.coor[0].x <= food.x food.r &&
snake.coor[0].y >= food.y - food.r && snake.coor[0].y <= food.y food.r &&
food.flag == 1)
{
snake.num = 5;
snake.score = 10;
food.flag = 0;
//每一节的色调都需要复位
for (int i = snake.num - 5; i < snake.num; i )
{
snake.coor[i].color = food.color;
}
}
if (food.flag == 0)
{
food.x = rand() % (WIN_WIDTH - 10);
food.y = rand() % (WIN_HEIGHT - 10);
food.flag = 1;
food.r = rand() % 10 3;
food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
}
}
void stop()
{
if (_kbhit() && _getch() == 32)
{
while (getch() != 32);
}
}
bool Timer(clock_t ms)
{
static clock_t t = clock();
if (clock() - t > ms)
{
t = clock();
return true;
}
return false;
}
4.3 检测文档main.cpp
最终我们一起来测试一下吧
#include\"snake.h\"
int main()
{
//建立一个图型对话框
initgraph(WIN_WIDTH, WIN_HEIGHT);
GameInit();
BeginBatchDraw();//①
while (1)
{
if(Timer(10))
{
SnakeMove();
}
GameDraw();
FlushBatchDraw();//②
EatFood();
KeyControl();
stop();
}
EndBatchDraw();//③ ①②③为双缓存制图避免屏幕闪烁编码
//关掉图型对话框
closegraph();
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。