




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C语言实现打砖块小游戏本文实例为大家分享了C语言实现打砖块游戏的具体代码,供大家参考,具体内容如下
本节我们将沿用上一节所提到的函数式游戏框架来写一个弹球打砖块的游戏。
基本量、边框绘制
我们首先定义好可能需要的变量,比如小球坐标以及速度、游戏界面高度和宽度等等,然后再根据之前提到的弹跳小球重构代码,剩下的内容再分步添置即可。
#includestdio.h
#includestdlib.h
#includeconio.h
#includecwindow.h
//全局变量
intwidth,high;
//游戏界面尺寸
intball_x,ball_y;
//小球坐标
intball_vx,ball_vy;
//小球速度
voidgotoxy(intx,inty)
//移动光标便于清屏重画
HANDLEhandle=GetStdHandle(STD_UOTPUT_HANDLE);
CROODpos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
voidstartup()
//数据初始化
high=15;
width=20;
ball_x=0;
ball_y=width/2;
ball_vx=1;
ball_vy=1;
voidshow()
//显示界面
gotoxy(0,0);
//光标移动到原点便于重画
inti,j;
for(i=0;ihigh;i++)
{
for(j=0;jwidth;j++)
{
if((i==ball_x)(j==ball_y))
printf("O");//输出小球
elseif(j==width)
//到达右边界
printf("|");//输出边界
elseif(i==high)
//到达下边界
printf("-");//输出边界
else
printf("");//非小球坐标输出空格
}
printf("\n");
}
voidupdateWithoutInput()
//与输入无关更新
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);
voidupdateWithInput()
//与输入有关更新
{}
//当前没有
intmain()
startup();
//最开始初始化一次
while(1)
//游戏循环体
{
show();//先展示画面
//然后是数据更新
updateWithoutInput();
updateWithInput();
}
return0;
}
在判断小球到达边界的部分,我们在第二条件中执行了减一操作,目的是为了避免出现小球和边界重合的情况。
移动挡板
接下来我们要在游戏中显示一个中心坐标为(position_x,position_y)且半径为ridus的挡板。用left和right表示其左边和右边位置。
首先定义相关变量:
intposition_x,position_y;
intridus;
intleft,right;
然后数据初始化:
position_x=high;//挡板在最底下
position_y=width/2;
ridus=5;
left=position_y-ridus;
right=position_y+ridus;
最后在输出中添加输出挡板的部分:
if...
elseif((i==high)(j=left)(j=right))
printf("*");
else...
既然已经画好了挡板,那么要能让它移动才行。
很明显,按照一般游戏思路来,我们不能在移动中改变x坐标,也就是说挡板只能左右移动,左移y坐标减一,右移则加一。
所以到此我们就要写updateWithInput函数部分了。
voidupdateWithInput()
charinput;
if(kbhit())
{
input=getch();
if(input=='a')
{
position_y--;
left=position_y-ridus;
right=position_y+ridus;
}
if(input=='d')
{
position_y++;
left=position_y-ridus;
right=position_y+ridus;
}
}
}
反弹小球
反弹小球部分思路就比较清晰一些,简单来说就是判断当小球x坐标到达最底部时,其y坐标是不是在挡板所规定的范围内,如果是,则改变小球速度;如果不是,游戏结束。
我们还可以定义一个ball_number来记录小球反弹的次数。
intball_number;
//初始化
ball_number=0;
随后来写我们的updateWithoutInput部分:
voidupdateWithoutInput()
if(ball_x==high-1)
{
if((ball_y=left)(ball_y=right))
//被挡住
{
ball_number++;
printf("\a");
//响铃
}else{
printf("游戏结束,因为你没接住控制命运的小球\n");
system("pause");
exit(0);
}
}
//以后内容同前
}
消除砖块
我们使用字母O来表示小球了,那么用什么来表示砖块呢?
这个时候就是看你的英语有没有好好学,我们知道Brick是指砖块,所以我们使用字母B来表示砖块,毕竟B本身就像个砖块(并没有)。
需要定义的量:
砖块位置得分(击中砖块加一)
intbrick_x,brick_y;
intscore;
//初始化
brick_x=0;
brick_y=width/2+1;
score=0;
至于输出和判定击中,我就不再多赘述了,基本思路还是和之前一样,输出部分加一句elseif就可以了,而击中判定在updateWithoutInput里。
小结
上代码!!!!!!
#includestdio.h
#includestdlib.h
#includeconio.h
#includecwindow.h
//全局变量
intwidth,high;
//游戏界面尺寸
intball_x,ball_y;
//小球坐标
intball_vx,ball_vy;
//小球速度
intposition_x,position_y;
intridus;
intleft,right;
intball_number;
intbrick_x,brick_y;
intscore;
voidgotoxy(intx,inty)
//移动光标便于清屏重画
HANDLEhandle=GetStdHandle(STD_UOTPUT_HANDLE);
CROODpos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
voidstartup()
//数据初始化
high=15;
width=20;
ball_x=0;
ball_y=width/2;
ball_vx=1;
ball_vy=1;
position_x=high;//挡板在最底下
position_y=width/2;
ridus=5;
left=position_y-ridus;
right=position_y+ridus;
ball_number=0;
brick_x=0;
brick_y=width/2+1;
score=0;
voidshow()
//显示界面
gotoxy(0,0);
//光标移动到原点便于重画
inti,j;
for(i=0;ihigh;i++)
{
for(j=0;jwidth;j++)
{
if((i==ball_x)(j==ball_y))
printf("O");//输出小球
elseif((i==brick_x)(j==brick_y))
printf("B");//输出砖块
elseif(j==width)
//到达右边界
printf("|");//输出边界
elseif((i==high)(j=left)(j=right))
printf("*");//输出挡板
elseif(i==high)
//到达下边界
printf("-");//输出边界
else
printf("");//非小球坐标输出空格
}
printf("\n");
}
printf("反弹小球:%d\n",ball_number);
printf("得分:%d\n",score);
voidupdateWithoutInput()
//与输入无关更新
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;
//判定击中
if((ball_x==brick_x)(ball_y==brick_y))
{
score++;
brick_y=rand()%width;//砖块刷新
}
//延时刷新
sleep(50);
voidupdateWithInput
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美术设计师考试提前准备计划试题及答案
- 《下肢淋巴引流》课件
- 委托购买理财协议
- 《高级医古文:词义》课件
- 创新驱动下的研究生培养新策略与实施路径
- 产教融合推动财经人才培养的创新路径
- 纺织工程师资格考试备战攻略试题及答案
- 工程合同挂靠协议书
- 采购合同合同协议书范本
- 续签家政合同协议书
- 业务拓展经理招聘笔试题及解答(某大型央企)
- 2024年全国职业院校技能大赛中职(移动应用与开发赛项)考试题库(含答案)
- 湖北宜昌高新区招商局公开招聘3人(高频重点复习提升训练)共500题附带答案详解
- 劳务扩大框架合同范本
- DL∕T 703-2015 绝缘油中含气量的气相色谱测定法
- 田忌赛马课件省公开课一等奖新名师课比赛一等奖课件
- JGJ52-2006 普通混凝土用砂、石质量及检验方法标准
- TD/T 1068-2022 国土空间生态保护修复工程实施方案编制规程(正式版)
- 《研学旅行课程设计》课件-研学课程方案设计
- 小儿补液的基础与临床课件
- Whose-dog-is-itPartB-省公开课一等奖新名师课比赛一等奖课件
评论
0/150
提交评论