devc++球吃食物C语言代码

//实现批量修改;按住alt之后,再移动鼠标
#include <graphics.h>
#include <conio.h>//我这里不能用easyx.h
#include<stdlib.h>//调用随机函数的头文件
#include<time.h>
#include<math.h>
#define SCREEN_TICK_PER_FRAME (1000/60.0)//每一帧需要的毫秒数 前面的英文是每秒屏幕的节拍数
#define FOODNUM 200//食物数量
#define distance(spr1,spr2) sqrt((spr1->x-(spr2)->x)*(spr1->x-(spr2)->x)+(spr1->y-(spr2)->y)*(spr1->y-(spr2)->y))//(spr2)加括号
struct Sprit//创建精灵结构体
{  
	double x;
	double y;
	double r;//半径
	double speed;//运行速度     
	bool isDie;//是否结束了
	COLORREF color;//设置颜色
};
void spr_init(Sprit*spr,int x,int y,int r,int speed)
{
	spr->x=x;
	spr->y=y;
	spr->r=r;
	spr->speed=speed;//一个数%a,结果小于a
	spr->color=RGB(rand()%256,rand()%256,rand()%256);//各种颜色的RGB可以在命令窗口中输入mspaint,白色(255,255,255),黑色(0,0,0)
	spr->isDie=false;//挂了就不绘制
}//自定义初始化函数
void spr_draw(Sprit*spr)//绘制一个圆
{
	if(!spr->isDie)
	{
		setfillcolor(spr->color);//设置颜色,若为red类似的必须为大写
			solidcircle(spr->x,spr->y,spr->r);
	}
}
void gamer_move(Sprit*gamer)
{
	//获取键盘按键,必须丝滑,不能用_getch,用GetAsyncKeyState获取异步按键状态(检测某个键是否按下)
	if(GetAsyncKeyState(VK_UP))
		{
			gamer->y-=gamer->speed;
		}
	if(GetAsyncKeyState(VK_DOWN))
		{
			gamer->y+=gamer->speed;
		}
	if(GetAsyncKeyState(VK_LEFT))
		{
			gamer->x-=gamer->speed;
		}
	if(GetAsyncKeyState(VK_RIGHT))
		{
			gamer->x+=gamer->speed;
		}
}
void gamer_eatFood(Sprit*gamer,Sprit*foods)//判断玩家能否吃食物
{
	//遍历食物数组
	for(int i=0;i<FOODNUM;i++)
	{//圆心距离小于玩家半径就可以吃食物
		if(!foods[i].isDie&&distance(gamer,foods+i)<gamer->r)
		{
			//玩家变大
			gamer->r+=foods[i].r;
			//食物消失
			foods[i].isDie=true;
		}
	}
}
Sprit gamer;
Sprit food[FOODNUM];//食物的数组
void init()
{
	srand(time(NULL));//没有这个可能好几次颜色都不会改变
	spr_init(&gamer,512,300,10,3);//初始化gamer
	//初始化所有食物
	for(int i=0;i<FOODNUM;i++)
	{
		int x=rand()%getwidth();//保证生成的坐标在屏幕内
		int y=rand()%getheight();
		int r=rand()%5+2;//半径要小于玩家
		spr_init(food+i,x,y,r,0);
	}
	
}
void draw()
{
	spr_draw(&gamer);
	for(int i=0;i<=FOODNUM;i++)
	{
	 spr_draw(food+i);
	}
}
int main()
{
    initgraph(1024, 600);
	//设置背景颜色
    setbkcolor(WHITE);//没有gray,只有darkgray,而且得大写,或者RGB(230,231,232)
    cleardevice();//用设置的颜色填充屏幕,必须与setbkcolor配对使用
    //solidcircle(100, 100, 50);
    init();
    while(true)
    {
    	//获取一下时间
    	int startTime=clock();//从程序运行到调用clock所用的毫秒数
    	BeginBatchDraw();//绘制太快,未完成的步骤都让你看到了,这样就会闪屏
    	//在绘制前先清屏
    	cleardevice();//防止因为出现残影,而形成一条线
		draw();
		gamer_move(&gamer);//移动,不断地接受键盘按键,移动的是坐标
		gamer_eatFood(&gamer,food);
		EndBatchDraw();//结束双缓冲,双缓冲是先在另一个屏幕绘制,完成后一次性放在这个屏幕,这样就不会闪了
		//控制游戏帧率网游60帧,小游戏24也行
		int frameTime=clock()-startTime;//计算两个clock之间步骤的时间,即一帧执行了多久
		if(frameTime<SCREEN_TICK_PER_FRAME)
		{
			Sleep(SCREEN_TICK_PER_FRAME-frameTime);
		}
		//Sleep(20);//让程序休眠20毫秒,让速度更慢,但是会让整个程序都变慢
	}
    getch();
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值