球球大作战
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>
#include<graphics.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>//随机数库文件
#include<math.h>
#include<tchar.h>
/*
注重的是思路 思路 思路
游戏有哪些元素?
玩家 食物 背景音乐
坐标:x,y; 球体 :r
*/
//定义属性
#define FOOD_NUM 100
#define WIDTH 1024
#define HEIGHT 620
struct Ball
{
int x;
int y;
int r;
bool flag;//状态 true:活着; false:死了
DWORD color;//无符号long
};
//玩家
struct Ball player;
//食物
struct Ball food[FOOD_NUM];//定义一个结构体数组
//初始化属性
void gameInit()
{
//随机数种子
srand((unsigned)time(NULL));
//强转为unsigned
player.x = 100;
player.y = 100;
player.r = 10;//半径为10
player.flag = true;
//初始化食物
for (int i = 0; i < FOOD_NUM; i++)
{
//食物在画面上是随机的
food[i].x = rand() % WIDTH;
food[i].y = rand() % WIDTH;
//圆的半径不可以为0
food[i].r = rand() % 5 + 1;
food[i].flag = true;
//食物上色好看
food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256, );
}
}
//移动玩家
void movePlayer()
{
char key = _getch();
//switch (key)
//{
//case 72:
// player.y -= 2;
// break;//上
//case 80:
// player.y += 2;
// break;//下
//case 75:
// player.x -= 2;
// break;//左
//case 77:
// player.x += 2;
// break;//右
//default:
// break;
//} //switch case语句只能上下左右,手感不好
//异步按键 //获取异步状态 监听按键
//球一闪一闪的,是因为双缓冲机制
if (GetAsyncKeyState(VK_UP)) {
player.y -= 2;
}
if (GetAsyncKeyState(VK_DOWN)) {
player.y += 2;
}
if (GetAsyncKeyState(VK_LEFT)) {
player.x -= 2;
}
if (GetAsyncKeyState(VK_RIGHT)) {
player.x += 2;
}
}
//设置游戏界面
void gameDraw()
{
//设置一个游戏的背景颜色
setbkcolor(WHITE);
//清理一下设备
cleardevice();
//画格子
setlinecolor(RGB(230, 231, 239));
for (int i = 0; i < WIDTH; i+=10)
{
line(i, 0, i, HEIGHT);//竖线
line(0, i, WIDTH,i);//横线
}
//画食物
for (int i = 0; i < FOOD_NUM; i++)
{
if (!food[i].flag)//食物不存在了那么就跳过本次循环
continue;
//绘制食物颜色
setfillcolor(food[i].color);//颜色已经初始化好了,直接绘制填充
//绘制食物本体
solidcircle(food[i].x, food[i].y, food[i].r);
}
//玩家是一个圆形
setfillcolor(RED);
//画在哪里
solidcircle(player.x, player.y, player.r);
//显示玩家名字
TCHAR playername[20] = _T("player");
settextcolor(BLACK);
settextstyle(20, 0, L"楷体");
setbkmode(TRANSPARENT);
outtextxy(player.x - textwidth(playername) / 2, player.y, playername);
movePlayer();
}
double distans(struct Ball*b1, struct Ball* b2)
{
//sqrt求距离函数 跟下x方+y方
return sqrt((b1->x - b2->x) * (b1->x - b2->x) + (b1->y - b2->y )* (b1->y - b2->y));
}
void PlayerEatFood()
{
for (int i = 0; i < FOOD_NUM; i++)
{
if (food[i].flag && distans(&food[i],&player)< player.r)
{
food[i].flag = false;
//玩家变大
player.r += food[i].r / 2;
}
}
}
int main()
{
//创建一个游戏窗口
//c/c++有一个窗口文件easyx
//创建一个宽为1024 高为640的窗口
initgraph(WIDTH, HEIGHT, EW_DBLCLKS);
//EW_DBLCLKS参数是规定的
//调用初始化结果
gameInit();
//printf("%d %d %d %d", player.x, player.y, player.r, player.flag);
//清空屏幕
system("cls");
BeginBatchDraw();//窗口闪动,双缓冲机制
while (1)
{
gameDraw();
FlushBatchDraw();//刷新
PlayerEatFood();
//暂停一下执行 线程控制速度
Sleep(10);
};//死循环一直显示窗口
//清空屏幕
closegraph();
return 0;
}
效果:
思考总结:
游戏体验感不够好,食物不够多,食物被吃掉后没有新的食物添加;边界处小球移动就看不到了;通过上下左右键移动时不够灵敏