分享代码 快乐编程

一起学习,一起进步,从分享代码开始~

烟花

这是一个简单的烟花程序,纯代码实现,

代码总长约 260 行,若有心去看应该不难看懂,相关注释已写于源码中。

3D 到 2D 转换 和 物理轨迹严格按照公式计算,

其余个别参数根据估计调试而设置,不用深究。

程序用到的 EasyX 绘图 主要是 solidcircle 和 putpixel,

更多的是对 语言特性、基础数学和物理的应用,亦可见其重要性。

编程之路,需要的不仅仅是语言,愿君共勉。

最后祝大家新年快乐!

源代码:

/*
	程序名称:
			烟花(Fireworks)

	简介:
			用 EasyX 实现的一个简单的烟花程序
			加入 z 轴以实现简单的 3D 视觉效果
			物理计算时 1 像素等效 10cm
			注:计算 3D->2D 时,未采用斜二测画法,而是不计 z 轴对 x-y 的影响
			理由是:
				1. 视觉的 z 轴是垂直窗口的
				
...

二维天体模型(by 悠远的苍穹)

一直很喜欢《三体》这部科幻小说,其中诡异的三体运动让我想要一探究竟,
便想着试着模拟一下三体运动,或是多天体的运动情况。

在三体模拟中,大多数情况下,系统都很不稳定,天体之间会很快发生吞噬或逃逸,
吞噬后可能会成为相对稳定的双星系统,当然也有很大概率会再次发生吞噬成为单星系统;
若是逃逸的话,这基本上大概率是没再见面的希望了。
而若是想要找到一个一定时间内相对稳定的三体系统那会很不容易!

在多天体模拟中,粗略估计有一半的情况中心天体能够捕获到一些小天体成为它的卫星,
直接逃逸的天体也时有出现,或者是进入了一个很大周期的轨道中。

此程序只是简单的粗略模拟,一些参数均无实际意义,且本程序仅为一个二维模拟。

执行截图如下:

完整的源代码如下:

///////////////////////////////////////////////////////

...

热力学模拟实验(by 常数变易法)

这个程序是热力学模拟实验。

学热力学与统计物理的时候就想设计一个程序模拟气体分子的运动,这样就能直观地检测那些热力学公式的正确性。
这个程序设计成所有粒子之间的力都是斥力,粒子和边界之间也有斥力。粒子在二维平面运动。

程序的动态执行效果如下:

完整代码如下:

// 项目:热力学模拟实验
// 作者:常数变易法(QQ:1375989292)
// 时间:2019.12.19
// 环境:VC6.0

// 学热力学与统计物理的时候就想设计一个程序模拟气体分子的运动,这样就能直观地检测那些热力学公式的正确性。
// 这个程序设计成所有粒子之间的力都是斥力,粒子和边界之间也有斥力。粒子在二维平面运动。

// 版权:作者原创,无抄袭,不涉及版权问题,仅用作学习

#include <graphics.h>						// 引用图形库头文件
#include <stdio.h>
#include 

...

博弈五子棋(人机对战)

基于 EasyX 的五子棋软件。

算法部分想了很久,也参考了网上的其他游戏的。原理主要就是:遍历每个空闲的点,根据下在那个点后连成的棋形来判断其分值,再选出分值最高的位置并返回给游戏函数。

还在上小学,更深层次的判定算法还没学,就先将就一下吧。

运行效果如下:

完整源代码如下:

////////////////////////////////////////////////////////
// 程序名称:博弈五子棋
// 编译环境:Visual C++ 2019		EasyX_20190529(beta)
// 作  者:陈可佳 <emil09_chen@126.com>
// 最后修改:2019-9-30
//
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <gra
...

贪吃蛇大作战

这是一个贪吃蛇大作战类游戏,修改特性为 AI 不互杀;

该程序有四个类:蛇基类 SnakeBase,玩家类 Player,AI 类,Game 类;
SnakeBase 和 AI 均继承自 SnakeBase,SnakeBase 提供基础接口;
Game 提供数据初始化以及游戏主循环。

程序设计之初,采用“实运行”方式,即所有动画均在地图 imgMap 上真实绘制,
这样却有一些严重的问题,需要不断地记录节点背景以恢复节点经过的地方等。

后修改为“虚运行”方式,判断位置是否可视后直接绘至窗口内,
这样大大降低时间开销,同时不会因为蛇靠近而产生不可擦除的颜色。

至于蛇运行,采用位置继承,即节点下一个位置为上一个节点的位置,但是会发现跨度太大,
解决办法是在这个跨度中插入适当帧数。

执行效果如下:

...

纯软件算法实现 3D 渲染(by 桌子)

大部分说明在源码中可以看见,这个项目是在尝试做软件渲染器时边想边做的,模仿了很多 OpenGL 的 API 定义(类似 OpenGL 运行库),然后在 main.cpp 里面写用户自己的模型及贴图代码。

软件运行可以得到如下的效果:

主要实现的功能:

  • 一些简单的数学运算(矩阵相乘,向量叉乘等)
  • 使用扫描线多边形填充算法绘制多边形
  • 线性插值(linear interpolation)
  • 透视校正插值(perspective correct interpolation)
  • 深度测试(用于消隐)

一些我想到的但是暂时没实现的功能:

  • 不支持 ddx 和 ddy,所以没有 Mipmap,因为实现起来比较麻烦。
    ddx 和 ddy 是指在屏幕空间上求 vbo 的偏导数。真正的 GPU 绘制的时候是在
...

高仿版扫雷

这是个高仿的扫雷游戏,游戏手感非常贴近原版。

代码由两个类构成,基类 Graph 对 IMAGE 进行绘制,同时生成界面,初始化相关数据。MineSweeper 类继承 Graph 类,主要进行相关操作,识别按钮等做出反应。

执行效果如下:

完整的游戏源码如下:

/*
	程序名称:扫雷

	简  介:一款经典的小游戏,程序运行中可以通过 ESC 直接退出
			 左键点击,右键标记和取消标记,同时按下左右或按下中间键触发提示
			 其他操作基本和官方一致,界面略有调整,详细操作自行测试

	编译环境:VS2019 + EasyX_20190529(beta)

	编写时间:2019-6-29
	最后修改:2019-7-30

	作  者:Teternity(qq1926594835)

	版  权:作者原创,无抄袭,不涉及版权问题,仅用作学习
*/

// 头文件
#include <easyx.h>
#in
...

贪婪球 2.0(by 奶酪)

贪婪球第一版在这里:https://codebus.cn/contributor/post/greedy-ball

2.0 版本相对第一版做了如下修改:

  1. 视野缩放,会随着体积增大视野变大,解决一代玩家球过大挡住屏幕现象
  2. 增加高杀伤力毒圈,解决满地图跑问题
  3. 提高敌人 AI 智商,会主动吃食物
  4. 修复若干已知 bug
  5. 扩大了游戏区域
  6. 全部用 c++ 重写

执行效果如下:

完整的源代码如下:

///////////////////////////////////////////////////
// 程序名称:贪婪球 2.0
// 编译环境:Microsoft Visual stu

...

程序员专用的打字练习程序(by 温良)

这是一个专门给初学 C 语言的同学用的练习打字的程序。

屏幕上会落下来几个单词(都是 C 语言的关键字),然后通过键盘输入任意一个单词,如果输入正确,下落的对应单词就会消失。

程序会统计实时的准确率和打字速度等数据。

执行效果如下:

完整的源代码如下:

//////////////////////////////////////////////////////
// 程序名称:C 语言码农专用的打字练习程序
// 编译环境:Visual C++ 2008, EasyX_20190415(beta) 
// 作  者:温良(大一)
//    QQ:1677376433
// 最后修改:2019-5-10
//
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <stdio.h>
...

EasyUI:基于 EasyX 的 UI 界面库(by 祝融)

EasyUI 类构成指南

EasyUI 将 UI 拆分成了两个部分--绘制单元和事件触发器。
使用者可以使用绘制单元来控制 UI 的风格,同时选择一定的事件触发器来使 UI 具备响应事件的功能。

绘制单元:

-CDrawCell:所有绘制单元的基类
-CSimpleShape:继承自 CDrawCell,集成了通过 EasyX 图形绘制函数绘制的图形属性
-CHaveSize:所有拥有大小的类的基类
-CRect:继承自 CSimpleShape,绘制一个矩形
-CRoundRect:继承自 CSimpleShape,绘制一个圆角矩形
-CCircle:继承自 CSimpleShape,绘制一个圆形,并以绘制位置为中心(所有绘制单元都从左上角画起,除了圆)
-CEllipse:继承自 CSimpleShap,绘制一个椭圆(通过外接矩形)
-CText:继承自 CDrawCell,输出一串字符串
-CUIImage:继

...