项目: 用函数实现反弹球消砖块
生活随笔
收集整理的这篇文章主要介绍了
项目: 用函数实现反弹球消砖块
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
目录
- 一、项目描述和最终的成果展示
- 二、封装后的弹跳小球
- 三、显示移动挡板
- 四、反弹小球
- 五、添加砖块并实现打砖块操作
一、项目描述和最终的成果展示
这是在上一次弹跳小项目上进行了一系列的优化和封装。项目: 弹跳的小球
上次没有用函数进行的封装。这次在上次的基础上进行封装和一些功能的优化。
最终效果图如下:
二、封装后的弹跳小球
代码如下:
#include<stdio.h> #include<string.h> #include<conio.h> #include<windows.h>//全局变量 int high,width; //游戏画面大小 int ball_x,ball_y;//小球的坐标 int ball_vx,ball_vy;//小球的速度void gotoxy(int x,int y)//将光标移动到(x,y)位置 {HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle,pos); }void startup()//数据的初始化 {high = 15;width = 20;ball_x = 0;ball_y = width/2;ball_vx = 1;ball_vy = 1; }void show()//显示画面 {gotoxy(0,0);//光标移动到原点位置,以下重画清屏int i,j;for(i=0;i<=high;i++){for(j=0;j<=width;j++){if( ( i == ball_x) && ( j == ball_y ) )printf("O");//输出小球else if( j == width)printf("+");//输出右边框else if( i == high)printf("-");//输出下边框elseprintf(" ");//输出空格}printf("\n");} }void updateWithoutInput()//与用户输入无关的更新 {ball_x = ball_x + ball_vx;ball_y = ball_y + ball_vy;if( (ball_x == 0 ) || (ball_x == high-1 ))ball_vx = -ball_vx;if( (ball_y == 0 ) || (ball_y == width-1 ))ball_vy = -ball_vy;Sleep(50); }void updateWithInput()//与用户输入有关的更新 {} int main(void) {startup();//数据的初始化while(1){show();//显示画面updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新}return 0; }效果图如下:
三、显示移动挡板
代码如下:
#include<stdio.h> #include<string.h> #include<conio.h> #include<windows.h>//全局变量 int high,width; //游戏画面大小 int ball_x,ball_y;//小球的坐标 int ball_vx,ball_vy;//小球的速度 int position_x,position_y;//挡板的中心坐标 int ridus;//挡板的半径大小 int left,right;//挡板的左右位置void gotoxy(int x,int y)//将光标移动到(x,y)位置 {HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle,pos); }void startup()//数据的初始化 {high = 15;width = 20;ball_x = 0;ball_y = width/2;ball_vx = 1;ball_vy = 1;ridus = 5;position_x = high;position_y = width/2;left = position_y -ridus;right = position_y + ridus; }void show()//显示画面 {gotoxy(0,0);//光标移动到原点位置,以下重画清屏int i,j;for(i=0;i<=high+1;i++){for(j=0;j<=width;j++){if( ( i == ball_x) && ( j == ball_y ) )printf("O");//输出小球else if( j == width)printf("+");//输出右边框else if( i == high+1)printf("-");//输出下边框else if ( (i==high)&&(j>=left)&&(j<=right))printf("*");elseprintf(" ");//输出空格}printf("\n");} }void updateWithoutInput()//与用户输入无关的更新 {ball_x = ball_x + ball_vx;ball_y = ball_y + ball_vy;if( (ball_x == 0 ) || (ball_x == high-1 ))ball_vx = -ball_vx;if( (ball_y == 0 ) || (ball_y == width-1 ))ball_vy = -ball_vy;Sleep(50); }void updateWithInput()//与用户输入有关的更新 {char input;if(kbhit()){input = getch();if( input == 'a' || input == 'A' ){position_y--;//位置左移left = position_y-ridus;right = position_y+ridus;}if( input == 'd' || input == 'D' ){position_y++;left = position_y - ridus;right = position_y + ridus;}} } int main(void) {startup();//数据的初始化while(1){show();//显示画面updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新}return 0; }效果图如下:
四、反弹小球
代码如下:
#include<stdio.h> #include<string.h> #include<conio.h> #include<windows.h>//全局变量 int high,width; //游戏画面大小 int ball_x,ball_y;//小球的坐标 int ball_vx,ball_vy;//小球的速度 int position_x,position_y;//挡板的中心坐标 int ridus;//挡板的半径大小 int left,right;//挡板的左右位置 int ball_number;//反弹小球的次数void gotoxy(int x,int y)//将光标移动到(x,y)位置 {HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle,pos); }void startup()//数据的初始化 {high = 15;width = 20;ball_x = 0;ball_y = width/2;ball_vx = 1;ball_vy = 1;ridus = 5;position_x = high;position_y = width/2;left = position_y -ridus;right = position_y + ridus;ball_number=0; }void show()//显示画面 {gotoxy(0,0);//光标移动到原点位置,以下重画清屏int i,j;for(i=0;i<=high+1;i++){for(j=0;j<=width;j++){if( ( i == ball_x) && ( j == ball_y ) )printf("O");//输出小球else if( j == width)printf("+");//输出右边框else if( i == high+1)printf("-");//输出下边框else if ( (i==high)&&(j>=left)&&(j<=right))printf("*");elseprintf(" ");//输出空格}printf("\n");}printf("反弹小球数:%d\n",ball_number); }void updateWithoutInput()//与用户输入无关的更新 {if( ball_x == high -1){if( (ball_y>=left) && (ball_y<=right) ){ball_number++;printf("\a");//响铃}else{printf("游戏失败\n");system("pause");exit(0);}}ball_x = ball_x + ball_vx;ball_y = ball_y + ball_vy;if( (ball_x == 0 ) || (ball_x == high-1 ))ball_vx = -ball_vx;if( (ball_y == 0 ) || (ball_y == width-1 ))ball_vy = -ball_vy;Sleep(50); }void updateWithInput()//与用户输入有关的更新 {char input;if(kbhit()){input = getch();if( input == 'a' || input == 'A' ){position_y--;//位置左移left = position_y-ridus;right = position_y+ridus;}if( input == 'd' || input == 'D' ){position_y++;left = position_y - ridus;right = position_y + ridus;}} } int main(void) {startup();//数据的初始化while(1){show();//显示画面updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新}return 0; }效果图如下:
五、添加砖块并实现打砖块操作
代码如下:
#include<stdio.h> #include<string.h> #include<conio.h> #include<windows.h>//全局变量 int high,width; //游戏画面大小 int ball_x,ball_y;//小球的坐标 int ball_vx,ball_vy;//小球的速度 int position_x,position_y;//挡板的中心坐标 int ridus;//挡板的半径大小 int left,right;//挡板的左右位置 int ball_number;//反弹小球的次数 int block_x1,block_y1;//砖块1的位置 int block_x2,block_y2;//砖块2的位置 int block_x3,block_y3;//砖块3的位置 int score;//消掉砖块的个数void gotoxy(int x,int y)//将光标移动到(x,y)位置 {HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle,pos); }void startup()//数据的初始化 {high = 15;width = 20;ball_x = 0;ball_y = width/2;ball_vx = 1;ball_vy = 1;ridus = 5;position_x = high;position_y = width/2;left = position_y -ridus;right = position_y + ridus;ball_number=0;block_x1 = 0;block_y1 = 1;block_x2 = 0;block_y2 = 2;block_x3 = 0;block_y3 = 3;score=0; }void show()//显示画面 {gotoxy(0,0);//光标移动到原点位置,以下重画清屏int i,j;for(i=0;i<=high+1;i++){for(j=0;j<=width;j++){if( ( i == ball_x) && ( j == ball_y ) )printf("O");//输出小球else if( j == width)printf("+");//输出右边框else if( i == high+1)printf("-");//输出下边框else if ( (i==high)&&(j>=left)&&(j<=right))printf("*");else if( (i==block_x1) && (j==block_y1) )printf("A");//输出砖块1else if( (i==block_x2) && (j==block_y2) )printf("B");//输出砖块2else if( (i==block_x3) && (j==block_y3) )printf("C");//输出砖块3elseprintf(" ");//输出空格}printf("\n");}printf("反弹小球数:%d\n",ball_number);printf("消掉的砖块数: %d\n",score); }void updateWithoutInput()//与用户输入无关的更新 {if( ball_x == high -1){if( (ball_y>=left) && (ball_y<=right) )//被挡板挡住了{ball_number++;printf("\a");//响铃}else{printf("游戏失败\n");system("pause");exit(0);}}if( (ball_x == block_x1) && (ball_y ==block_y1) )//小球击中砖块1{score++;//分数加1block_y1=rand()%width;//产生新的砖块while((block_y1==block_y2) || ( block_y1==block_y3))//当新产生的砖块和其他砖块重合时{block_y1=rand()%width;//产生新的砖块}}if( (ball_x == block_x2) && (ball_y ==block_y2) )//小球击中砖块2{score++;//分数加1block_y2=rand()%width;//产生新的砖块while((block_y2==block_y1) || ( block_y2==block_y3))//当新产生的砖块和其他砖块重合时{block_y2=rand()%width;//产生新的砖块}}if( (ball_x == block_x3) && (ball_y ==block_y3) )//小球击中砖块3{score++;//分数加1block_y3=rand()%width;//产生新的砖块while((block_y3==block_y1) || ( block_y3==block_y2))//当新产生的砖块和其他砖块重合时{block_y3=rand()%width;//产生新的砖块}}ball_x = ball_x + ball_vx;ball_y = ball_y + ball_vy;if( (ball_x == 0 ) || (ball_x == high-1 ))ball_vx = -ball_vx;if( (ball_y == 0 ) || (ball_y == width-1 ))ball_vy = -ball_vy;Sleep(66); }void updateWithInput()//与用户输入有关的更新 {char input;if(kbhit()){input = getch();if( input == 'a' || input == 'A' ){position_y--;//位置左移left = position_y-ridus;right = position_y+ridus;}if( input == 'd' || input == 'D' ){position_y++;left = position_y - ridus;right = position_y + ridus;}} } int main(void) {startup();//数据的初始化while(1){show();//显示画面updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新}return 0; }效果图如下:
总结
以上是生活随笔为你收集整理的项目: 用函数实现反弹球消砖块的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 项目: 用封装的方法实现飞机大战游戏
- 下一篇: 项目: flappy bird