[color=blue:e7ac05aa19]
中国银行河南修武支行
王安定
---- 作为成熟的操作系统,UNIX在重要的行业中有很广泛的应用;而做为传统重要部门广泛应用的操作系统,在实际的应用中,却都存在游戏软件少、游戏研发难度大等缺点。现在虽然推出了UNIX下的 X窗口,但因其应用的不广泛加上介绍功能的书籍少,使新手也很入手研发自己的游戏程式。本人在工作中从事的是UNIX操作系统,研发了一些实用的小程式。下面以自己所研发的一个小游戏来介绍一下在UNIX中如何入手研发一个游戏连同在UNIX下游戏研发的一些基本知识。由于本人水平有限、经验不足,文中难免会有不足及欠缺的地方,望朋友们指正。
---- 游戏名称:《UNIX下的俄罗斯方块》
---- 研发环境:SCO UNIX System V/386 Release 3.2 后经少量改变在SCO OpenServer 5.0及多种LINUX环境下编译通过
---- 研发语言:Microsoft's C compiler version 6
---- 研发方式:UNIX字符方式下用UNIX自带CURSES.H图像库研发
----
一、研发思路:
---- 一个好的游戏必须要有一个好的思路才会被广大的玩友们认同和接受。从许多方面来说,一个好的游戏归根到底就是有一个好的思路。俄罗斯方块作为大家常见的一种游戏,游戏的思路简单而有趣,以至于被许多游戏公司研发成不同的版本发行,游戏的基本思路如下:
---- 1 、单人游戏时:随机产生一个方块,用户使用键盘功能键操作方块,以合适的方式放入方块队列中。当某一行方块满时就消去这一行,显示用户所消行数及得分。机器中方块下落的速度会随得分的不同而改变。
---- 2 、联机对战:基本游戏思路同单人游戏,增加了对战功能。当多人进行对战时,如某玩家一次所消的方块行数大于二行,则把所消行数随机去掉一列后传给其他用户。在其他用户的界面上就能够看到从游戏界面底部一下子便增加了数行。
二、游戏的界面:
---- 在UNIX下,游戏的界面是个令人头痛的问题。在字符方式下,无法完成各种精美的图像。好在我们所研发的游戏对界面需要不太高。因此,对于新手来说,我们能够用UNIX本身所带的CURSES.H库中几个简单的函数来完成我们的界面设计。
---- 1 、下面介绍几种常用的CURSES.H函数:
initscr() 初始化屏幕(必须有)
clear()、wclear() 清屏
newwin() 开一个新窗口
box() 在窗口边画一个框
mvprintw(int x,int y,char *,...)
类似于printf,不同之处是在窗口的 (x,y)位置显示信息
mvscanw(int,int,char *,...)在指定位置读信息
mvwaddstr() 在指定窗口的指定位置显示字符串
wstandout() 反相显示开始
wstandend() 反相显示结束
cbreak() 立即显示所接收到的字符
nocbreak() 接收到一个换行符后才显示所接收到的字符
echo() 显示所输入的字符
noecho() 不显示所输入的字符
delwin() 删除一个窗口
touchwin() 击活一个窗口
wrefresh() 刷新一个窗口
beep() 响铃
keypad() 功能键开关
wgetch() 在窗口中读一个字符输入
wmove() 在窗口中移动光标
endwin() 结束图像方式(必须有)
---- 2 、图像方式光标移动键定义如下:
KEY_DOWN 0402 向下键
KEY_UP 0403 向上键
KEY_LEFT 0404 向左键
KEY_RIGHT 0405 向右键
---- 下边的例程一就是用以上几个函数和光标移动键写的一个通用的菜单程式,您还能够修改程式的入口参数来写一个通用的菜单程式。
三、随机方块的产生
---- 在俄罗斯方块中,共有19种不同的方块类型,要随机产生不同的方块能够用以下两个函数来实现:
---- 1 、定义随机数发生器:根据时间函数的返回值不同而产生不同的随机数。
#define randomize() srand((unsigned)time(NULL))
---- 2 、定义随机数:该函数能产生介于0到num-1之间的任何数。
#define random(num) (rand()%num)
定义上面两函数后便可用下面的函数
rand_block()产生一个随机数:
/* 程式功能:随机产生一个介于0-19之间的数
入口参数:无
返回值:flag */
int rand_block()
{
int flag;
randomize();
flag=rand(19);
return(flag);
}
要显示方块用所附例程二中的 draw_block
(x,y,rand_block())便在坐标(x,y)位置显示出这个方块。
四、游戏的控制:
---- 1、终端控制:UNIX中终端的输入输出控制用的是ioctl()系统调用。原型如下:
#include < termio.h >
int ioctl(int fd,int request,struct termio *argu)
---- fd为文档描述字,和一台终端相对应;request 是个命令,我们用到的有命令有TCGETA和TCSETA两个,作用分别是将fd所对应的终端信息存入termio结构和将fd所对应的终端设定为termio所描述的形式。 argu是个指向 termio类型的指针。
---- 程式中,对终端的控制主要是对中断键的处理和对输入模式的不同转换。对中断键的处理主要是用到termio指针中c_cc数组中的控制。下面的一段程式便可保存起当前终端信息,忽略中断键(置其值为255),然后重设当前终端。
struct termio *old_tbuf,tbuf;
ioctl(0,TCGETA,&old_tbuf); /* 取当前终端信息 */
tbuf=old_tbuf; /* 保存终端信息 */
tbuf.c_cc[VINTR]=255; /* DEL */
tbuf.c_cc[VQUIT]=255; /* CTRL-\ */
tbuf.c_cc[VERASE]=255; /* CTRL_h */
tbuf.c_cc[VKILL]=255; /* CTRL-u */
tbuf.c_cc[VEOL]=255; /* CTRL-d */
tbuf.c_cc[VSWTCH]=255; /* CTRL-z */
tbuf.c_cc[VSTOP]=255; /* CTRL-s */
tbuf.c_cc[VSTART]=255; /* CTRL-q */
ioctl(0,TCSETA,&tbuf); /* 配置当前终端 */
---- 2、 下落动画控制:
---- 在UNIX系统中,有两种输入模式可供选择:一种是标准模式,一种是原始模式。在标准模式下,输入字符存储在输入队列的缓冲区中,直到读入换行符或是EOT(^-d)字符后才将任何数据一次输出;在原始模式下,字符一键入就立即输出,没有缓冲区。系统默认的是标准模式,但在游戏中,我们要不断在两种模式间转换,完成转换要用到tbuf.c_lflag[ICANON]来完成,假如设为ON,则默认为标准输入模式,否则为原始模式(具体用法见例程三)。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



