慢羊羊的空间

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

怎样编写格式优美的代码 铜牌收录

0. 序

很多初学者会被人一眼就看出来是初学者,为什么?原因很多。其中,代码格式是很重要的一项。不注重代码格式,不仅别人看起来不舒服,还会影响自己对代码的阅读。虽然错误的格式不会产生编译错误,但却会让你更容易犯错,并且更难排查错误。所以,学会编写格式优美的代码,是初学者必须要学的一课。

优秀的代码格式并不是唯一的,有很多种风格。本文仅讲解常见的 C/C++ 语言编码规则,而其它规则相信大家在学习工作中会慢慢接触到。

再有就是,很多网站为了便于阅读,都是比较注意代码格式的。例如,如果打算投稿到 CodeBus,看看本文也很有必要。

以下讲解编写代码时在格式上一些常见的注意事项。

1. 正确缩进

所谓缩进,是指在某一行代码的左端留出一部分空白。采用缩进的目的为了清楚的定义一个块的开始和结束,这样会使程序更加清晰易读。虽然目前主流的开发平台都具备智能缩进的功能,但是很多时候修改代码还是需要自己注意缩进问题。

下面的范例代码是求解 100 以内的质数,该范例中有多种缩进情况的例子: 

...

贪吃蛇游戏的双人对战版 银牌收录

这是贪吃蛇游戏的双人对战版。

游戏双方分别控制蓝色和红色两条小蛇的前进,碰壁或咬到蛇身体算输。

这个对战版的贪吃蛇游戏网上有不少源代码,这个代码的特点就是为两个游戏者分别增加了命令队列,以实现更舒服的控制。

完整的游戏源代码如下:

///////////////////////////////////////////////////
// 程序名称:贪吃蛇游戏的双人对战版
// 编译环境:Visual C++ 6.0 / 2010,EasyX_20130322(beta)
// 作  者:yangw80 <yw80@qq.com>
// 最后修改:2012-7-23
//
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <queue>

using namespace std;

#define	WIDTH		64			/
...

怎样产生随机方向(上下左右)? 铜牌收录

比如坦克游戏,敌人坦克移动的四个方向通常不会用 1~4 这样四个数值表示,而是用 dx、dy 这样的 x、y 轴上的增量表示。对应关系如下:

dx =  0;  dy = -1; 表示向上
dx =  0;  dy =  1; 表示向下
dx = -1;  dy =  0; 表示向左
dx =  1;  dy =  0; 表示向右

如果用 1~4 表示 4 个方向,敌人坦克前进一步的代码要这样写:

switch(dir)
{
    case 1: x += 1;
    case 2: y -= 1;
    case 3: x -= 1;
    case 4: y += 1;
}

但是用 dx、dy 表示之后,每次只需要这样做就可以,好处很明显 :

x += dx;
y += dy;
...

同时执行两个或更多功能的方法 铜牌收录

我留意到群里和贴吧有不少人都在问怎样同时执行两个过程,比如:

  1. 贪吃蛇游戏,怎样实现双人对抗?就是控制两条蛇移动。
  2. 俄罗斯方块游戏,要加一个时钟,怎样使时钟和游戏同时进行?
  3. 打砖块游戏,怎样实现一边让小球自由移动、一边实现玩家控制木板?

有些人会想到用多线程来解决。我这里首先要说:这个问题不要用多线程,多线程要解决是另一种问题,这里不再详述,本文只讲一下怎样实现前面说的问题。(当然不用多线程解决)

先说一个简单的程序要求:有一个变量 a,初值为 0,每秒钟增加 2,按任意键停止;还有一个变量 b,初值为 0,每秒钟增加 3。现在要求将这两个功能同时执行,该怎么做?

我相信很多人都能写出来这个简单的程序:

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

void main()
{
	// 
...

力学:鼠标用弹簧挂着一串小方块 铜牌收录

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

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

///////////////////////////////////////////////////
// 程序名称:力学:鼠标用弹簧挂着一串小方块
// 编译环境: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;		
...

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

模拟火焰效果的程序。

执行效果抓图如下:

通过修改色系,本程序可以实现红色火焰、蓝色火焰、绿色火焰三种效果,在 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
...

通过 Windows API 获取鼠标位置等状态信息 铜牌收录

EasyX 有一个演示鼠标操作的范例程序,这里,我们尝试通过 Windows API 获取鼠标信息。关于 API 的使用都以注释形式写到了程序中,故不再详细讲解,代码如下:

// 程序名称:通过 API 获取鼠标状态
// 编译环境:Visual C++ 6.0 / 2008 / 2010,EasyX 2011惊蛰版
//
#include <graphics.h>
#include <stdio.h>

void main()
{
	initgraph(640, 480);		// 初始化绘图窗口
	HWND hwnd = GetHWnd();		// 获取绘图窗口句柄

	POINT point;
	TCHAR s[10];

	while(true)
	{
		GetCursorPos(&point);			// 获取鼠标指针位置(屏幕坐标)
		ScreenToClient(hwnd, &point);	// 将鼠标指针位置转换为窗口坐标

		// 获取鼠标按
...

将 TC 下的绘图和游戏程序移植到 VC 下 铜牌收录

Turbo C(简称tc)是 dos 时代经典的编译器,学习编程时,有很多图形类和游戏类的程序都是用 tc 编写的。由于 c 语言标准的不完善,这些程序大多数都不能直接在 vc 里面编译。本文就讲解怎样将 tc 程序移植到 vc 下。

注:本文以 VC 6.0 为范例(高版本的 vc 大同小异),同时请安装最新版本的 EasyX 图形库。

移植前请注意:

  1. 确保 tc 代码可以正确运行。
  2. 将 tc 代码复制粘贴到 vc 里面。注意,vc 里面代码文件的扩展名要用 .cpp,不能用 .c。
  3. 以下解决办法不分先后顺序,哪条对应就按照哪条修改。
  4. 如果没找到对应的解决办法,可以暂时跳过,先改后面的。可能修改了第 3 条错误,第 2 条错误也就没有了。
  5. 可能解决一个问题后,会出现 10 个新问题,这不要紧。细心、耐心一些,一个一个问题慢慢处理,并不复杂。

以下正文:

错误提示:fatal error C1083: Cannot

...

漂亮的四叶草 铜牌收录

前几天有网友在 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)
{
	// 初始化绘图窗口
	
...

一束漂亮的花 铜牌收录

先说正题,我把原来的 GW-BASIC 程序移植到了 VC + EasyX 下,并简单的加了些颜色,执行效果如下:

又是一个难忘得回忆。。。

我最早是抱着一台“学习机”学的 Basic 语言,之后第一次在电脑上输入的程序,就是这个。不过那个年代的显示器是单色的,书上的代码也没有设置颜色,当时把程序输入 GW-BASIC 后,输出的整个图案都是墨绿色的。哦,顺便贴一下书的封皮照片:

我一直记得我还留着这本书的,上次回家偏偏没找到,然后网上到处搜也没搜到,恰好 easyx 群里的阿里同学说他们学校图书馆有这本书,于是借来帮我拍了几张照片,在这里表示感谢。

感慨完了,代码如下:

///////////////////////////////////////////////////
// 程序名称:一束漂亮的花
// 编译环境:Visual C++ 6.0 / 2010,EasyX 2011惊蛰版
// 作  者:yangw80 
...

关于编程中“绝对路径”和“相对路径”的使用 铜牌收录

基本概念

加载图片、音乐等各种文件的时候,都要指定文件路径。通常,可以用绝对路径和相对路径两种方式来指定文件。

先解释一下概念:

  • 绝对路径,就是从盘符开始的路径,例如:“C:\Windows\system32\mfc42.dll”。
  • 相对路径,就是从当前路径开始的路径,例如,当前路径是“C:\Windows”,那么指定前面范例的文件,可以直接写“system32\mfc42.dll”。
    注意,路径分隔符“&rdquo;在 C 语言里面是转义字符,所以表达路径分隔符需要用“\”。

从功能上讲:

  • 访问每台电脑上路径都固定不变的文件,需要用绝对路径,例如访问 C:\Windows\system.ini。
  • 如果程序所在路径不固定,访问的文件和程序放在一起,就要用相对路径。例如和程序放在一起的图片文件。

项目范例

以下用 VC2010 的项目来说明绝对路径和相对路径如何使用。

...