自由运动的点(全屏模糊处理的范例) 铜牌收录

这是个有趣的程序,同时是一个全屏模糊处理的范例。

其中,点的非直线自由运动的部分,是用的我在高中时候用 QuickBasic 实现的一种简单方法,看到这部分代码有点让人怀念过去。

简单说明一下:

  1. 为了使范例更清晰,全屏模糊处理的代码我做了简化,将第一行和最后一行忽略掉了。通过代码可以清晰地看到,所谓全屏模糊,其实就是对每个点与相邻的几个点的颜色做平均处理(可以自己决定每个点的权重)。

  2. 这个模糊函数只处理了每个点的上、下、左、右共 5 个点。为了获得不同的效果,可以试试将周围八个点一起处理,或者上、下、左、右方向上的两个点一起处理。

  3. 严格来说,每个点在运算时,所使用的左边和上边的点,其实已经不是原来的点了,而是模糊后的点。所以这样的模糊处理对于单个点来说,右边和下边颜色要淡一些。如果需要精确的模糊,可以借助 IMAGE 实现,这里就不再多说了。

  4. 延时没有用常用的 Sleep 实现,而是使用的精确延时,详见文章《精确延时的实

...

视觉错觉艺术4 铜牌收录

这是网上经常见的视觉错觉艺术图片,可以用程序生成的。效果如下:

完整的源代码如下:

///////////////////////////////////////////////////
// 程序名称:视觉错觉艺术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 铜牌收录

这是网上经常见的视觉错觉艺术图片,可以用程序生成的。效果如下:

完整的源代码如下:

///////////////////////////////////////////////////
// 程序名称:视觉错觉艺术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 铜牌收录

这是网上经常见的视觉错觉艺术图片,可以用程序生成的。效果如下:

完整的源代码如下:

///////////////////////////////////////////////////
// 程序名称:视觉错觉艺术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_Help.chm 后,内容为空白的解决办法 铜牌收录

有些同学遇到这样的问题,打开 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,以下代码模拟了这个镜像绘图程序的基本功能,效果如下:

完整代码如下:

///////////////////////////////////////////////////////////
// 程序名称:迷盘(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;           
...

诺基亚经典贪吃蛇 铜牌收录

纯代码实现的经典贪吃蛇。相信贪吃蛇是不少人儿时的美好记忆。诺基亚的像素版贪吃蛇,曾经风靡一时。今天,我用 EasyX 实现了它。操作方法:可通过 wasd 或上下左右键控制蛇的移动;通过食物的成员函数 color 将吃掉食物后增加的节颜色设定为吃掉食物的颜色;每得 500 分,增加一个食物,但食物总数不超过 10 个;撞墙或撞到自己即为死亡。这是本人第一次发表代码,且本人为初中生,如有可改进之处欢迎提出建议!

3D图形学知识汇编 金牌收录

最近我在学习计算机图形学的时候大量的上网翻书查阅资料,但是从网上和部分书籍里面看到的知识有些零散,所以我作此文章,将这些知识点串联起来。我的演示代码只是提供一个参考,希望读者通过阅读本文自己实现相应功能。本书主要是介绍 3D 渲染的流程和原理,所以有几乎没有对代码进行优化。如果要实现可用的高性能的渲染器,代码优化是必不可少的。   之前我写了一些图形学的教程,但是经过验证,发现里面有一部分数学推导是错误的(深度测试的插值算法,在齐次空间中裁剪的解释和证明),甚至深度插值的错误会导致错误的渲染结果(并且这个错误还不太明显,所以我一直没发现自己的错误),为此我重新修订了绝大部分的内容,这次经过我一个人(还是有点势单力薄)的努力推导,修复了上述的错误,整个教程的结构也进行的大改。但是我知识有限,可能还有很多错误存在其中,如果有读者能找到错误,还望不吝赐教。