C游戏编程之文本模式游戏
昨天用了几小时,总结了一篇游戏设计.今天讲讲文本模式游戏.
开发工具TC++3.0 / TC 2.0
文本模式是Turbo C的默认模式. 也可用 void textmode(int mode) 设置为文本模式
.如textmode(C80)将屏幕设置成80列彩色模式.
相关头函数:conio.h (提供了许多文本模式屏幕处理函数.)
本文涉及知识:(看你了解多少,如果以下都知道,那么可以跳过本文了.)
1.屏幕背景,文本颜色等设置
2.getch()与getche()与getchar()的区别
3.INT10中断功能的使用
1)屏幕相关
#include <conio.h>
int main()
{
char ch;
clrscr();
window(10,10,70,11);
textattr(128+YELLOW+(GREEN<<4)); //文本属性设置,以下会作进一步分析
int a;
do{
cprintf("Please select a level (1,2,3) you want to play:");
cscanf("%d",&a);
}while(!(a==1 || a==2 ||a==3));
ch=getch();
return 0;
}
文本模式(80*25文本单元):每个文本单元由两字符组成.第一字符放ASCII码,后一字
符放了3个相关属性.(你显然可以想到颜色是其中的一个吧?)
一字符8bit存放规则如下:
_____________________________
7 | 6 5 4 | 3 2 1 0 |
闪烁| 背景色 | 文本色 |
_____________________________|
由各功能所占的bit可知:
闪烁功能1bit: 0不闪 1 闪
背景色3bit: 0~7
文本色4bit: 0~15
现在再来分析那句: textattr(128+YELLOW+(GREEN<<4));
聪明的你应该看得懂了吧?128使最高位置1,闪烁. GREEN<<4 背景色绿. YELLOW 为
文本色.
当然,你如果对颜色代码很熟的话,也可以这样写:
textattr(0x00be); /*这句的功能和上面一样,但看起来不太"友好".从程序设计角
度,还是上面的用颜色标记的更易理解使用吧.*/
2)getch()与getche()与getchar()的区别
#include <stdio.h>
#include <conio.h>
void main()
{
char ch;
clrscr();
textmode(C80);
printf("the getch():");
for(int i=0;i<5;i++){
ch=getch();
// printf("%c\n",ch);
}
printf("\nthe getche():");
ch=getche();
ch=getche();
printf("\nthe getchar():");
ch=getchar();
printf("Do you understand the difference?");
ch=getch();
}
运行完这个程序你大概就会知道了.一句话概括:getch()无回显,getche()有回显
,getchar()要回车才回显.若有疑惑,共同探讨之.
3)INT10中断功能
#include<io.h>
#include<stdio.h>
#include<dos.h>
#include<string.h>
#include<math.h>
#include<bios.h>
#include<mem.h>
#include<fcntl.h>
#include<stdlib.h>
#include<conio.h>
void main(void)
{
union REGS inregs,outregs;
int x,y,page,line,character,attribute;
clrscr();
printf("\nah=02h set cursor,from (0,0)to (79,24)\nplease input
x,y, like 0,0\n");
scanf("%d,%d",&x,&y);
inregs.h.ah=0x02;
inregs.h.dh=x;
inregs.h.dl=y;
int86(0x10,&inregs,&outregs);
printf("\nah=03h test cursor place:\n");
inregs.h.ah=0x03;
int86(0x10,&inregs,&outregs);
x=outregs.h.dh;
y=outregs.h.dl;
printf("(%d,%d)\n",x,y);
printf("\nah=05h set page,from 0 to 6\nplease input page, like
3\n");
scanf("%d",&page);
inregs.h.ah=0x05;
inregs.h.al=page;
int86(0x10,&inregs,&outregs);
printf("\nah=06h line up\nplease input line, like 5\n");
scanf("%d",&line);
inregs.h.ah=0x06;
inregs.h.al=line;
inregs.h.bh=0;
inregs.h.ch=0;
inregs.h.cl=0;
inregs.h.dh=79;
inregs.h.dl=24;
int86(0x10,&inregs,&outregs);
printf("\nah=07h line down\nplease input line, like 5\n");
scanf("%d",&line);
inregs.h.ah=0x07;
inregs.h.al=line;
inregs.h.bh=0;
inregs.h.ch=0;
inregs.h.cl=0;
inregs.h.dh=79;
inregs.h.dl=24;
int86(0x10,&inregs,&outregs);
printf("\nah=08h get character attribute\n");
inregs.h.ah=0x08;
int86(0x10,&inregs,&outregs);
attribute=outregs.h.ah;
character=outregs.h.al;
printf("charact:%d attrbibute:%d",character,attribute);
printf("\nah=09h set character attribute\nplease input
character,attribute, like 115,50\n");
scanf("%d,%d",&character,&attribute);
inregs.h.ah=0x09;
inregs.h.al=character;
inregs.h.bl=attribute;
int86(0x10,&inregs,&outregs);
}
视频服务程序00H(设置视频模式)
输入:
AH=00H
AL=视频模式
输出:
无
说明:视频服务程序00H用来设置视频配置为表10-l中列出之一。AL寄存器给定
所需视频模式。若设置了新视频模式,则清除屏幕。
视频服务程序0lH(设置光标大小)
输入:
AH=01H
CH=光标开始扫描行
CL=光标结束扫描行
输出:
无
说明:该服务程序用于正文模式。在一个字符单元内由一行或几行组成的光标将在字
符显示位置得闪烁。该服务程序定义光标的显示行数。对CGA模式,8扫描行(0~7)用
于光标。对EGA模式,使用14行(0~13)。MCGA和VGA适配器,光标可具有16扫描行
(0~15)高。缺省设置如下:
CGA: CH=6,CL=7
EGA: CH=ll,CL=12
MCGA和VGA: CH量13,CL=1
视频服务程序02H(设置光标位置)
输入:
AH=02H
BH=光标页号
DH=光标行号
DL=光标列号
输出:
无
说明:该服务器序用于将光标移到指定行和列位置。该服务程序即可用于正文模式也
可用于图形模式;然而,仅在正文模式下才显示光标。屏幕左上角为坐标系统的原点
。对支持多页的正文和图形模式,则必须指定页号,以保证光标位置正确。
视频服务程序03H(读光标位置)
输入:
AH=03H
BH=页号
输出:
CH=光标开始行
CL=光标结束行
DH=行号
DL=列号
说明:该服务程序用于获取光标大小和位置。BH给定了页号。CH中存放光标开始扫描
行,而CL中为光标结束扫描行。DH中存放行位置,DL中为列位置。
视频服务程序05H(设置活动显示页)
输入:
AH=05H
AL=活动页号
输出:
无
说明:该服务程序为正文和图形模式用来设置活动显示页号。AL指定所需页号
。对多数正文模式,页号范围为0一7。对具有足够视频缓冲EGA和VGA适配器,可支持
多页图形。对所有正文和图形模式,缺省为0页。
视频服务程序06H(向上翻滚活动窗口)。
输入:
AH=06H
AL=翻滚行数
BH=空白行属性
CH左上角行号
CL=左上角列号
DH=右下角行号
Dl=右下角列号
输出:
无
说明:该服务程序用来创建和翻滚一正文窗口。CH和CL中给出了正文窗口左上角坐标
,DH和DL中给出了正文窗口右下角坐标。AL中定义了翻滚的行数。若AL=00H,则正
文窗口为空白。当滚动窗口时,底部行是空白行,其属性由BH中指定。
视频服务程序07H(向下翻滚窗口)
输入:
AH=07H
AL=翻滚行数
BH=空白行属性
CH=左上角行号
CL=左上角列号
DH=右下角行号
DL=右下角列号
输出:
无
说明:该服务程序用来创建和翻滚一正文窗口。CH和CL中给出了正文窗口左上角坐标
,DH和DL中给出了正文窗口右下角坐标。AL中定义了翻滚的行数。若AL=00H,则正
文窗口为空白。当滚动窗口时,顶部行为空白,其属性由BH中指定。
视频服务程序08H(读字符和属性)
输入:
AH=08H
BH=活动页号
输出:
AH=字符属性
AL=字符码
说明:该服务程序用于读取正文或视频模式下,光标所在处字符。在图形模式下,获
取的字符同图形模式下使用的字符生成表有关。在正文模式下,将获得字符的ASCII
码。字符属性存放在AH中,字符ASCII码存放在AL中。图形模式下,AH中内容无意义.
视频服务程序09H(写字符和属性)
输入:
AH=09H
AL=写字符的ASCII码
BL=写字符的属性
BH=活动页号
CX=重复写字符和属性次数
输出:
无
说明:该服务程序写一个字符到屏幕当前光标处。AL中指定字符码。正文模式下,BL
中指定字符属性。图形模式下,BL指定背景颜色。字符可重复写。CX为写字符及属性
的次数。
视频服务程序0FH(取当前视频模式)
输入:
AH=0FH
输出:
AH=每行字符数
AL=当前显示模式
BH=活动页号
说明:该服务程序用来获取当前视频模式,屏幕宽(以字符计),以及活动显示页号;
视频显示模式存放在AL中。屏幕宽度(以字符计)存放在AH中,活动页号存放在BH中。
其实若是有以上这些资料也不难看懂那个程序吧..若是对汇编有所了解的话就更容
易看懂了...REGS结构TC中有定义.看一下帮助就OK了.
如此看来.int10中断的功能还蛮多的嘛.关于中断.以后会遇到更多.到时再细说不
迟.
总结:现在你已经学到了如何让你的C程序不再毫无色彩了.那么就请用这些(虽然看似
一点点),来写一个文本模式的游戏吧.(关于图形,动画等方面的,下次有机会再讲.)讲
到中断,什么时候我们利用中断写一个病毒试试...当然,只是试试而已.坚决不干坏事
.嘎.
练习学得如何:
请发挥你的所学与才智,写一个猜数字游戏(文曲星里的那种几A几B的,玩过吗?).思考
如何让这个游戏更符合一个游戏的标准?(键盘或鼠标输入,图形或文本界面,黑白或彩
色显示等等都是要考虑的问题.)下次我们来交流一下编写经验如何?
注:以上int10部分资料来自于<C游戏编程>一书附录.
浙公网安备 33010602011771号