#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <graphics.h> //easyX win32 MFC QT openGL openCV
#include <time.h> //time()
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
//窗口宽
#define WINDOW_WIDTH 600
//窗口高
#define WINDOW_HEIGHT 800
//方向结构体
struct MoveFx {
int x;
int y;
};
//准备球类型的结构体 或者 类
struct Ball {
int x, y; //圆心坐标
int radius; //半径
COLORREF color; //颜色
MoveFx fx; //移动距离
};
//游戏是否继续
bool isGoon = true;
//当前积分
int count = 0;
//窗口句柄
HWND hWnd;
//自己球
struct Ball myBall;
//敌人球
struct Ball eBalls[20];
//1 准备工作
void initGame();
//2 显示界面
void showGame();
//3 游戏控制
void contorlGame();
//4 定时改变敌人球的位置
void changeBalls();
//5 检测函数
void check();
//6 初始化敌人球
void initEnemyBall(int i);
//7 检查自己球和敌人球是否碰撞
bool isPengPeng(int i);
int main() {
/*
程序的编程模型:(套路)
1.准备工作
1.1 窗口
1.2 数据结构准备好
1.3 数据初始化
2.循环
while(1){
//3.1 显示
//3.2 控制
}
*/
initGame();
//定时器 每隔多少时间改变下敌人球的位置
SetTimer(hWnd, 666666, 80, (TIMERPROC)changeBalls);
//创建线程,线程函数可以看作一个分身,和当前程序同时运行 并行
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)contorlGame, NULL, NULL, NULL);
while (isGoon) {
showGame();
}
settextcolor(RED);
outtextxy(250, WINDOW_HEIGHT / 2, "GAME OVER");
while (1);//死循环 停住
return 0;
}
//1 准备工作
void initGame() {
//1.1 做窗口
hWnd = initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
srand(time(0));//设置随机算子
//1.2 初始化自己球
myBall.x = 400;
myBall.y = 100;
myBall.radius = 15;
myBall.color = RED;
//1.3 初始化敌人球
for (int i = 0; i < 20; i++) {
initEnemyBall(i);
}
//1.4 播放BGM
mciSendString("open 甩葱歌.mp3", NULL, NULL, NULL);
mciSendString("play 甩葱歌.mp3", NULL, NULL, NULL);
}
//2 显示界面
void showGame() {
BeginBatchDraw();
//2.1 设置背景
setbkcolor(RGB(65, 199, 91));
cleardevice();//刷新
//2.2 显示自己球
setfillcolor(myBall.color);//设置填充颜色
solidcircle(myBall.x, myBall.y, myBall.radius);//画圆
//2.3 显示敌人球
for (int i = 0; i < 20; i++) {
setfillcolor(eBalls[i].color);//设置填充颜色
solidcircle(eBalls[i].x, eBalls[i].y, eBalls[i].radius);//画圆
}
//1秒钟切换16张以上的图片
//2.4 显示其他信息
char buff[1024] = { 0 };
sprintf(buff, "当前积分:%d", count);
outtextxy(500, 5, buff);
EndBatchDraw();
}
//3 游戏控制
void contorlGame() {
MOUSEMSG msg;
while (isGoon) {
//3.1 获取鼠标的信息
msg = GetMouseMsg();
//3.2 设置自己球
myBall.x = msg.x;
myBall.y = msg.y;
}
}
//4 定时改变敌人球的位置
void changeBalls() {
for (int i = 0; i < 20; i++) {
eBalls[i].x += eBalls[i].fx.x;
eBalls[i].y -= eBalls[i].fx.y;
}
check();
}
//5 检测函数
void check() {
//5.1 检测敌人球是否出界
for (int i = 0; i < 20; i++) {
if (((eBalls[i].x - eBalls[i].radius) > WINDOW_WIDTH) || //x轴出界
((eBalls[i].y + eBalls[i].radius) < 0)) { //y轴出界
initEnemyBall(i);
}
//5.2 检测自己球和敌人球是否碰撞
if (isPengPeng(i)) {//碰撞了
if (myBall.radius > eBalls[i].radius) {//自己球比敌人球大
initEnemyBall(i);//敌人球被吃掉了
myBall.radius += 1;//自己球变大
count++;
}
else {//敌人球比自己球大
isGoon = false;
}
}
}
}
//6 初始化敌人球
void initEnemyBall(int i) {
eBalls[i].x = 5;
eBalls[i].y = WINDOW_HEIGHT - 5;
eBalls[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
eBalls[i].radius = rand() % 80 + 1;//%80 (0-79)
//移动方向,移动距离随机
eBalls[i].fx.x = rand() % 20 + 1;
eBalls[i].fx.y = rand() % 20 + 1;
}
//7 检查自己球和敌人球是否碰撞
bool isPengPeng(int i) {
int x = (myBall.x > eBalls[i].x) ? (myBall.x - eBalls[i].x) : (eBalls[i].x - myBall.x);
int y = (myBall.y > eBalls[i].y) ? (myBall.y - eBalls[i].y) : (eBalls[i].y - myBall.y);
if ((x * x + y * y) <= (myBall.radius + eBalls[i].radius) * (myBall.radius + eBalls[i].radius))
return true;
return false;
}