使用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;
}
运行效果如下(动图效果不易展示):