//实现批量修改;按住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;
}
devc++球吃食物C语言代码
于 2023-01-31 11:12:01 首次发布