Welcome to zimmerman's blog!

初学->进阶->高手 有很长的路要走
美静->若英->我说 有许多的歌可听

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

               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游戏编程>一书附录.

posted on 2006-10-16 22:20  zim.NET  阅读(1041)  评论(1)    收藏  举报