
这是个有趣的程序,同时是一个全屏模糊处理的范例。
其中,点的非直线自由运动的部分,是用的我在高中时候用 QuickBasic 实现的一种简单方法,看到这部分代码有点让人怀念过去。
简单说明一下:
为了使范例更清晰,全屏模糊处理的代码我做了简化,将第一行和最后一行忽略掉了。通过代码可以清晰地看到,所谓全屏模糊,其实就是对每个点与相邻的几个点的颜色做平均处理(可以自己决定每个点的权重)。
这个模糊函数只处理了每个点的上、下、左、右共 5 个点。为了获得不同的效果,可以试试将周围八个点一起处理,或者上、下、左、右方向上的两个点一起处理。
严格来说,每个点在运算时,所使用的左边和上边的点,其实已经不是原来的点了,而是模糊后的点。所以这样的模糊处理对于单个点来说,右边和下边颜色要淡一些。如果需要精确的模糊,可以借助 IMAGE 实现,这里就不再多说了。
延时没有用常用的 Sleep 实现,而是使用的精确延时,详见文章《精确延时的实
...

这是网上经常见的视觉错觉艺术图片,可以用程序生成的。效果如下:
完整的源代码如下:
///////////////////////////////////////////////////
// 程序名称:视觉错觉艺术4
// 编译环境:Visual C++ 6.0 / 2013,EasyX 20140321(beta)
// 作 者:yangw80 <yw80@qq.com>
// 最后修改:2014-7-15
//
#include <graphics.h>
#include <conio.h>
// 定义回调
void (*callback)(int x, int y);
// 画方块上的小方块
void DrawSmallBox(int x, int y, bool lt, bool rt, bool lb, bool rb)
{
int nx = x * 26 - 13;
int ny = y * 26 - 13;
if
...

这是网上经常见的视觉错觉艺术图片,可以用程序生成的。效果如下:
完整的源代码如下:
///////////////////////////////////////////////////
// 程序名称:视觉错觉艺术1
// 编译环境:Visual C++ 6.0,EasyX 2013霜降版
// 作 者:yangw80 <yw80@qq.com>
// 最后修改:2013-12-16
//
#include <graphics.h>
#include <conio.h>
// 定义常量
#define UNIT 15
#define OFFSET_X 122
#define OFFSET_Y 23
// 画每个小单元
void DrawUnit(int x, int y, int shape)
{
// 定义颜色
static COLORREF c[4] = {0x0000ff, 0x0077ff, 0x00ddff, 0x007
...

这是网上经常见的视觉错觉艺术图片,可以用程序生成的。效果如下:
完整的源代码如下:
///////////////////////////////////////////////////
// 程序名称:视觉错觉艺术2
// 编译环境:Visual C++ 6.0,EasyX 2013霜降版
// 作 者:yangw80 <yw80@qq.com>
// 最后修改:2013-12-16
//
#include <graphics.h>
#include <conio.h>
// 定义常量
#define UNIT 24
#define OFFSET_X 116
#define OFFSET_Y 36
// 画装饰花
void DrawUnit(int x, int y, int shape)
{
// 设置颜色
int n = ((shape & 1) ? 1 : 0) + ((shape & 2) ? 1 : 0)
...

有些同学遇到这样的问题,打开 EasyX 的帮助文档 EasyX_Help.chm 之后,发现所有的内容点击后都是空白的,就像下面这样:
这是由于 Windows 的安全机制造成的,当你从网上直接下载一个 chm 文件,或者用 Windows 资源管理器从压缩包里面解压出来 chm 文件,都会被 Windows 认为目标文件不够安全,然后默认被锁定。
所以,只需要简单解锁就可以了。
这样做:右击 EasyX_Help.chm 文件,在属性页中,会看到底部的“安全”一项,“解除锁定”没有勾选,如下图:
只需要简单的勾选“解除锁定”,然后点击确定,就可以正常浏览 chm 文件了。

有时候程序中会需要一个弹出窗口显示信息,还有些小游戏结束的时候,会简单的弹出一个对话框询问用户是否要重新来一句,如下图:
这篇文章就简单讲解一下这个功能如何实现。
首先,我们需要使用一个 Windows API 函数:MessageBox。该函数原型如下:
int MessageBox(
HWND hWnd, // handle to owner window
LPCTSTR lpText, // text in message box
LPCTSTR lpCaption, // message box title
UINT uType // message box style
);
第一个参数 hWnd 是指向父窗口的句柄,可以通过 EasyX 的函数 GetHWnd() 得到绘图窗口的句柄;
第二个参数 lpText 是要显示的字符串;
第三个参数
...

平时常用的图片格式有 bmp、jpg(jpeg)、gif、png 等。其中,bmp 是无损压缩,文件体积比较大,通常都会用其他格式来代替 bmp。所以本文着重讲 jpg、gif、png 三种格式。
首先必须要提到的是:修改图片扩展名并不会修改图片格式。图片格式,是图片各像素点的组织方式,不同的格式有不同的文件头和压缩算法等。而扩展名,仅仅是一个格式的标识,方便人们辨识格式。只修改扩展名,会造成图片文件的标识与内容不符,影响图片加载。因此,必须通过绘图软件将图片保存为相应格式。
图片格式的区别
jpg 适合保存照片这类颜色丰富、图案复杂的图像,使用有损压缩。尤其在保存简单颜色的图像时,有损压缩会使颜色边缘出现“不干净”的问题。
gif 适合保存颜色简单、内容简单的图像,使用无损
...

这是一个贪吃蛇大作战类游戏,修改特性为 AI 不互杀;
该程序有四个类:蛇基类 SnakeBase,玩家类 Player,AI 类,Game 类;
SnakeBase 和 AI 均继承自 SnakeBase,SnakeBase 提供基础接口;
Game 提供数据初始化以及游戏主循环。
程序设计之初,采用“实运行”方式,即所有动画均在地图 imgMap 上真实绘制,
这样却有一些严重的问题,需要不断地记录节点背景以恢复节点经过的地方等。
后修改为“虚运行”方式,判断位置是否可视后直接绘至窗口内,
这样大大降低时间开销,同时不会因为蛇靠近而产生不可擦除的颜色。
至于蛇运行,采用位置继承,即节点下一个位置为上一个节点的位置,但是会发现跨度太大,
解决办法是在这个跨度中插入适当帧数。
执行效果如下:
完整代码如下:
/*
程序名称:
贪吃蛇大作战
...

这不是一个游戏,而是算法分享和算法演示。
通过简单绘图,使得算法的执行过程可视化。
包含两个文件:头文件 MazeAlgorithm.h 和 源文件 main.cpp。
main.cpp 给出基本控制和简单文字按钮。
MazeAlgorithm.h 给出算法的实现和演示绘图,包含算法如下:
一、迷宫生成:
① DFS(即深度优先)递归和非递归版本。
② 十字分割 递归和非递归版本。
③ 随机 Prim。
二、迷宫寻路:
① DFS(分为随机方向 和 指定优先遍历方向,是同一个接口)。
② A* 寻路。
这对于初学者而言或有难度,而且许多教程只是给出简陋的文字描述,很难上手代码。
若以后有时间,我尽量去完成一篇迷宫算法的博客,然后回头补链接。
以下对这些算法给出简单说明(注:这不足以让你深刻理解算法原理
...

这是一个简单的烟花程序,纯代码实现,
代码总长约 260 行,若有心去看应该不难看懂,相关注释已写于源码中。
3D 到 2D 转换 和 物理轨迹严格按照公式计算,
其余个别参数根据估计调试而设置,不用深究。
程序用到的 EasyX 绘图 主要是 solidcircle 和 putpixel,
更多的是对 语言特性、基础数学和物理的应用,亦可见其重要性。
编程之路,需要的不仅仅是语言,愿君共勉。
最后祝大家新年快乐!
界面截图:
源代码:
/*
程序名称:
烟花(Fireworks)
简介:
用 EasyX 实现的一个简单的烟花程序
加入 z 轴以实现简单的 3D 视觉效果
物理计算时 1 像素等效 10cm
注:计算 3D->2D 时,未采用斜二测画法,而是不计
...

纯代码实现的一个简单的炸金花的小游戏。
市面上的炸金花似乎已经被禁,因此模拟时没有参考,或许有一些不足。
由于简单模拟,所以没有太多的动画和界面。
程序由 三个头文件 和 一个源文件 组成,便于分块管理。
一、"Cards.h"
封装了卡牌底层,由三个类组成,单张牌类、三张牌类 和 52 张牌的类。
有控制台的输出测试接口。
二、“CardGraph.h”
该文件主要是进行绘图,根据扑克的底层数据进行相关绘制。
修改:利用宽字符输出实现花色,而不是直接绘制。
绘制卡片背面心形时,仅需两条直线和两条贝塞尔曲线即可,这里不过多说明。
三、"Controller.h"
该文件是游戏的控制文件,处理按钮、鼠标、发牌等等操作。
由两个类组成,Butt
...

基于 EasyX 的迷宫小游戏,有三种随机生成算法。
包含九个文件
- Maze.h : 初始化头文件
- Maze.cpp : 程序开端文件
- Game.h : 游戏类头文件
- Adventrue.cpp : 冒险模式类文件
- Forest.cpp : 冒险模式-森林系列类实现文件
- Dungeon.cpp : 冒险模式-地牢系列类实现文件
- Infernal.cpp : 冒险模式-地狱系列类实现文件
- Help.cpp : 帮助信息类实现文件
- Other.cpp : 刷新界面、放置按钮、输出对话框类实现文件
包含算法
- 森林系列:Prim 算法
- 地牢系列:图论 DFS 算法
- 地狱系列:暴力 DFS 算法
算法说明
以下对这些算法给出简单说明,详细请自行学习(比较有难度):
...

微软应用商店里面有个有趣的镜像绘图程序 Mirror Paint,以下代码模拟了这个镜像绘图程序的基本功能,效果如下:
完整代码如下:
///////////////////////////////////////////////////////////
// 程序名称:迷盘(mirror_paint)
// 编译环境:Visual Studio 2017 / EasyX_20180727(beta)
// 程序编写:忧郁 506688268@qq.com
// 最后更新:2018-08-09
////////////////////////////////////////////////////////////
#include <graphics.h>
#include <iostream>
const int Width = 1280; // 客户区宽
const int Height = 720;
...