#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 << " ";
}
}
C++【观察系列】回弹的球
最新推荐文章于 2024-07-01 07:47:56 发布