你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Easyx----c语言实现球球大作战

2021/12/29 1:25:39

~创建源文件选择.cpp 

 ~vs2019下载Easyx并包含头文件 

#include<graphics.h>

Easyx图形库下载地址 www.easyx.cn

//玩家,食物,属性:坐标(x,y),颜色,球:radius半径,判断食物是否存在:标志falg.
//用结构体描述同一类事物
#include <stdio.h>
#include <time.h>
#include<conio.h>
#include<graphics.h>
#include <winresrc.h>
#include <math.h>
#define WIDTH 1024
#define HEIGHT 640 
#define FOOD_NUM 1000 //食物数量
#define MAP_WIDTH (WIDTH*3)
#define MAP_HEIGHT (HEIGHT*3)

//全局变量,自动初始化为0,创建地图/图片
IMAGE map(MAP_WIDTH, MAP_HEIGHT);
//camrea游戏中摄像机,每次观察的点是同一个,只是位置变化,求在地图上这个点的坐标在哪?结构体POINT成员xy
POINT g_camreaPos;
struct ball //球
{
	int x;//坐标
	int y;
	int r;//半径
	bool flag;//是否存活
	DWORD color;//设置颜色,参数无符号长整型
};
//定义全局变量初始化数据,
struct ball player;	//玩家
struct ball food[FOOD_NUM];
void createfood(int i)//生成食物
{
	food[i].x = rand() % MAP_WIDTH;	//食物要随机,随机函数:不能生成任意的int型,因为窗口是有大小的,所以要把数字限定在范围内
	food[i].y = rand() % MAP_HEIGHT;
	food[i].r = rand() % 5 + 2;
	food[i].flag = true;		   //食物刚刚生成
	food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
}
/*地图要可以移动的:原理,地图远远比屏幕大,当地图盖在屏幕上时候,屏幕上不能把地图显示完全,让地图根据玩家的位置来变化,玩家始终保持在屏幕的中间,
  如果是图贴图,贴到屏幕的左上角,要不断求地图上左上角是哪个点贴在屏幕上*/
void gameint()
{
	srand(time(NULL));
	//初始化数据
	player.x = rand() % MAP_WIDTH;//随机玩家的位置
	player.y = rand() % MAP_HEIGHT;
	player.r = 10;
	player.flag = true;
	//初始化食物
	for (int i = 0; i < FOOD_NUM; i++)
	{
		createfood(i);
	}
}
void moveplayer(int speed)//坐标变,圆的位置就会变,控制玩家移动,相当于控制坐标 //速度
{

	//getasynckeystate()//获取异步按键状态,比_getch()更流畅,而且可以支持同时按键(斜向移动).
	if (GetAsyncKeyState(VK_UP))//返回值short类型,参数为vKey:virtual key  虚拟键值  //上键的虚拟键值,if语句检测上键有没有按下,如果上键按下返回一个true
	{
		player.y -= speed;
	}
	if (GetAsyncKeyState(VK_DOWN))
	{
		player.y += speed;
	}
	if (GetAsyncKeyState(VK_LEFT))
	{
		player.x -= speed;
	}
	if (GetAsyncKeyState(VK_RIGHT))
	{
		player.x += speed;
	}

}
void gamedraw()
{
	SetWorkingImage(&map);
	//设置背景颜色
	setbkcolor(WHITE); 
	cleardevice();  //清除设备(窗口)
	//画格子
	setlinecolor(RGB(230, 231, 239)); //设置线条颜色
	for (int i = 0; i < MAP_WIDTH; i += 10) //斜着方向行走速度比xy方向速度快,用 i+=10减少遍历次数
	{              
	//对角线比矩形的边长,画竖线,每格是10个像素宽度就画一条线,x的坐标(10,0)(20,0)(30,0)
																	//(10,640)(20,640)//y坐标不变,x坐标每次加10
		line(i, 0, i, MAP_HEIGHT);//有两个参数(点),两点确定一个线段,画竖线(高度)//line(i*10,....)
		line(0, i, MAP_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);//绘制玩家,不能把食物绘制在玩家上面

//画圆,在x,y的坐标位置画一个半径为r的圆
	solidcircle(player.x, player.y, player.r); //实心圆    坐标xy    半径
	SetWorkingImage();						   //当绘制完后要把它设置为屏幕
	putimage(0, 0, WIDTH, HEIGHT, &map, g_camreaPos.x, g_camreaPos.y); //让它与玩家坐标挂钩,然后要把map输出到窗口上
	{
		//以玩家为中心,计算摄像机的坐标
		g_camreaPos.x = player.x - WIDTH / 2;
		g_camreaPos.y = player.y - HEIGHT / 2;//防止越界的操作,玩家要在窗口中间,求窗口左上角的坐标,不是00,外面的大地图的坐标才是00,
		//防止摄像机越界
		if (g_camreaPos.x < 0)g_camreaPos.x = 0; //当小于0,不能再动了,直接让它等于0
		if (g_camreaPos.y < 0)g_camreaPos.y = 0;
		if (g_camreaPos.x > MAP_WIDTH - WIDTH)g_camreaPos.x = MAP_WIDTH - WIDTH;
		if (g_camreaPos.y > MAP_HEIGHT - HEIGHT)g_camreaPos.y = MAP_HEIGHT - HEIGHT;
	}
}
//怎么吃掉食物:
/*1.食物一定比玩家小
  2.怎么判断玩家能不能吃食物:食物被盖住一半即可*/
  //判断两个圆心之间的距离,有没有小于自己(玩家)的半径,如果小于就吃掉食物
double distance(struct ball* b1, struct  ball* b2)//传入2个球的参数,指针
{
	//求圆上的点到圆心距离
	return sqrt((b1->x - b2->x) * (b1->x - b2->x) + (b1->y - b2->y) * (b1->y - b2->y));//sqrt数学的函数
}
//距离
void playereatfood()
{
	//判断圆心距能不能满足条件
	for (int i = 0; i < FOOD_NUM; i++) //有很多食物,循环判断
	{
		if (food[i].flag && distance(&food[i], &player) < player.r)//判断食物是否存在,还要判断距离<player.r
		{
			food[i].flag = false;
			player.r += food[i].r / 2;
			createfood(i);
		}
	}

}
int main()
{
	initgraph(WIDTH, HEIGHT);
	gameint();
	//闪屏现象,双缓冲
	BeginBatchDraw();//开启双缓冲
	while (1)		//把画圆和移动全部写在while循环中,让它不断地画,不断地移动...
	{
		gamedraw();
		moveplayer(5);//每次移动5个像素
		playereatfood();
		FlushBatchDraw();//刷新
		//Sleep(50);//延迟50毫秒,50毫秒动一次
	}
	closegraph();//关闭图形窗口
	return 0;
}

输出键值

int main(){
    char key = _getch();        //包含头文件<conio.h>
    printf("%d_%c\n",key,key);  //上,下,左,右72,80,75,77
}