慢羊羊的空间

无为,无我,无欲,居下,清虚,自然

数字拼图游戏

这是一个简易的拼图游戏。

其实很多时候,精彩的游戏不一定非要用图片。将游戏的功能和手感都做好,游戏一样好玩。

所以我就做了这个拼图游戏当作例子。运行效果如下:

完整的 VC 源代码如下:

/////////////////////////////////////////////////////////
// 程序名称:数字拼图游戏
// 编译环境:Visual C++ 2010,EasyX_20210730
// 作    者:慢羊羊
// 发布日期:2021-3-26
// 最后修改:2021-8-3
//
#include <graphics.h>
#include <time.h>
#include <conio.h>


IMAGE	g_Block[16];		// 拼图碎片
byte	g_Map[4][4];		// 游戏地图(存储了每个碎片的下标)
byte	g_E
...

用绘图语句画安卓(android)机器人(初学 C 语言的同学必看)

学编程最需要注意的就是多动手,多练习。不管你学了多少,学一点,就要练习一点。哪怕没有学习循环和判断,都可以写出一些不错的程序来。

所以,我写了这个范例程序给大家参考。希望可以抛砖引玉,给初学 C 语言的同学以启发。

执行效果如下:

VC 源代码如下:

/////////////////////////////////////////////////////////////
// 程序名称:用绘图语句画安卓(android)机器人(初学 C 语言的同学必看)
// 编译环境:Visual C++ 6.0 / 2010,EasyX_20210730
// 作  者:yangw80 <yw80@qq.com>
// 发布日期:2014-10-9
//
#include <graphics.h>
#include <conio.h>

const double PI = 3.1415926536
...

用绘图语句画机器猫(初学 C 语言的同学必看)

学编程最需要注意的就是多动手,多练习。不管你学了多少,学一点,就要练习一点。哪怕没有学习循环和判断,都可以写出一些不错的程序来。

所以,我写了这个范例程序给大家参考。希望可以抛砖引玉,给初学 C 语言的同学以启发。

执行效果如下:

具体这个家伙叫机器猫还是小叮当还是多啦A梦就不管啦,看代码吧:

/////////////////////////////////////////////////////////////
// 程序名称:用绘图语句画机器猫(初学 C 语言的同学必看)
// 编译环境:Visual C++ 6.0 / 2010,EasyX_20210730
// 作  者:yangw80 <yw80@qq.com>
// 发布日期:2014-9-17
//
#include <graphics.h>
#include <conio.h>

const double PI = 3
...

视觉错觉艺术3

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

完整的源代码如下:

///////////////////////////////////////////////////
// 程序名称:视觉错觉艺术3
// 编译环境:Visual C++ 6.0 / 2010,EasyX_20210730
// 作  者:yangw80 <yw80@qq.com>
// 最后修改:2014-7-14
//
#include <graphics.h>
#include <conio.h>


// 定义回调
void (*callback)(int x, int y);


// 圆中的每个点(回调函数)
void CirclePoints(int x, int y)
{
	if (x < y)
	{
		COLORREF c1 = getpixel(x, y);
		COLORREF c2 = getpix
...

计算任意扇形的最小包围矩形

今天很偶然需要这样一个东西:

求任意扇形的最小包围矩形,要求矩形的边是水平、垂直的。

这个东西看似很简单,但是仔细一想,需要注意的地方蛮多的,还真有点不好下手。再回想一下,好像没有那本书里面讲过。然后百度了一下,似乎也没找到有效的方法。于是我就花了点时间搞定了这个东西,然后顺手写了一个例子演示效果。

如果您有更好的方法,十分期待交流一下。

以下代码除了包含必要的求解任意扇形的最小包围函数之外,还加上了鼠标操作:按下左键移动鼠标,可以调整终止角的弧度;同时按下 Shift 键移动,可以调整起始角的弧度。

执行效果如图:

完整代码如下:

///////////////////////////////////////////////////
// 程序名称:计算扇形的最小包围矩形
// 编译环境:Visual C++ 6.0 / 2019,EasyX 20210730
// 作  者:y
...

扔香蕉的大猩猩(怀旧)

又是一个怀旧的游戏,让我想起了以前学习编程的时候。

这个游戏模仿的微软在 20 多年前的一个小游戏,不知道谁也有印象呢?图片都是从原来的游戏中抓图弄出来的,颜色也是从原游戏抓图中取色设置的,应该和原来的风格很像。

你的任务是用香蕉击中你的对手。

你可以通过鼠标调整投掷香蕉的角度和力度,香蕉会受重力加速度的影响。同时,请注意屏幕底部表示风力的箭头,香蕉同样会受风力影响。风力的箭头越长,表示风力越强。还有,周围的楼宇会阻挡你的香蕉。

游戏运行效果如下:

完整的源代码和图片可以【点击这里下载】。

也可以直接查看如下游戏源代码(注意,除了以下代码,还需要两个图片文件,在前面的压缩包里面有):

// 程序名称:扔香蕉的大猩猩
// 编译环境:Visual C++ 6.0 ~ 2019,EasyX_20210730
// 作  者:慢羊羊 <yw80@qq.com>
// 发布日期
...

力学:鼠标用弹簧挂着一串小方块

这个程序模拟了几个小方块用弹簧连接到鼠标上的效果。当鼠标在绘图窗口上移动时,可以看到小方块连续受力的效果。

动态程序就不再抓图了。源代码如下:

///////////////////////////////////////////////////
// 程序名称:力学:鼠标用弹簧挂着一串小方块
// 编译环境:Visual C++ 6.0 / 2010,EasyX_20210730
// 移植作者:yangw80 <yw80@qq.com>
// 发布日期:2012-4-27
//
#include <graphics.h>
#include <math.h>
#include <time.h>

const	int		WIDTH = 640;		// 窗口宽
const	int		HEIGHT = 480;		// 窗口高
const	int		BOXCOUNT = 10;		// 方块的数量
const	int		BOXSIZE = 10;		
...

力学:弹跳球模拟程序

本程序根据物理原理模拟一个球自由落体并持续弹跳的效果,小球只受重力影响,忽略空气阻力,反弹时能量损耗 10%。

程序源代码如下:

////////////////////////////////////////////////////////////////////
// 程序名称:物理反弹球模拟程序
// 编译环境:VC6.0 / 2019,EasyX_20210730
// 作  者:yw80@qq.com
// 最后修改:2012-3-29
//
#include <graphics.h>
#include <conio.h>

int main()
{
	double h = 300;				// 高度
	double v = 0;				// 速度(方向向下)
	double dv = 9.8 / 50;		// 加速度(每 1/50 秒)

	// 初始化绘图窗口
	initgraph(640, 480);

	// 画地平线
	line(100, 421, 
...

[图形学] 画圆(基于 Bresenham 算法)

图形学中的 Bresenham 画圆算法是基于中点画圆算法的派生,以下是该算法的 C 语言实现:

///////////////////////////////////////////////////
// 程序名称:基于 Bresenham 算法画圆
// 编译环境:Visual C++ 6.0 / 2010,EasyX_20210730
// 作  者:YangW <yw80@qq.com>
// 最后修改:2011-5-3
//
#include <graphics.h>
#include <conio.h>

// 使用 Bresenham 画圆法
void Circle_Bresenham(int x, int y, int r, int color)
{
	int tx = 0, ty = r, d = 3 - 2 * r;

	while( tx <= ty)
	{
		// 利用圆的八分对称性画点
		putpixel(x + tx, y + ty, 
...

[图形学] 画圆(基于中点算法)

图形学中的中点画圆算法,以下是该算法的 C 语言实现:

///////////////////////////////////////////////////
// 程序名称:基于中点算法画圆
// 编译环境:Visual C++ 6.0 / 2010,EasyX_20210730
// 作  者:YangW <yw80@qq.com>
// 最后修改:2011-4-29
//
#include <graphics.h>
#include <conio.h>

// 中点画圆法
void Circle_Midpoint(int x, int y, int r, int color)
{
	int tx = 0, ty = r, d = 1 - r;

	while(tx <= ty)
	{
		// 利用圆的八分对称性画点
		putpixel(x + tx, y + ty, color);
		putpixel(x + tx, y - ty, color);
		p
...

做个纪念:椭圆组合而成的抽象图案

每次看到这个程序我就会想起高中时曾那么痴迷编程。当时看到一本书的封面有这个图案,就用那个时候学的 QuickBasic 写了这个程序。现在移植到 VC 上,做个纪念吧。

执行效果如下:

代码如下:

// 程序名称:椭圆组合而成的抽象图案
// 编译环境:Visual C++ 6.0/2010,EasyX_20210730
// 最初编写:1998-2-21,by yw80@qq.com(QuickBasic 版本)
// 最后修改:2011-3-23,by yw80@qq.com
//
// 高中时候看到一本书的封面有这个图案,就用当时学的 QuickBasic 写了这个程序。
// 现在移植到 VC6 上,做个纪念。
//
#include <graphics.h>
#include <conio.h>
#include <math.h>

const double PI = 3.141592653
...

[分形学] 可以无穷放大的 Mandelbrot Set (曼德布洛特集) VC 源代码

基于上篇文章 Mandelbrot Set (曼德布洛特集) 的源代码:
https://codebus.cn/yangw/mandelbrot-set

我修改了几个地方:

1. 修改了颜色,使用黑->蓝->白->棕->黑这样的渐变颜色方案(当然,可以修改 InitColor() 函数改变配色方案)

2. 增加了放大鼠标选中区域的功能。按鼠标中键可以恢复原尺寸。

3. 将迭代次数提了出来,定义了常量。如果需要绘制更精细的图,请加大常量 ITERATIONS。不过越大绘制的越慢。精细程度开始看不出来,放大次数多了就明显了。

4. 理论上是可以无穷放大,但实际受 double 类型精度的影响,放大到一定程度就会是马赛克了。

先看看逐步放大的效果吧:

另一个位置的逐步放大效果:

代码如下:

...

鼠标操作演示

该程序是 EasyX 帮助中的范例程序。

该程序示范了常见的鼠标操作,程序执行后会在鼠标的移动轨迹上画红点,按左键画小方块,按 Ctrl + 左键画大方块,按右键退出程序。

// 程序名称:鼠标操作演示
// 编译环境:Visual C++ 6.0~2019,EasyX_20190730
// https://easyx.cn
//
#include <graphics.h>

int main()
{
	// 初始化图形窗口
	initgraph(640, 480);

	ExMessage m;		// 定义消息变量

	while(true)
	{
		// 获取一条鼠标或按键消息
		m = getmessage(EM_MOUSE | EM_KEY);

		switch(m.message)
		{
			case WM_MOUSEMOVE:
				// 鼠标移动的时候画红色的小点
				putpixel(m.x, m.y, RED);
				break;

			c
...