今天给大家分享一个用起高中是觉得除了考试没啥其它用的数学知识,来做出一个游戏来。
前方高能请系好安全带!
草稿
乱七八糟的几何,集合,三角函数,临界值,哎! 让我再次想起了高中繁忙的日子。
编程思路
- 首先用高中阶段的几何来计算出碰墙后反弹的角度和方向
- 用三角函数计算出小球的下一个刷新位置
演示效果
代码部分
/*
源文件名 : main.cpp
作者 : Abr
日期 : 2020年2月24日
功能介绍 : 45°射出小球,小球一直在窗口中反弹,可以把次程序做成弹珠消消乐游戏。下次给你们展示这个游戏
*/
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#define PI 3.1415926535898//π约等于3.1415926 这项目对精确度的要求非常高
#define ONERAND PI/180//一度等于ONERAND弧度
void graph(int x, int y, int r);
void dgraph(int x, int y, int r);
void graph(int x, int y, int r)
{
setfillcolor(RED);
solidcircle(x, y, r);
}
void dgraph(int x, int y, int r)
{
setfillcolor(BLACK);
solidcircle(x, y, r);
}
int main()
{
double direction = 45;//角度跑出是角度
int x = 400, y = 300, r = 20, s = 10;//圆的坐标,半径和移动速度
initgraph(800, 600);
SetWindowText(GetHWnd(), "45度反弹小球");
// setorigin(0,0);//设置原点
// setaspectratio(1, -1);//反转y轴
while (!_kbhit())
{
//坐标轴
setlinecolor(RED);
line(10, 5, 10, 40);
line(10, 40, 5, 32);
line(10, 40, 15, 32);
settextcolor(RED);
outtextxy(10, 45, 'y');
setlinecolor(BLUE);
line(5, 10, 40, 10);
line(40, 10, 32, 5);
line(40, 10, 32, 15);
settextcolor(BLUE);
outtextxy(45, 5, 'x');
direction = direction == 360 ? 0 : direction;
if (y + r >= 600)//第一种碰撞
{
if (0 < direction && direction < 90)//第一种情况
direction = 360 - direction;
if (90 < direction && direction < 180)//第二种情况
direction = 360 - direction;
if (direction == 90)direction = 270;//正碰撞反弹处理
}
if (x + r >= 800)//第二种碰撞
{
if (270 < direction && direction < 360)//第一种情况
direction = 540 - direction;
if (0 < direction && direction < 90)//第二种情况
direction = 180 - direction;
if (direction == 0)direction = 180;//正碰撞反弹处理
}
if (y - r <= 0)//第三种碰撞
{
if (180 < direction && direction < 270)//第一种情况
direction = 360 - direction;
if (270 < direction && direction < 360)//第二种情况
direction = 360 - direction;
if (direction == 270)direction = 90;//正碰撞反弹处理
}
if (x - r <= 0)//第四种碰撞
{
if (90 < direction && direction < 180)//第一种情况
direction = 180 - direction;
if (180 < direction && direction < 270)//第二种情况
direction = 540 - direction;
if (direction == 180)direction = 0;//正碰撞反弹处理
}
x = x + s * cos(direction * ONERAND);
y = y + s * sin(direction * ONERAND);
graph(x, y, r);
char str[100] = { '\0' };
setbkmode(TRANSPARENT);//透明字体
sprintf_s(str, "angle is : %8.2lf°", direction);
setfillcolor(getbkcolor());
outtextxy(350, 0, str);
Sleep(100);
dgraph(x, y, r);
solidrectangle(350, 0, 350 + textwidth(str), textheight(str));//擦掉原有字符
}
_getch();
closegraph();
return 0;
}