创作我的创作。简友们好,我是搬运工。
分享自己的学习心得是一件很快乐的事情,经过自己的一点点努力,同时也学到了一点知识。在学习的路上是艰辛的,特别是在自学的道路上,那时多么希望能够看到一篇合适自己的好文章来指导自己,是自己迈出黑暗的一段,从此决定与简书结为好友并希望自己的分享能够给简友带来益处。废话扯远了,我们马上开始本次的内容吧!
本文主要是利用的是easyx者个轻量级的图形库,我也是刚刚学easyx库,那么为了巩固自己呢就写了这么一个小小游戏让自己从中获取一点喜悦,因为不够完善,只是给新手一个简单思路指导,若有比我学的好的,希望给点建议,谢谢!
游戏的主要思路就是:
中间的红球为玩家控制的,通过上下左右移动“吃”随机生成的小红球,每吃一个红球,大红球的半径 + 1,吃的小红球越多,半径越大;若大红球碰到边界,游戏结束。
开始的界面:
一段时间后的界面:(球不断增大)
当然,有兴趣的话,你可以随机生成很多食物,当吃了一定数目的食物之后球就开始增加半径。
一、要的头文件
#include<graphics.h> //easyx库的头文件
#include<conio.h>
#include<ctime> //后边要用到随机函数,随机种子
#include<cmath> //要计算碰撞检测
#include<cstdio>
二、定义的形式为修改带来方便
#define SCREEN_W 640 //界面宽度
#define SCREEN_H 480 //界面高度
#define BALL_R 15 //球的半径 我把玩家控制的球称为ball
#define BALL_STEP 10 //速度
#define BALL_ADD 1 //半径增量
#define FOOD_X // 食物的位置 我把要吃的小球称为食物
#define FOOD_Y
#define FOOD_R 10 //半径
三、是用来记录成绩的,吃到一个球就要加一分
static int count = 0;
四、两个结构体
struct Ball
{
int x = SCREEN_W / 2;//初始化数据
int y = SCREEN_H / 2;
int r = BALL_R;
int step = BALL_STEP;
int ADD = BALL_ADD;
};
struct Food
{
int x ;
int y ;
int r = FOOD_R;
};
//定义 小球 食物
Ball ball;
Food food;
五、我们要把小球给画出来
void Drawfood()
{
food.x = rand() % 600 + 10; //开始的时候随机给它一个位置
food.y = rand() % 450 + 10;
fillcircle(food.x,food.y,food.r);
setfillcolor(RED);
setlinecolor(RED);
}
六、可以说这一段是核心代码,啥?只有一段,假的吧?不,这是真的,核心代码只有这一句。
我写的又不是什么完整地一个游戏,不就是一个游戏里的某一个简单的操作吗,所以也不难。
这个本身的难点就是在碰撞检测上,说白了就是利用数学公式中的勾股定理 :x^2 + y^2 = z^2
思路就是要我们求两个圆心点连线的距离,距离的大小比较是判断是否碰撞的依据。
double Distance()
{
return sqrt((ball.x - food.x)*(ball.x - food.x) + (ball.y - food.y) *(ball.y - food.y));
}
七、吃掉食物之后要擦拭嘛,一般能想到的办法就是填充背景颜色
void EraserFood()
{
setfillcolor(CYAN);
setlinecolor(CYAN);
fillcircle(food.x, food.y, food.r);
}
八、所谓的边界检测,撞到墙你就输呗
void Gameover()
{
if (ball.r > ball.x || ball.r > ball.y || ball.x > SCREEN_W - ball.r || ball.y > SCREEN_H - ball.r)//撞墙 游戏结束
{
char ch;
settextstyle(20, 15, "华文楷书");
settextcolor(BLACK);
outtextxy(SCREEN_W / 4, SCREEN_H / 2, "游戏结束按回车键退出!");
while (_kbhit())
{
ch = getchar();
if (ch == '\n')
closegraph();
}
}
}
九、你可能会想?什么情况下会吃到食物?那就是当你碰撞的时候就是吃到食物呗,那什么时候又是碰撞的?那就是球和食物的半径之和大于或者等于两个圆心连线的距离时就表示发生了碰撞。
void Eating()
{
if (ball.r + food.r >= Distance()) //这就是上边加粗字的代码表示 吃到食物
{
EraserFood(); //消除食物
Drawfood() ; //重新生成食物
ball.r += BALL_ADD; //食物被吃成功 ball的半径增加
count++;
}
}
十、获取键盘按键,实现球的上下左右移动
void Move()
{
int key;
if (_kbhit()) //检测是否有键盘按键
{
key = _getch(); //获取按键
switch (key)
{
case 72:ball.y -= ball.step; break; //上
case 80:ball.y += ball.step; break; //下
case 75:ball.x -= ball.step; break; //左
case 77:ball.x += ball.step; break; //右
default:
break;
}
}
}
十一、初始化游戏界
void Initgame()
{
initgraph(640, 480); //设置窗口大小
setbkmode(TRANSPARENT); //设置背景透明
setbkcolor(CYAN); //设置背景颜色
setfillcolor(RED);
setlinecolor(RED);
cleardevice(); //刷新背景 显示背景设置的颜色
food.x = rand() % SCREEN_W; //随机生成食物出现的第一个位置
food.y = rand() % SCREEN_H;
}
十二、显示成绩
void PrintScore()
{
char str[10];
settextstyle(15,15,"Arial"); //设置字体类型
sprintf_s(str,"%d",count); //把数字打印到字符串数组里边 不懂的可以百度一下
outtextxy(SCREEN_W - 100, 15, str);
outtextxy(SCREEN_W - 200, 15, "成绩 :");
settextstyle(25, 25, "Arial");
outtextxy(SCREEN_W / 4 , 15, "球 球 吃");
settextstyle(20, 20, "华文楷书");
}
十三、进入主函数啦,终于要结束啦!第一次写,好困,我想休息啦
int main()
{
srand(unsigned(time(NULL)));
Initgame();
BeginBatchDraw(); //开始批量绘图,可以解决那些闪现问题
while (true)
{
Move();
Eating();
Gameover();
PrintScore();
fillcircle(food.x, food.y, food.r);
fillcircle(ball.x, ball.y, ball.r);
FlushBatchDraw(); //把要绘制的图案集中在一起,批量绘制,效果更佳
cleardevice();
}
EndBatchDraw(); //顾名思义,结束批量绘图
closegraph(); //前面你创建了一个窗口,最后记得关闭
return 0;
}
结束啦!我知道有很做地方做的不好,希望你们给点建议,我会倾听,谢谢(第一次写,不是很懂啦!)