C语言中怎么用函数实现反弹球消砖块
短信预约 -IT技能 免费直播动态提醒
本篇内容介绍了“C语言中怎么用函数实现反弹球消砖块”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
一、项目描述和最终的成果展示
这是在上一次弹跳小项目上进行了一系列的优化和封装。项目: 弹跳的小球
上次没有用函数进行的封装。这次在上次的基础上进行封装和一些功能的优化。
最终效果图如下:
二、封装后的弹跳小球
代码如下:
#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("-");//输出下边框 else printf(" ");//输出空格 } 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("*"); else printf(" ");//输出空格 } 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("*"); else printf(" ");//输出空格 } 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");//输出砖块1 else if( (i==block_x2) && (j==block_y2) ) printf("B");//输出砖块2 else if( (i==block_x3) && (j==block_y3) ) printf("C");//输出砖块3 else printf(" ");//输出空格 } 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++;//分数加1 block_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++;//分数加1 block_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++;//分数加1 block_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;}
效果图如下:
“C语言中怎么用函数实现反弹球消砖块”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341