我是靠谱客的博主 含糊香烟,最近开发中收集的这篇文章主要介绍Easyx-----c语言实现球球大作战,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

创建源文件选择.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 600    //食物数量
#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; //设置颜色,参数无符号长整型
	DWORD eatgrade; //分数
};
//定义全局变量初始化数据
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 + 5;
	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;
	player.eatgrade = 0;
	//初始化食物
	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(RGB(138, 27, 255)); ;//绘制玩家,不能把食物绘制在玩家上面

//画圆,在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;//防止越界的操作: 玩家要在窗口中间,求窗口左上角的坐标  不是(0,0)    外面的大地图的坐标才是(0,0)
		//防止摄像机越界
		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 / 6;
			player.eatgrade += 2;
			createfood(i);
		}
	}

}
void showgrade()//显示分数
{

	char grade[100] = "0";
	sprintf(grade, "%d", player.eatgrade); //用sprintf把整型分数转字符串
	setbkmode(TRANSPARENT);			     //透明方式输出,不改变背景
	settextcolor(LIGHTBLUE);
	outtextxy(880, 20, "分数:");
	outtextxy(930, 20, grade);

}

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

输出键值

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

最后

以上就是含糊香烟为你收集整理的Easyx-----c语言实现球球大作战的全部内容,希望文章能够帮你解决Easyx-----c语言实现球球大作战所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部