字符基础——四处弹跳的小球

使用C/C++编程语言实现一个小球来回弹跳的效果。

开发环境:Dev-C++ 5

介绍:使用字符'0'表示弹跳的小球,小球具有水平速度和垂直速度,小球触碰到上下左右边界时改变速度方向。

制作过程:

使用x表示小球处于第几行,y表示小球处于第几列,x_v表示小球在垂直方向的速度(值大于0时,小球向下移动,否则向上移动),y_v表示小球在水平方向的速度(值大于0时,小球向右移动,否则向左移动),width表示小球活动区域的列数,height表示小球活动区域的行数。

	int x,y;//小球处于第x行,第y列
	x=1,y=5;
	
	int x_v = 1;//初始状况下,小球向右下运动
	int y_v = 1;
	int width = 58;//小球活动区域有58列,20行
	int height = 20; 

由于使用传统的system("cls")清屏会有严重的闪烁效果,这里使用windows.h下的SetConsoleCursorPosition(Handle handle,COORD pos)来将光标进行移动pos点处,每次循环前先执行下该方法,从而实现清屏效果。

//将光标移动到(x,y)处,实现清屏效果 
void goToXY(int x,int y){
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle,pos);
}

除此之外,光标的闪烁效果也是比较严重的,这里可以使用HideCursor()函数对光标进行隐藏。

//隐藏光标 
void HideCursor(){
	CONSOLE_CURSOR_INFO cursor_info = {1,0};//第二个参数值为0表示隐藏光标 
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}

根据上面所说,程序的大体思路已经出来了:主函数先对光标进行隐藏,然后声明一个while的死循环,循环开始处调用goToXY(x,y)对屏幕进行清屏。打印字符界面,接着判断小球当前位置是否处于边界边缘,假设当前小球处于第height-1行,那么改变小球垂直方向速度x_v为其相反数...根据此思想,可以处理小球碰到边界反弹的效果。最后根据水平速度和垂直速度,修改小球的位置坐标,实现小球的运动。

int main(){
	
	int x,y;
	x=1,y=5;
	
	int x_v = 1;
	int y_v = 1;
	int width = 58;
	int height = 20; 
	
	HideCursor();
	while(1){
//		system("cls");
		goToXY(0,0);//光标移动到原点位置,重画清屏 
		cout<<"-----------------------------------------------------------"<<endl;		
		for(int i=0;i<height;i++){
			cout<<"|";
			for(int j=0;j<width;j++){
				if(x==i&&y==j){
					cout<<"0";
				}else{
					cout<<" ";
				}
			}
			cout<<"|"<<endl;
		}
		cout<<"-----------------------------------------------------------"<<endl;
		Sleep(10);
		if(x==height-1||x==0){//小球碰到上边界或者下边界,改变垂直速度的方向
			x_v = -x_v;
		}
		if(y==width-1||y==0){//小球碰到右边界或者左边界,改变水平速度的方向
			y_v = -y_v;
		}
		x += x_v;//根据水平速度和垂直速度修改小球坐标
		y += y_v;
	}
	
	
	return 0;
} 

完整源码

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<windows.h>

using namespace std;

//将光标移动到(x,y)处,实现清屏效果 
void goToXY(int x,int y){
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle,pos);
}

//隐藏光标 
void HideCursor(){
	CONSOLE_CURSOR_INFO cursor_info = {1,0};//第二个参数值为0表示隐藏光标 
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}


int main(){
	
	int x,y;
	x=1,y=5;
	
	int x_v = 1;
	int y_v = 1;
	int width = 58;
	int height = 20; 
	
	HideCursor();
	while(1){
//		system("cls");
		goToXY(0,0);//光标移动到原点位置,重画清屏 
		cout<<"-----------------------------------------------------------"<<endl;		
		for(int i=0;i<height;i++){
			cout<<"|";
			for(int j=0;j<width;j++){
				if(x==i&&y==j){
					cout<<"0";
				}else{
					cout<<" ";
				}
			}
			cout<<"|"<<endl;
		}
		cout<<"-----------------------------------------------------------"<<endl;
		Sleep(10);
		if(x==height-1||x==0){
			x_v = -x_v;
		}
		if(y==width-1||y==0){
			y_v = -y_v;
		}
		x += x_v;
		y += y_v;
	}
	
	
	return 0;
} 

运行效果如下(动图效果不易展示):

猜你喜欢

转载自blog.csdn.net/A1344714150/article/details/85634724
今日推荐