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;
}
效果图如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341