VC绘图/游戏简易教程--12:数组 铜牌收录

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法) 

课程要求:先复习下课本上对数组的讲解(随便一本教材都行)

一维数组

数组可以实现批量操作。比如,我们产生 10 个随机数,产生后先保存起来,然后输出最大的:

	int n[10];
	int i;
	for (i = 0; i < 10; i++)
		n[i] = rand() % 1000;

	// 按生成的顺序,逆序输出
	for (i = 9; i >= 0; i--)
		printf("%d\n", n[i]);

	// 找出最大的
	int max = -1;
	for (i = 0; i < 10; i++)
	{
		if (n[i] > max)
			max = n[i];
	}

	printf("最大的数字是
...

VC绘图/游戏简易教程--10:绘图中的位运算 铜牌收录

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)

========================

位运算和绘图有什么关系?先举个例子来个感性认识:使用XOR运算可以实现擦除图形后不破坏背景,这在时钟程序中绘制表针是很有用的。稍后我们会给出这样的例子。

一、位运算的运算法则

位运算主要分 4 种:NOT、AND、OR、XOR,位运算的运算对象是二进制数(十进制要转换为二进制,计算机会自动转换)。

运算法则如下:

  1. NOT

表示“取反”,将二进制位的 1 变 0、0 变 1。
C 语言用符号 ~ 表示。

如:
二进制: ~1101 = 0010
用十进制表示就是:~13 = 2

  1. AND

表示“并且”,只有两数的对应

...

VC绘图/游戏简易教程--7:捕获按键,实现动画的简单控制 铜牌收录

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)

最常用的一个捕获按键的函数:_getch()
前几课,都把这个函数当做“按任意键继续”来用,现在我们用变量保存这个按键:

char c = _getch();

然后再做判断即可。

不过程序执行到 _getch() 是会阻塞的,直到用户有按键才能继续执行。可游戏中总不能因为等待按键而停止游戏执行吧?所以,要有一个函数,判断是否有用户按键:_kbhit()
这个函数返回当前是否有用户按键,如果有,再用 _getch() 获取即可,这样是不会阻塞的。

即:

char c;
if (_kbhit())
	c = _getch();

举一个简单的例子,如果有按键,就输出相关按键。否则,输出“.”。每隔 100 毫秒输出一次

...

VC绘图/游戏简易教程--6:实现简单动画 铜牌收录

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)

所谓动画,其实是连续显示一系列图形而已。
结合到程序上,我们需要以下几个步骤:

  1. 绘制图像
  2. 延时
  3. 擦掉图像

循环以上即可实现动画。

举一个例子,我们实现一条直线从上往下移动:

#include <graphics.h>
#include <conio.h>

int main()
{
	initgraph(640, 480);

	for(int y = 0; y < 480; y++)
	{
		// 绘制绿色直线
		setlinecolor(GREEN);
		line(0, y, 639, y);

		// 延时
		Sleep(10);

		// 绘制黑色直线(即擦掉之
...

VC绘图/游戏简易教程--4:结合流程控制语句来绘图 铜牌收录

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)

[学习目标]

熟练使用循环、判断语句

[熟悉for语句]

这步需要自学,看看自己手边的书,是怎样讲for语句的,简单看看就行。

[范例]

例如,画10条直线的代码:

#include <graphics.h>
#include <conio.h>

int main()
{
	initgraph(640, 480);

	for(int y=100; y<200; y+=10)
		line(100, y, 300, y);

	_getch();
	closegraph();
	return 0;
}

换一下循环的范围和间隔,看看效果。

还可以用来画渐变色,例如:

...

VC绘图/游戏简易教程--3:熟悉更多的绘图语句 铜牌收录

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)

[学习目标]

学会更多的绘图语句

[常用的绘图语句]

  • line(x1, y1, x2, y2); // 画直线 (x1,y1)-(x2,y2),都是整形
  • circle(x, y, r); // 画圆,圆心为 (x,y),半径为 r
  • putpixel(x, y, c); // 画点 (x,y),颜色 c

还有很多,如画椭圆、圆弧、矩形、多边形,等等,请参考 EasyX 在线帮助 https://docs.easyx.cn

[设置颜色]

setlinecolor(c);    // 设置画线颜色,如 setlinecolor(RED) 设置画线颜色为红色

常用的颜色常量可以用:

  • BLACK 黑    DARKGRAY
...

VC绘图/游戏简易教程--2:简单绘图,学习单步执行 铜牌收录

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)

本期目标

学会简单绘图,并学会简单调试。

先看看上一课的代码,我加上了注释

#include <graphics.h>			// 绘图库头文件,绘图语句需要
#include <conio.h>				// 控制台输入输出头文件,_getch()语句需要

int main()
{
	initgraph(640, 480);		// 初始化640x480的绘图屏幕
	line(200, 240, 440, 240);	// 画线(200,240) - (440,240)
	line(320, 120, 320, 360);	// 画线(320,120) - (320,360)

	_getch();					// 按任意键
	closegraph();				// 关闭
...

VC绘图/游戏简易教程--14:通过位运算实现颜色的分离与处理 铜牌收录

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)

本节课要求熟练掌握位运算,详见:
http://hi.baidu.com/bestans/blog/item/fb75b439404876e614cecb9f.html (已失效)

[颜色基础]

在 EasyX 库中,颜色是一个 int 类型的数据,转换为 16 进制后的颜色格式是 0xbbggrr,其中,bb/gg/rr 分别表示两位十六进制的蓝/绿/红颜色值,每种颜色的范围是 0x0~0xff,转换为十进制就是 0~255。

举几个颜色标示的例子:

  • 颜色  直接表示  RGB 宏标示
  • 纯绿色 0x00ff00  RGB(0, 255, 0)
  • 青色  0xffff00  RGB(0, 255, 255)  注:青=蓝+绿
  • 中灰色 0x7f7f7f  RGB(12
...

FlipGame 铜牌收录

FlipGame,又名点灯游戏,是一个十分有趣的智力游戏:有一行 N 行 N 列的灯,开始时全部是灭的,当你点击其中一盏灯时他的上下左右(若存在的话)状态全部改变,现在要求你以最少地步数,将全部的灯点亮。
此处使用了 8 x 8 的方格,其亮灭状态使用一个 8 字节变量按位记录,点亮状态使用了图片作为背景。

执行效果如下:

项目使用 VS2017 编译,图片内嵌到了资源文件中,并设置了应用图标。

Git项目地址:https://github.com/thatboy-zero/FlipGame8x8https://raw.githubusercontent.com/thatboy-zero/FlipGame8x8/master/FlipGame8x8%5B12-28%5D.zip

二维天体模型 铜牌收录

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

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

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

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

执行截图如下:

完整的源代码如下:

////////////////////////////////////////////////////////
// 程序名称:
...

高等数学图形:玫瑰曲线 铜牌收录

在极坐标系中,以下方程表示的曲线称为玫瑰曲线:

r = sin ( k θ )  或  r = cos ( k θ )

当 k 是奇数时,玫瑰曲线有 k 个花瓣;当 k 是偶数时,玫瑰曲线有 2k 个花瓣。执行效果如下图:

可以按 A-Z 和 a-z 调整参数,绘制不同的玫瑰曲线。例如,k = n / d = 2 / 1,就是四叶玫瑰曲线,k = n / d = 3 / 1,就是三叶玫瑰曲线。

源代码如下:

////////////////////////////////////////////
// 程序名称:高等数学图形:玫瑰曲线
// 编译环境:Visual C++ 6.0 / 2010,EasyX 2011惊蛰版
// 程序编写:yangw80 <yw80@qq.com>
// 最后更新:2011-7-11
//
#include <graphics.h>
#include <stdio.h>
...

漂亮的四叶草 铜牌收录

前几天有网友在 QQ 群“C 语言革命”里面发了一段 Turbo C 代码,感觉蛮漂亮的,我就将代码移植到 VC + EasyX 下面(稍作了一点格式上的修改)。

执行效果如下:

源代码如下:

///////////////////////////////////////////////////
// 程序名称:漂亮的四叶草
// 编译环境:Visual C++ 6.0,EasyX 2011惊蛰版
// 作  者:yangw80 <yw80@qq.com>
// 最后修改:2011-10-14
// 注:源程序是网友发在 QQ 群“C 语言革命”里面的 Turbo C 代码,我修改的
//
#include <graphics.h>
#include <math.h>
#include <conio.h>

#define PI 3.1415926535

void main(void)
{
	// 初始化绘图窗口
	
...

吸顶灯上的一个图案,由若干圆弧组成 铜牌收录

也不知道这个程序该叫什么名字,是我最早学编程的时候写的。那时候看见什么东西都想用程序画出来,然后偶然间在一个吸顶灯的灯罩上看到了这样的图案,于是就写了一个程序来生成。

执行效果如下:

代码如下:

// 程序名称:圆弧组成的图案
// 编译环境:Visual C++ 6.0,EasyX 2011惊蛰版
// 最后修改:2011-3-7
//
#include <graphics.h>
#include <conio.h>
#include <math.h>

#define PI	3.1415926536
#define R	200

// 四舍五入
int Round(double x)
{
	return (int)(x < 0 ? x - 0.5 : x + 0.5);
}

// 主函数
void main()
{
	// 变量定义
	int x, y;	// 坐标
	double a;	// 弧度

	// 绘图环境
...

带一盏油灯去巡视仓库 铜牌收录

今天是 2013 年光棍节,写个程序庆祝一下,呵呵。

本程序模拟了这样一个场景:一个空地上乱七八糟地堆了一些货物,一个孤独的仓库管理员,带了一盏油灯,去巡视这些货物。

在鼠标的位置会亮起一盏油灯,随着鼠标的移动,部分光线会被仓库的货物遮挡。

就不抓图了,有兴趣的运行一下代码看看效果吧,【点这里下载编译后的 exe 文件】。

以下是全部源代码:

/////////////////////////////////////////////////////////
// 程序名称:带一盏油灯去巡视仓库
// 编译环境:Visual C++ 6.0 / 2010,EasyX 2013霜降版
// 作    者:yangw80 <http://hi.baidu.com/yangw80>
// 最后修改:2013-11-11
//
#include <graphics.h>
#include <conio.h>
#include &
...

火焰效果模拟程序 铜牌收录

模拟火焰效果的程序。

执行效果抓图如下:

通过修改色系,本程序可以实现红色火焰、蓝色火焰、绿色火焰三种效果,在 InitFire() 函数中取消相应行注释可以实现不同色系的火焰效果。

完整的源代码如下:

///////////////////////////////////////////////////
// 程序名称:火焰模拟程序
// 编译环境:VC6.0 / VC2010,EasyX_20200727
// 作  者:yangw80 <yw80@qq.com>
// 最后修改:2012-1-21
// PS: 核心算法参考的微软范例,在此感谢。
//
#include <graphics.h>
#include <conio.h>
#include <time.h>

// 宏常量
#define	WIDTH		640
#define HEIGHT		480
#define FIREWIDTH	3
...