---- 在游戏中,我们需要每一个方块在产生后,便能自动地下落。实现这个动画效果,我们要用到原始模式下的两个重要标志:VMIN和 VTIME,他们分别表示read系统调用返回前所需读取的最少字数和所最长时间。要控制方块自动下落,可用下面两句:
tbuf.c_cc[VMIN]=0;
tbuf.c_cc[VTIME]=1;
ioctl(0,TCSETA,&tbuf);
功能:read在收到一个字符或未收到字符但定时一秒到时返回
---- 3、速度控制:
---- 在俄罗斯方块中,游戏的可玩性还在于速度在不断的变化中。在这里,我们就要用到间隔化技术。所谓间隔化技术,就是在指定了开始位置和结束位置的情况下,确定游戏间隔步骤过程的技术。我们能够用一个空循环来实现方块因得分不同而使每一次下落的速度不同。定义速度常数 SPEED为十万(可根据机器速度不同自行定义),然后根据不同的行分而改变循环次数,如下边所写(score为用户当前得分):
if(score< 10000) for(i=0;i< SPEED-score*10;i );
else for(i=0;i< SPEED-score*2;i );
五、游戏操作的实现:
---- 在游戏中,对方块的操作主要是几个光标功能键来控制,功能定义如下:
1、↑ 翻转 2、↓ 速降 3、← 左移 4、→ 右移
5、Esc结束 6、c 刷屏 7、p 暂停
---- 由于在图像方式下不能完成对方块的各种操作,这就使我们要找到合适的函数来定义各功能键。在UNIX中,↑↓ ← →各键的引导字符是27,对游戏操作的实现也就是改变方块显示位置及显示不同方块类型的转换。当然还能够定义一些秘键:减速、增速、使对手增行、清空自己任何行等。下面的例程三即是个完整的判断程式。
六、游戏的记录
---- 1、记录结构的定义:
struct user_data
{
char name[8]; /* 用户姓名 */
int score; /* 用户最高得分 */
int line; /* 最高分时所消除方块行数 */
}
---- 2、记录文档的几种操作:在程式中要用到记录文档来存放用户记录,本游戏中记录文档名为user.dat,以下是几种文档的常用操作。在操作前要先定义一个FILE类型的指针(FILE *fp):
fopen() 打开文档
fscanf() 从文档中读数据
access() 检测文档存在否及文档属性
creat() 建立新文档
fseek() 文档定位
fprintf() 写数据到文档中
fclose() 关闭文档
---- 用下面的一段程式便可测试用户记录文档存在否。如不存在,则建立新的文档,并写一个空的入门成绩到用户记录文档中。游戏中您可用这几个函数来往记录文档中追加新的记录或改写记录。
if(access("user.dat",00)) /* 检测有无用户记录文档 */
{
creat("user.dat",0644); /* 如无文档则建立新的文档 */
fp=fopen("user.dat","r "); /* 写入一个空记录 */
fprintf(fp,"入门成绩 3000 20\n");fclose(fp);
}
七、联机对战的实现:
---- 联机对战的主要思路是在各个不同用户间传递信息。在UNIX下,我们能够用消息队列来进行数据的传递。消息队列能将格式化的数据送往任意的进程,所用到的有关系统调用如下:
---- 1 、建构一个新的消息队列或取得一个现存的消息队列的标识符:
#include "sys/types.h"
#include "sys/ipc.h"
#include "sys/msg.h"
int msgget(key_t key,int flags)
---- key是指消息队列的名字,他的值若是IPC_PRIVATE(值为零),指该消息队列为该进程专用,否则表示为一个以上的进程所共用。
flags用于表示消息队列的存取权限。
---- 2 、取得或修改已存在的消息队列的属性:
int msgctl(int msgid,int cmd,struct msqid_ds *mbuf)
msgid是消息队列的标识符
cmd为符号常数: IPC_STAT(拷贝消息队列到MBUF所指向的地址)
、IPC_SET(设定消息队列的存取权限)、IPC_RMID(删除消息队列)。
---- 3 、发送和接收消息:
int msgsnd(int msgid,const void *msgp,
size_t msgsz,int msgflg)
int msgrcv(int msgid,void *msgp,size_t msgsz,
long msgtyp,int msgflg)
msgid:消息队列的标识符
msgp:消息缓冲区,暂时存储发送和接收的消息
msgsz:消息的大小
msgtyp:消息的类型
msgflg:用来指明核心程式在队列没有数据的状况下,
所应采取的行动。
---- 例程四以一个客户端/服务器的例子展示了这个功能的用法。程式中可用 user的改变来决定游戏中用户总数及所传送的信息内容,用当前用户的进程号作为信号的类型。用户可自定义函数来完成方块在不同用户间的传送及用户游戏中方块的增减。
八、游戏中的各种标志位:
---- 最重要的标志位是位置方块标志:定义一个二维数组,对应于游戏中方块的区域大小。如play[25][80],然后根据该标志为0或1来判断该位置有无方块。其他标志都是根据这个标志来工作的。所用到的标志更有游戏左右界标志、消行标志、增行标志(联机对战中)、能否移动标志、游戏结束标志等。
九、 其他功能
---- 游戏主体内容建立后,更有一些功能需要用户自己来完成。如清除上次显示方块、显示下一方块提示信息、无敌作弊法、记录排序、游戏速度的精确计算、增删行函数、速降函数、方块变换等,还需要进一步完善才成为完整的程式。
---- 以上内容是本人在UNIX中研发游戏的一点心得体会。您能够到金蜘蛛软件库下载上述程式的试玩版。
---- 例程可下载
http://www2.ccw.com.cn/tips/2k03/033104p13.zip
[/color:e7ac05aa19]
| hbhgsy 回复于:2004-02-03 21:17:29 |
| 如题 |
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




