概述
创建源文件选择.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语言实现球球大作战所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复