目录

前言

完整代码

二维数组的含义和初值

大致思路


前言

声明:本游戏参考《c语言课程设计与游戏开发实践教程》。

视频效果如下:

泡泡

  • 很多泡泡以不同的速度相互碰撞,或者和墙壁碰撞。碰撞之后相互交换速度,呈现出一种唯美的效果。大家记得以前电脑桌面待机时的画面吗,是不是很相似呢?

涉及基础知识:

printf和scanf,宏定义常量,运算符,定义全局变量,for循环,while循环,if语句,二维数组。

(可能的)拓展知识:

rand函数,Sleep函数,easyx的使用。

rand函数见这篇文章,目录中可以找到

http://t.csdn.cn/OjtmD

Sleep函数见这篇文章,目录中可以找到

http://t.csdn.cn/gqR0x

Easyx的安装类似于一个插件,官网如下

http://www.easyx.cn/downloads/

(好像vs和vc++可以装,devc++装不了。还是不清楚可以去b站查教程)

下面放代码。代码中有详细的注释说明。

完整代码

#include <stdio.h>
#include <graphics.h>
#include <math.h>#define high 480#define width 640#define ball 15//小球个数
//先给五个小球进行初始化定义和赋值,绘出基本画面。
//再利用while(1)循环显示动态画面int main()
{float x[ball], y[ball];float speed_x[ball], speed_y[ball];float radius = 30;int i, n;//初始化赋值。用这种方法是因为让小球在不出屏幕的前提下随机出现,并且随机速度for (i = 0; i < ball; i++){y[i] = rand() % int(high - 4 * radius) + 2 * radius;x[i] = rand() % int(width - 4 * radius) + 2 * radius;speed_y[i] = (rand() % 2) - 1;speed_x[i] = (rand() % 2) - 1;}initgraph(width, high);BeginBatchDraw();
//批量绘图函数,配合FlushBatchDraw()和RndBatchDraw()函数使用while (1){//先画黑球,目的是盖住彩色球的运动轨迹setcolor(BLACK);setfillcolor(BLACK);for (i = 0; i < ball; i++)fillcircle(x[i], y[i], radius);//更新圆坐标for (i = 0; i < ball; i++){x[i] += speed_x[i];y[i] += speed_y[i];}//判断是否撞墙for (i = 0; i < ball; i++){if ((x[i] <= radius) || (x[i] >= width - radius))speed_x[i] = -speed_x[i];if ((y[i] <= radius) || (y[i] >= high - radius))speed_y[i] = -speed_y[i];}float record[ball][2];//这个二维数组的1储存原小球编号,2分别储存距离和那个小球编号//二维数组赋值初始化for (i = 0; i < ball; i++){record[i][0] = 9999999;record[i][1] = -1;}//求所有小球两两间距离平方for (i = 0; i < ball; i++){for (n = 0; n < ball; n++){if (i != n){//勾股定理float dist2;dist2 = (x[i] - x[n]) * (x[i] - x[n]) + (y[i] - y[n]) * (y[i] - y[n]);if (dist2 < record[i][0]){
//这类似于函数的极限。两个动态的量进行比较最终record会被赋予最小的那个数
//而这个最小的数就是第i个小球距离它最近的小球的距离的平方record[i][0] = dist2;record[i][1] = n;}}}}//判断球和球之间会不会相撞for (i = 0; i < ball; i++){if (record[i][0] <= 4 * radius * radius){int t = record[i][1];//下面进行交换速度int temp;//temp n.临时(职员)temp = speed_x[i];speed_x[i] = speed_x[t]; speed_x[t] = temp;temp = speed_y[i];speed_y[i] = speed_y[t]; speed_y[t] = temp;//因为两个相聚最近的小球有可能归于彼此都是最近的,这种情况会发生二次交换速度
//所以给离球i最近的球重新赋初值,避免交换两次速度record[t][0] = 9999999;record[t][1] = -1;}}//画彩色的圆,颜色自调setfillcolor(RGB(190, 250, 255));setcolor(RGB(50, 200, 255));for (i = 0; i < ball; i++)fillcircle(x[i], y[i], radius);FlushBatchDraw();Sleep(2);}EndBatchDraw();closegraph();return 0;
}

二维数组的含义和初值

这个二维数组的作用就是储存一个小球相聚最近的小球的距离和编号。

  • record[ball][2]:ball就是球的数量对吧,这个元素就是用来储存原来小球编号。record[i][0]用来存第i个球和它距离最近球的距离平方;record[i][1]用来存第i个球和它距离最近球的编号。
  • 为啥赋值9999999和-1呢,因为9999999肯定比任意两个球之间距离的平方都大,后边判断的时候就很明确。-1是因为没有小球的编号是-1,保证不跟后面要赋的值冲突。

大致思路

  1. while(1)之前做预处理和小球坐标的初始化。while(1)之内显示画面。
  2. 进入while(1)内,先画了一个黑球。这个黑球的坐标其实正好是彩色球桌标的前一个位置坐标。因为画完黑球之后xy坐标都被+1,都往前移一个坐标,所以新球(彩球)坐标比黑球领先一个,这也使得黑球能够覆盖住彩球的运动轨迹。
  3. 中间的碰撞等一系列操作其实是对黑球和彩球同时作用的,这样使得两个球的运动相对同步。
  4. 中间先判断和墙碰撞,如果装了速度就变反;再判断球球之间的碰撞,碰撞之后会借用temp变量交换速度(这个速度看作矢量)。
  5. 最后,彩球的位置其实放在更新坐标语句之后也可以,因为要和黑球错一个位置嘛。

其实在while(1)之内的几个语句功能是环环相扣的,不同语句按照不同顺序排列,组成了一个完整顺畅的程序。

如果有什么不懂的地方可以随时问我

就酱,拜拜~

c语言初级小游戏 · 碰撞的泡泡 | 激发你的编程兴趣相关推荐

  1. c语言初级小游戏 · 闯关小鸟 | 激发你的编程兴趣(115行左右代码)

    目录 制作一个可控制上下飞行的小鸟 Sleep函数 添加障碍墙,并且让障碍墙移动.重现 补充计分功能&&呈现完整代码 声明:本游戏参考<c语言课程设计与游戏开发实践教程>. ...

  2. c语言初级小游戏 · 弹跳小球 | 激发你的编程兴趣(约50行代码)

    目录 前言 需要的知识点 清屏函数system("cls") Sleep函数 标识符的命名 先浅做一个会跳的小球 再让小球完整的跳 前言 声明:本游戏参考<c语言课程设计与游 ...

  3. c语言 倒计时不清屏_打字游戏超细讲解(C语言基础小游戏)

    首先我们会发现我们网上看到的打字游戏都是上来就敲代码,小白看的一脸懵,所以鑫哥在这给大家送上一份超级详细的打字游戏编写流程及对应的结果展示,希望可以帮到小白进行入门学习. 话不多说,我们先看一下什么叫 ...

  4. c语言经典游戏,C语言——经典小游戏——打砖块

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言--经典小游戏--打砖块 玩法:按A与D控制球拍的移动,按S暂停游戏 百度网盘下载:http://pan.baidu.com/s/1o64ECTc ...

  5. c语言2048代码linux,C语言2048小游戏课设(附源码).doc

    PAGE PAGE 1 C语言2048小游戏课设 项目说明 本系统基于C语言开发,适用于刚入门的C语言新手项目课设,开发软件采用VC++6.0开发,VS,DEV C++等均可运行.(书生) 项目运行截 ...

  6. c语言五子棋学年论文,基于c语言五子棋小游戏生本科论文.doc

    基于c语言五子棋小游戏生本科论文 五子棋小游戏 需求分析 现在有越来越多的人使用电脑,而且五子棋的受众广泛但实体棋操作较为繁琐且平时较难实现,所以电脑版的五子棋游戏应运而生.大家对于这个小游戏的需求如 ...

  7. 用c语言编写的打字母游戏,用C语言编写小游戏——“井字棋”

    原标题:用C语言编写小游戏--"井字棋" 作者:Milo Yip 来源:知乎 原文链接:https://zhuanlan.zhihu.com/p/39581573 在 Milo Y ...

  8. C语言自制小游戏:三子棋(井字棋)智能下棋补充

    目录 一.前期准备 二.逻辑与程序实现 1.连珠 ①横向连珠 ②纵向连珠 ③斜向连珠 ④函数完善 2.堵棋 ①横向堵棋 ②纵向堵棋 ③斜向堵棋 3.整理函数 ①整理AI_Computer函数 ②修改C ...

  9. C语言实现小游戏——模拟微信小游戏《最强飞刀手》

    C语言实现小游戏--模拟微信小游戏<最强飞刀手> 曾经玩过的微信小游戏,想着用C语言实现,只可惜,下图是我的上限. 这个下游戏界面简陋,把旋转的西瓜做成了平的接盘:实现的功能有:接盘的移动 ...

最新文章

  1. R 语言柱状图示例笔记
  2. git 常用命令整理
  3. 微信公众平台操作获取token类
  4. mysql分别写出3条索引_MySQL3:索引
  5. java中List与Map的使用
  6. 小程序类似抖音视频整屏切换
  7. 列主元消去法例题详解_高斯列主元消元法解方程组的步骤
  8. 2_Recurrent Neural Networks (RNNs)循环神经网络 —Simple RNNs
  9. Bzoj2732 [HNOI2012]射箭
  10. DCMTK: DcmSCP, error:QueryRetrieveLevel larger remaining bytes
  11. 《Android游戏开发详解》一2.9 类
  12. Yii Framework2.0开发教程(1)配置环境及第一个应用HelloWorld
  13. 90后游戏开发大神毛星云跳楼自杀!8年执着国产3A梦碎
  14. STM32F1开发指南笔记20----数码管驱动芯片TM1640解析
  15. 使用腾讯云OCR文字识别
  16. 魔兽争霸3 ce基址 偏移
  17. ffmpeg隔几秒取一帧
  18. LWN:Linux audio plugin APIs综述!
  19. libreCAD使用
  20. 2.Linux下程序代码的编译

热门文章

  1. Imagination光线追踪助力开发者打造优质移动游戏
  2. 正在OA选型?这份OA行业排名一定要先看看
  3. Linux命令之条件判断-case
  4. 中专学的计算机大学可以换专业吗,计算机中专升大专可以换专业吗
  5. IOS证书申请(失败,香蕉云编要续费,待更新)
  6. LSU——1116 Necklace(尺取)
  7. 两条平行线相交于一点
  8. Android中APK安装过程及原理解析
  9. 电子元器件为什么要做老化测试?
  10. 谈asch系统的共识机制与容错性