C++【观察系列】回弹的球

#include <ctime>		//time()函数所在库
#include <iostream>
#include "windows.h"
using namespace std;

//自定义类 Game
class Game {
	public:
		void Move ( );														//自定义函数,实现弹力球的循环移动
		void SetConsole ( int ic_x, int ic_y );								//自定义函数,传入 xy 坐标值设置 cmd 光标位置
		int Random ( int ic_numberA, int ic_numberB );						//自定义函数,传入上下限值返回随机范围值
		Game ( int ic_window_width, int ic_window_heigth, int ic_speed );	//构造函数,初始化变量(窗口长度和宽度以及移动速度)
		~Game ( );
	private:
		int i_window_width,		//窗口长度
			i_window_height,	//窗口宽度
			i_window_right,		//弹力球移动右边边缘限制
			i_window_down,		//弹力球移动底部边缘限制
			i_random_x,			//原点的随机 x 坐标
			i_random_y,			//原点的随机 y 坐标
			i_formerly_x,		//移动后保留的旧 x 坐标
			i_formerly_y,		//移动后保留的旧 y 坐标
			i_direction_id,		//移动方向 id
			i_speed;			//移动速度
};

//主函数
int main ( ) {
	system ( "mode con cols=100 lines=30" );	//设置 cmd 窗口长宽
	srand ( time ( NULL ) );					//加入随机种子
	
	Game game ( 100, 30, 10 );					//创造类的实例对象并设置初始值,传入 cmd 的窗口长宽和想要的移动速度
	game.Move ( );								//运行移动函数
	
	return 0;
}

//将传入值赋予类私有成员变量
Game::Game ( int ic_window_width, int ic_window_height, int ic_speed ) {
	i_window_width	= ic_window_width;
	i_window_height	= ic_window_height;
	i_speed 		= ic_speed;
}

Game::~Game ( ) {
}

//传入上下限值返回范围随机值
int Game::Random ( int ic_numberA, int ic_numberB ) {
	return ic_numberA + rand ( ) % ic_numberB;
}

//传入 xy 坐标设置 cmd 光标位置
void Game::SetConsole ( int ic_x, int ic_y ) {
	CONSOLE_CURSOR_INFO info = { 1, 0 };
	HANDLE hand = GetStdHandle ( STD_OUTPUT_HANDLE );
	COORD coord = { ic_x, ic_y };
	SetConsoleCursorInfo ( hand, &info );
	SetConsoleCursorPosition ( hand, coord );
}

//弹力球的移动函数
void Game::Move ( ) {
	i_window_right		= i_window_width - 1;
	i_window_down		= i_window_height - 1;
	i_random_x 			= Random ( 0, i_window_right );
	i_random_y 			= Random ( 0, i_window_down );
	i_direction_id 		= Random ( 1, 4 );
	while ( 1 ) {
		SetConsole ( i_random_x, i_random_y );
		cout << "*";
		i_formerly_x = i_random_x;
		i_formerly_y = i_random_y;
		//判断弹力球的位置是否在四个墙角并改变下一步移动方向 id
		if ( ( i_random_x == 0 && i_random_y == 0 ) ||
			 ( i_random_x == 0 && i_random_y == i_window_down ) ||
			 ( i_random_x == i_window_right && i_random_y == 0 ) ||
			 ( i_random_x == i_window_right && i_random_y == i_window_down ) ) {
			switch ( i_direction_id ) {
				case 1: i_direction_id = 3; break;
				case 2: i_direction_id = 4; break;
				case 3: i_direction_id = 1; break;
				case 4: i_direction_id = 2; break;
				default : break;
			}
		}
		//判断弹力球是否接触左右边缘并改变下一步移动方向 id
		else if ( i_random_x == 0 || i_random_x == i_window_right ) {
			switch ( i_direction_id ) {
				case 1: i_direction_id = 4; break;
				case 2: i_direction_id = 3; break;
				case 3: i_direction_id = 2; break;
				case 4: i_direction_id = 1; break;
				default : break;
			}
		}
		//判断弹力球是否接触上下边缘并改变下一步移动方向 id
		else if ( i_random_y == 0 || i_random_y == i_window_down ) {
			switch ( i_direction_id ) {
				case 1: i_direction_id = 2; break;
				case 2: i_direction_id = 1; break;
				case 3: i_direction_id = 4; break;
				case 4: i_direction_id = 3; break;
				default : break;
			}
		}
		//根据移动方向 id 来改变光标的 xy 坐标
		switch ( i_direction_id ) {
			case 1: i_random_x++; i_random_y++; break;
			case 2: i_random_x++; i_random_y--; break;
			case 3: i_random_x--; i_random_y--; break;
			case 4: i_random_x--; i_random_y++; break;
			default : break;
		}
		Sleep ( i_speed / 2 );
		SetConsole ( i_random_x, i_random_y );
		cout << "*";
		Sleep ( i_speed / 2 );
		SetConsole ( i_formerly_x, i_formerly_y );
		cout << " ";
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值