【C语言】数组反弹球消砖块
数组反弹球消砖块
- 一、模板
- 二、反弹球
- 三、增加挡板
- 四、消砖块和计数功能
- 五、最终成果
一、模板
简单的模板,目前由头文件,全局变量,清屏函数,初始化数据,显示画面,与用户有关的更新,与用户无关的更新,以及主函数组成。
如此可以简化代码结构,方便于修改,便于改bug,思路也会更加清晰
//头文件
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>//全局变量
int...
...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() //数据的初始化
{}void show() //显示画面
{}void updateWithoutInput() //与用户输入无关的更新
{}void updateWithInput() //与用户输入有关的更新
{}int main()
{startup(); //数据的初始化 while(1) //游戏循环的执行 {show(); //显示画面 updateWithoutInput(); //与用户输入无关的更新 updateWithInput(); //与用户输入有关的更新 }return 0;
}
二、反弹球
实现小球反弹的效果。其中,二维数组 int canvas[High][Width]存储游戏画布中的所有元素,0输入空格,1输入小球‘0’;小球坐标为(ball_x,ball_y),则canvas[ball_x][ball_y] = 1,数组的其他元素为0.在updateWithInput()函数中小球更新位置时先将原来位置所在元素设为0,再将新位置所在元素设为1.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>#define High 15
#define Width 20 //游戏画面的 尺寸 //全局变量
int ball_x,ball_y; //小球的坐标
int ball_vx,ball_vy; //小球的速度
int canvas[High][Width] = {0}; //二维数组存储游戏画布中对应的元素 //0为空格,1为小球0 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() //数据的初始化
{ball_x = 0;ball_y = Width/2;ball_vx = 1;ball_vy = 1;canvas[ball_x][ball_y] = 1;
}void show() //显示画面
{gotoxy(0,0); //光标移动到原点位置,以下重画清屏 int i,j;for (i=0;i<High;i++){for (j=0;j<Width;j++){if(canvas[i][j]==0)printf(" "); //输出空格 else if(canvas[i][j]==1)printf("0"); //小时小球 0 }printf("|\n"); //显示右边界 }for(j=0;j<Width;j++)printf("-"); //显示下边界
}void updateWithoutInput() //与用户无关的更新
{canvas[ball_x][ball_y] = 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;canvas[ball_x][ball_y] = 1;Sleep(50);
}void updateWithInput() //与用户输入有关的更新
{}int main()
{startup(); //数据的初始化 while(1) //游戏循环执行 {show(); //显示画面 updateWithoutInput(); //与用户输入无关的更新 updateWithInput(); //与用户输入有关的更新 }return 0;
}
三、增加挡板
当二维数组canvas[High][Width]中的元素为2时输出挡板‘*’。当在updateWithInput()函数中控制移动时每帧仅移动一个单位,同样需要将原来数组元素值设为0,再将新位置所在的元素设为2。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>#define High 15
#define Width 20 //游戏画面的 尺寸 //全局变量
int ball_x,ball_y; //小球的坐标
int ball_vx,ball_vy; //小球的速度
int position_x,position_y; //
int ridus;
int left,right;
int canvas[High][Width] = {0}; //二维数组存储游戏画布中对应的元素
//0为空格,1为小球 0,2为挡板 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() //数据的初始化
{ball_x = 0;ball_y = Width/2;ball_vx = 1;ball_vy = 1;canvas[ball_x][ball_y] = 1;ridus = 5;position_x = High-1;position_y = Width/2;left = position_y - ridus;right = position_y = ridus;int k;for ( k=left;k<=right;k++)canvas[position_x][k] = 2;
}void show() //显示画面
{gotoxy(0,0); //光标移动到原点位置,以下重画清屏 int i,j;for (i=0;i<High;i++){for (j=0;j<Width;j++){if(canvas[i][j]==0)printf(" "); //输出空格 else if(canvas[i][j]==1)printf("0"); //输出小球 0else if(canvas[i][j]==2)printf("*"); //输出挡板* }printf("|\n"); //显示右边界 }for(j=0;j<Width;j++)printf("-"); //显示下边界 printf("\n");
}void updateWithoutInput() //与用户无关的更新
{if (ball_x == High-2){if( (ball_y>=left) && (ball_y<=right) ) //被挡板挡住 {printf("\a"); //响铃 }else //没有挡板被挡住 {printf("游戏失败\n");system("pause");exit(0);}}canvas[ball_x][ball_y] = 0;ball_x = ball_x + ball_vx;ball_y = ball_y + ball_vy;if( (ball_x==0) || (ball_x==High-2) )ball_vx = -ball_vx;if( (ball_y==0) || (ball_y==Width-1) )ball_vy = -ball_vy;canvas[ball_x][ball_y] = 1;Sleep(50);
}void updateWithInput() //与用户输入有关的更新
{char input;if(kbhit()) //判断是否有输入 {input = getch(); //根据用户的不同输入来移动,不必输入回车 if ((input == 'a') && (left>0)){position_y--; //位置左移 left = position_y-ridus;right = position_y+ridus;canvas[position_x][left] = 2;}if ((input == 'd') && (right<Width-1)){position_y++; //位置右移 left = position_y-ridus;right = position_y+ridus; canvas[position_x][right] = 2;}}
}int main()
{startup(); //数据的初始化 while(1) //游戏循环执行 {show(); //显示画面 updateWithoutInput(); //与用户输入无关的更新 updateWithInput(); //与用户输入有关的更新 }return 0;
}
四、消砖块和计数功能
增加砖块,当二维数组canvas[High][Width]
中的元素值为3时输入挡板‘#’。
由于采用数组,在startup中可以很方便的初始化多个砖块。在updateWithoutInput()中判断小球碰到砖块后对应数组元素值由3变为0,即该砖块消失
加入两个全局变量
int ball_number; //反弹小球的次数
int score; //消掉的砖块的个数
只后在show函数中加入两个printf显示这两个变量
五、最终成果
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>#define High 15
#define Width 20 //游戏画面的 尺寸 //全局变量
int ball_x,ball_y; //小球的坐标
int ball_vx,ball_vy; //小球的速度
int position_x,position_y; //挡板的中心坐标
int ridus; //挡板的半径大小
int left,right; //挡板的左右位置
int ball_number; //反弹小球的次数
int score; //消掉的砖块的个数
int canvas[High][Width] = {0}; //二维数组存储游戏画布中对应的元素
//0为空格,1为小球 0,2为挡板 ,3为砖块# 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() //数据的初始化
{ ridus = 5;position_x = High-1;position_y = Width/2;left = position_y - ridus;right = position_y + ridus;ball_x = position_x-1;ball_y = position_y;ball_vx = -1;ball_vy = 1;canvas[ball_x][ball_y] = 1;ball_number = 0;score=0; int k,i;for ( k=left;k<=right;k++) //挡板 canvas[position_x][k] = 2;for(k=0;k<Width;k++) //加几排砖块 for(i=0;i<High/4;i++) canvas[i][k] = 3;
}void show() //显示画面
{gotoxy(0,0); //光标移动到原点位置,以下重画清屏 int i,j;for (i=0;i<High;i++){for (j=0;j<Width;j++){if(canvas[i][j]==0)printf(" "); //输出空格 else if(canvas[i][j]==1)printf("0"); //输出小球 0else if(canvas[i][j]==2)printf("*"); //输出挡板* else if(canvas[i][j]==3)printf("#"); //输出砖块# }printf("|\n"); //显示右边界 }for(j=0;j<Width;j++)printf("-"); //显示下边界 printf("\n");printf("反弹的小球数:%d\n",ball_number/7);printf("消掉的砖块数:%d\n",score);
}void updateWithoutInput() //与用户无关的更新
{if (ball_x == High-2){if( (ball_y>=left) && (ball_y<=right) ) //被挡板挡住 {ball_number ++;}else //没有挡板被挡住 {printf("游戏失败\n");system("pause");exit(0);}}static int speed = 0;if(speed<7)speed++;if(speed == 7){speed = 0;canvas[ball_x][ball_y] = 0;ball_x = ball_x + ball_vx;ball_y = ball_y + ball_vy;canvas[ball_x][ball_y] = 1;if( (ball_x==0) || (ball_x==High-2) )ball_vx = -ball_vx;if( (ball_y==0) || (ball_y==Width-1) )ball_vy = -ball_vy;if(canvas[ball_x-1][ball_y]==3){ball_vx = -ball_vx;canvas[ball_x-1][ball_y]=0;printf("\a");score++; } }
}void updateWithInput() //与用户输入有关的更新
{char input;if(kbhit()) //判断是否有输入 {input = getch(); //根据用户的不同输入来移动,不必输入回车 if (input == 'a' && left>0){canvas[position_x][right] = 0;position_y--; //位置左移 left = position_y-ridus;right = position_y+ridus;canvas[position_x][left] = 2;}if (input == 'd' && right<Width-1){canvas[position_x][left] = 0;position_y++; //位置右移 left = position_y-ridus;right = position_y+ridus; canvas[position_x][right] = 2;}}
}int main()
{startup(); //数据的初始化 while(1) //游戏循环执行 {show(); //显示画面 updateWithoutInput(); //与用户输入无关的更新 updateWithInput(); //与用户输入有关的更新 }return 0;
}
【C语言】数组反弹球消砖块相关推荐
- 【C语言】反弹球消砖块游戏
目录 0. 前期准备 1. 打印小球 2. 显示边界 3. 显示挡板 Tip one Tip two 4. 控制挡板
- 项目: 用数组实现反弹球消砖块
项目:用数组实现反弹球消砖块 一.效果展示: 二.代码如下: 一.效果展示: 二.代码如下: #include<stdio.h> #include<string.h> #inc ...
- C语言实现【小游戏——反弹球消砖块】
目录: 1.目标要求: 2.C语言代码: 3.运行结果: 1.目标要求: 1.击中上方方块'H',分数加1 2.下方控制线没有接到小球时,游戏结束 2.C语言代码: #include<stdio ...
- C语言——反弹球消砖块
目录 前言 一.小球代码的重构 函数 二. 实现游戏的边框 三.显示移动挡板 四.反弹小球 五.消除砖块 六.玩家输入 getchar() kbhit() 七.结尾--最后实现的代码 #define ...
- 项目: 用函数实现反弹球消砖块
目录 一.项目描述和最终的成果展示 二.封装后的弹跳小球 三.显示移动挡板 四.反弹小球 五.添加砖块并实现打砖块操作 一.项目描述和最终的成果展示 这是在上一次弹跳小项目上进行了一系列的优化和封装. ...
- 开维控制精灵 Ctrl js 快手小游戏 - 自动消砖块
开维控制精灵 Ctrl.js 快手小游戏 - 自动消砖块 Ctrl.js是基于js语法规则的控制类脚本语言,用于自动化软件测试. Ctrl.js 需要在手机上下载"开维控制精灵", ...
- C语言数组测试函数,(完整word版)C语言数组与函数阶段测试题答案---(20200807070313)(8页)-原创力文档...
} } C语言数组与函数阶段测试题答案 一.选择题( 18*2=36 分) 1. 在定义" int a[5][6]; "后,第 11个元素是 [ C ] A.a[2][5] B . ...
- c语言数组中的字母可以相等吗,C语言数组比较
C语言数组比较教程 在 要比较两个 C 语言的数组是否相等,我们只有使用 案例 比较两个数组是否相等 通过循环遍历数组来比较数组 #include int main(){ printf("嗨 ...
- C语言数组知识体系整理大学霸IT达人
C语言数组知识体系整理大学霸IT达人 数组是一组连续存储空间可以存放特定类型的对象.存放的对象被称为元素.数组的元素可以通过下标运算符和指针进行访问以及存取.对于数组的内容我们需要掌握数组的定义,数组 ...
最新文章
- SIGGRAPH最佳博士论文奖又落华人手中,胡渊鸣的这位师兄不一般
- MIMO系统ML检测(最大似然检测)
- 一条龙奇迹私服WEB系统后门及bug
- python os模块安装_二十七、深入浅出Python中的 os模块
- Yolo-v2_ Windows平台下如何配置darknet-yolov2?(安装CUDA)
- Shell函数:Shell函数返回值、删除函数、在终端调用函数
- 面对想法简单客户的有效需求分析
- 【软件测试】白盒测试与黑盒测试的区别(不同)
- iOS阶段学习第31天笔记(UINavigationBar介绍)
- C语言通过枚举网卡,API接口可查看man 7 netdevice--获取接口IP地址
- stm32for循环几个机械周期_带你了解包装机械设备的可调度性分析
- python微博接口_python调用微博api接口
- 谈谈js中的异步编程。
- 74cms3.0 SQL注入
- 半监督学习方法:协同训练
- 整车控制器(VCU)开发 之 概述
- 设置font标签居中显示
- 人工智能--CV视觉方向详细知识体系总结(2021新)
- Spring5.x之spring-jcl
- python编程猜拳游戏_python写猜拳小游戏
热门文章
- Android 开发中问题收集(六):将自己应用添加到微信和QQ其他应用列表
- jPlayer播放后台返回的语音流
- AI理解不了“他她它”咋办?动词成为新突破口,机器人听到抹黄油就知道拿刀叉 | 清华AIR北大英特尔...
- Stata连享会推文列表
- CNN可视化技术总结(一)--特征图可视化
- 计算机网络——ARPANET设计思想
- FLUENT算例 —— Vertical Axis Wind Turbine (Part 1) 垂直轴风力机(第1部分)
- mysql触发器和oracle,MySQL与Oracle 差异比较之六触发器
- Android使用GPUImage实现滤镜效果精炼详解(一)
- 【2021-07-16】堆糖注册(数美滑块)