《原来高中学的数学可以做游戏》反弹小球

今天给大家分享一个用起高中是觉得除了考试没啥其它用的数学知识,来做出一个游戏来。

前方高能请系好安全带!

草稿

在这里插入图片描述
在这里插入图片描述
乱七八糟的几何,集合,三角函数,临界值,哎! 让我再次想起了高中繁忙的日子。

编程思路

  1. 首先用高中阶段的几何来计算出碰墙后反弹的角度和方向
  2. 用三角函数计算出小球的下一个刷新位置

演示效果

在这里插入图片描述

代码部分

/*
		源文件名	:	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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值