数组反弹球消砖块

  • 一、模板
  • 二、反弹球
  • 三、增加挡板
  • 四、消砖块和计数功能
  • 五、最终成果

一、模板

简单的模板,目前由头文件,全局变量,清屏函数,初始化数据,显示画面,与用户有关的更新,与用户无关的更新,以及主函数组成。
如此可以简化代码结构,方便于修改,便于改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语言】数组反弹球消砖块相关推荐

  1. 【C语言】反弹球消砖块游戏

    目录 0. 前期准备 1. 打印小球 2. 显示边界 3. 显示挡板 Tip one Tip two 4. 控制挡板

  2. 项目: 用数组实现反弹球消砖块

    项目:用数组实现反弹球消砖块 一.效果展示: 二.代码如下: 一.效果展示: 二.代码如下: #include<stdio.h> #include<string.h> #inc ...

  3. C语言实现【小游戏——反弹球消砖块】

    目录: 1.目标要求: 2.C语言代码: 3.运行结果: 1.目标要求: 1.击中上方方块'H',分数加1 2.下方控制线没有接到小球时,游戏结束 2.C语言代码: #include<stdio ...

  4. C语言——反弹球消砖块

    目录 前言 一.小球代码的重构 函数 二. 实现游戏的边框 三.显示移动挡板 四.反弹小球 五.消除砖块 六.玩家输入 getchar() kbhit() 七.结尾--最后实现的代码 #define ...

  5. 项目: 用函数实现反弹球消砖块

    目录 一.项目描述和最终的成果展示 二.封装后的弹跳小球 三.显示移动挡板 四.反弹小球 五.添加砖块并实现打砖块操作 一.项目描述和最终的成果展示 这是在上一次弹跳小项目上进行了一系列的优化和封装. ...

  6. 开维控制精灵 Ctrl js 快手小游戏 - 自动消砖块

    开维控制精灵 Ctrl.js 快手小游戏 - 自动消砖块 Ctrl.js是基于js语法规则的控制类脚本语言,用于自动化软件测试. Ctrl.js 需要在手机上下载"开维控制精灵", ...

  7. C语言数组测试函数,(完整word版)C语言数组与函数阶段测试题答案---(20200807070313)(8页)-原创力文档...

    } } C语言数组与函数阶段测试题答案 一.选择题( 18*2=36 分) 1. 在定义" int a[5][6]; "后,第 11个元素是 [ C ] A.a[2][5] B . ...

  8. c语言数组中的字母可以相等吗,C语言数组比较

    C语言数组比较教程 在 要比较两个 C 语言的数组是否相等,我们只有使用 案例 比较两个数组是否相等 通过循环遍历数组来比较数组 #include int main(){ printf("嗨 ...

  9. C语言数组知识体系整理大学霸IT达人

    C语言数组知识体系整理大学霸IT达人 数组是一组连续存储空间可以存放特定类型的对象.存放的对象被称为元素.数组的元素可以通过下标运算符和指针进行访问以及存取.对于数组的内容我们需要掌握数组的定义,数组 ...

最新文章

  1. SIGGRAPH最佳博士论文奖又落华人手中,胡渊鸣的这位师兄不一般
  2. MIMO系统ML检测(最大似然检测)
  3. 一条龙奇迹私服WEB系统后门及bug
  4. python os模块安装_二十七、深入浅出Python中的 os模块
  5. Yolo-v2_ Windows平台下如何配置darknet-yolov2?(安装CUDA)
  6. Shell函数:Shell函数返回值、删除函数、在终端调用函数
  7. 面对想法简单客户的有效需求分析
  8. 【软件测试】白盒测试与黑盒测试的区别(不同)
  9. iOS阶段学习第31天笔记(UINavigationBar介绍)
  10. C语言通过枚举网卡,API接口可查看man 7 netdevice--获取接口IP地址
  11. stm32for循环几个机械周期_带你了解包装机械设备的可调度性分析
  12. python微博接口_python调用微博api接口
  13. 谈谈js中的异步编程。
  14. 74cms3.0 SQL注入
  15. 半监督学习方法:协同训练
  16. 整车控制器(VCU)开发 之 概述
  17. 设置font标签居中显示
  18. 人工智能--CV视觉方向详细知识体系总结(2021新)
  19. Spring5.x之spring-jcl
  20. python编程猜拳游戏_python写猜拳小游戏

热门文章

  1. Android 开发中问题收集(六):将自己应用添加到微信和QQ其他应用列表
  2. jPlayer播放后台返回的语音流
  3. AI理解不了“他她它”咋办?动词成为新突破口,机器人听到抹黄油就知道拿刀叉 | 清华AIR北大英特尔...
  4. Stata连享会推文列表
  5. CNN可视化技术总结(一)--特征图可视化
  6. 计算机网络——ARPANET设计思想
  7. FLUENT算例 —— Vertical Axis Wind Turbine (Part 1) 垂直轴风力机(第1部分)
  8. mysql触发器和oracle,MySQL与Oracle 差异比较之六触发器
  9. Android使用GPUImage实现滤镜效果精炼详解(一)
  10. 【2021-07-16】堆糖注册(数美滑块)