一个下五子棋程序源代码的问题,求助!!
大家好,
我在看《C语言速成3.0》中,有一个现成的五子棋源代码例程,我有些看不懂,希望大家指点一下,谢。 代码如下:
/**********************************************************/
/* 本程序在Turbo C或Borland C下编译通过 */
/* 源程序在光盘 \source\ 目录下 */
/* 文件名: afive.c */
/**********************************************************/
/**********************************************************/
/* 程序中用到的库函数所在头文件应用 #include 命令包含进来 */
#include <stdio.h>
#include <bios.h>
#include <ctype.h>
#include <conio.h>
#include <dos.h>
/**********************************************************/
/* 定义符号常量 */
/*定义画棋盘所需的制表符*/
#define CROSSRU 0xbf /*右上角点*/
#define CROSSLU 0xda /*左上角点*/
#define CROSSLD 0xc0 /*左下角点*/
#define CROSSRD 0xd9 /*右下角点*/
#define CROSSL 0xc3 /*左边*/
#define CROSSR 0xb4 /*右边*/
#define CROSSU 0xc2 /*上边*/
#define CROSSD 0xc1 /*下边*/
#define CROSS 0xc5 /*十字交叉点*/
/*定义棋盘左上角点在屏幕上的位置*/
#define MAPXOFT 5
#define MAPYOFT 2
/*定义1号玩家的操作键键码*/
#define PLAY1UP 0x1157/*上移-- 'W '*/
#define PLAY1DOWN 0x1f53/*下移-- 'S '*/
#define PLAY1LEFT 0x1e41/*左移-- 'A '*/
#define PLAY1RIGHT 0x2044/*右移-- 'D '*/
#define PLAY1DO 0x3920/*落子--空格键*/
/*定义2号玩家的操作键键码*/
#define PLAY2UP 0x4800/*上移--方向键up*/
#define PLAY2DOWN 0x5000/*下移--方向键down*/
#define PLAY2LEFT 0x4b00/*左移--方向键left*/
#define PLAY2RIGHT 0x4d00/*右移--方向键right*/
#define PLAY2DO 0x1c0d/*落子--回车键Enter*/
/*若想在游戏中途退出, 可按 Esc 键*/
#define ESCAPE 0x011b
/*定义棋盘上交叉点的状态, 即该点有无棋子 */
/*若有棋子, 还应能指出是哪个玩家的棋子 */
#define CHESSNULL 0 //没有棋子
#define CHESS1 'O '//一号玩家的棋子
#define CHESS2 'X '//二号玩家的棋子
/*定义按键类别*/
#define KEYEXIT 0/*退出键*/
#define KEYFALLCHESS 1/*落子键*/
#define KEYMOVECURSOR 2/*光标移动键*/
#define KEYINVALID 3/*无效键*/
/*定义符号常量: 真, 假 --- 真为1, 假为0 */
#define TRUE 1
#define FALSE 0
这些是宏定义部分的代码,我不太明白那些以0x开头的那些宏定义是根据什么指定出来的,如#define ESCAPE 0x011b,
#define PLAY1UP 0x1157/*上移-- 'W '*/
为什么要是0x011b,0x1157? 根据什么呀?指定成别的可以吗?
还有#define CROSSRU 0xbf /*右上角点*/有什么用呀? 为甚么这么定义呀?
希望大家给我说明白一下好吗?
[解决办法]
看了一下,不是很懂,还是给你点建议吧:我认为是随便定义的,你可以实验一下:比如你把ESCAPE的宏定义修改一下,看看程序是否还可以正确执行,如果程序不能正常运行,说明必须那样定义,如果必须要那样定义,我想你应该看一下键盘上各个按键的代码,看是否可以找到原因。
[解决办法]
楼主知道是扫描码就不需要问键定义了。
还有#define CROSSRU 0xbf /*右上角点*/有什么用呀? 为甚么这么定义呀?
这个是扩展ascii码,估计你的程序是英文环境下的(很可能是dos下的),英文下扩展ascii码都是些图形字符,什么各式各样的横线竖线角什么的,那个0xbf大概是个右上角符号。
[解决办法]
你看看后面的程序就知道了,输出那些定义的CROSS的地方,都是棋盘上还没有布子的位置,它本身就是在画棋盘。然后有子的位置上就输出CHESS1、CHESS2。
[解决办法]
还有个问题,看到程序中有很多只能使用TC函数库才可以的函数,如bioskey(),textmode(),
gotoxy(),textcolor(),delay(),sound(),nosound()等等,请问有没有可以用ANSI C中对应功能的函数代替?我不想让她只是在TC下编译,也可以在VC++下编译的。
-------------------------------------
那是编译器提供的库函数,在VC下是无法编译通过的.
VC自身也有强大的库函数,加上API完全可以实现那些功能.