教程中国
PHOTOSHOP CS9.0中文版 MAYA 8.5 FOR WINDOWS Corel Painter v9.0 Flash MX2004 中文版 Illustrator cs2 中文版
VC++6.0含sp6 中英文版 VB6.0 +sp6 简体中文版 Borland Delphi 7汉化版 MSDN for vb6.0中文版 Visual Studio 2005简体
教程中国下属 文件存储共享专家BIBIDU.COM 提供大型软件,教材,源码,电影,音乐,图书等下载 更多精品请点此进入
  您目前所在位置: 教程中国 >> C >> 游戏编程 >> 潜艇大战 RSS订阅
潜艇大战
潜艇大战(1)
教程(视频,书籍)下载:  ASP.NET AutoCAD 数据库 C# ASP java photoshop 网页设计 delphi 3dmax Flash C++ VB 张孝祥 实例   更多请进入BIBIDU搜索
IT搜索引擎   

/* 这里把三个文件放在了一起,编译时需要把本文件分成三 */
/*部分,文件名分别为:13H.H,TIMER.H,SHIP.C。其中13H.H是 */
/*VGA 13H 模式下作图的一些基本函数。本程序用申请的64000 */
/*字节作为后台活动页,作图完成后一次性拷贝到显示缓冲区。 */
/*TIMER.H是整个程序的时钟系统。SHIP.C是主程序。 */

/*********************************************************/
/* 文件:13H.H */
/*********************************************************/
/*********************************************************/

/* 此处定义了一些通用的宏 */
# define BYTE unsigned char
# define BOOL BYTE
# define WORD unsigned int
# define DWORD unsigned long

# define TRUE 1
# define FALSE !TRUE

/* BIOS 8*8 西文字库的段地址和偏移量 */
WORD FONT_SEG;
WORD FONT_OFF;

/* 显示后台活动页地址 */
void far * Video;

/* 获取BIOS 8*8 西文字库的段地址和偏移量 */
void GetFontAdd()
{
suct REGPACK regs;
regs.r_bx=0x0300;
regs.r_ax=0x1130;
in(0x10,®s);
FONT_SEG=regs.r_es;
FONT_OFF=regs.r_bp;
}

/* 向后台活动页写像素 */
void Pset(int x,int y,BYTE color)
{
if ((x>=0)&&(x<320)&&(y>=0)&&(y<200))
*((BYTE far*)Video y*320 x)=color;
}

/* 等待键盘输入 */
void wait()
{
_AX=0;
geninterrupt(0x16);
}

/* 设置VGA 13H模式 */
void setmode()
{
_AX=0x13;
geninterrupt(0x10);
GetFontAdd();
}

/* 设置文本模式 */
void closemode()
{
_AX=0x3;
geninterrupt(0x10);
}

/* 设置调色板 */
void setpal(int Color,BYTE r,BYTE g,BYTE b)
{
outportb(0x3c8,Color);
outportb(0x3c9,r);
outportb(0x3c9,g);
outportb(0x3c9,b);
}

/* 屏幕定位(用于输出字符)*/
void locate(int Line,int Col)
{
_DH=Line;
_DL=Col;
_AH=2;
_BX=0;
geninterrupt(0x10);
}

/* 从键盘缓冲区内直接读出扫描码 */
BYTE ScanKey(void)
{
int start,end;
WORD key=0;
start=peek(0,0x41a);
end=peek(0,0x41c);
if (start==end) return(0);
else
{
key=peek(0x40,start);
start =2;
if (start==0x3e) start=0x1e;
poke(0x40,0x1a,start);
return(key/256);
}
}

/* 画背景 */
void ClearScreen()
{
int x,y;
for (y=0;y<5;y ) for (x=0;x<320;x ) Pset(x,y,16);
for (y=5;y<10;y ) for (x=0;x<320;x ) Pset(x,y,104);
for (y=10;y<15;y ) for (x=0;x<320;x ) Pset(x,y,33);
for (y=15;y<20;y ) for (x=0;x<320;x ) Pset(x,y,103);
for (y=20;y<25;y ) for (x=0;x<320;x ) Pset(x,y,32);
for (y=25;y<30;y ) for (x=0;x<320;x ) Pset(x,y,64);
for (y=30;y<40;y ) for (x=0;x<320;x ) Pset(x,y,99);
for (y=40;y<60;y ) for (x=0;x<320;x ) Pset(x,y,97);
for (y=60;y<100;y ) for (x=0;x<320;x ) Pset(x,y,53);
for (y=100;y<200;y ) for (x=0;x<320;x ) Pset(x,y,2);
}

/* 刷新屏幕 */
void ReFresh(void)
{
movedata(FP_SEG(Video),FP_OFF(Video),0xa000,0,64000);
}

/* 输出字符到显示后台活动页 */
void OutChar(int x0,int y0,int ch,BYTE Color)
{
int x,y;
BYTE c;
for (y=0;y<8;y )
{
c=peekb(FONT_SEG,FONT_OFF ch*8 y);
for (x=0;x<8;x )
{
if (c&(1<<(7-x))) Pset(x x0*8,y y0*8,Color);
}
}
}

/* 输出字符串到显示后台活动页 */
void OutSing(int x,int y,char *p,BYTE Color)
{
while (*p)
{
OutChar(x ,y,*p ,Color);
if (x==40)
{
x=0;
y ;
}
}
}


/*********************************************************/
/* 文件:TIMER.H */
/*********************************************************/
/*********************************************************/

/* 系统可用计时器的最大数目 */
# define MAXTIMER 10

/* 计时器结构 */
suct TM
{
DWORD Interval; /* 间隔 */
DWORD LastTimer; /* 上次时间发生时间*/
BOOL Enable; /* 活动 */
BOOL Used; /* 可用 */
void (*Pointer)(); /* 事件远指针 */
};

suct TM tmTM[MAXTIMER 1];
int TimerUsed=0;

/* 获取BIOS计数器数值 */
DWORD BiosTimer(void)
{
DWORD BIOSTIMER=0;
BIOSTIMER=peek(0x0,0x46e);
BIOSTIMER<<=8;
BIOSTIMER =peek(0x0,0x46c);
return (BIOSTIMER);
}

/* 时间事件(时钟系统核心) */
void TimerEvent()
{
int i;
DWORD TimerDiff;

for (i=1;i<=MAXTIMER;i )
{
if (tmTM[i].Used&&tmTM[i].Enable)
{
TimerDiff=BiosTimer()-tmTM[i].LastTimer;
if (tmTM[i].Interval<=TimerDiff)

{tmTM[i].Pointer();
tmTM[i].LastTimer=BiosTimer();
}
}
}
}


/* 创建一个时钟(成功返回时钟的句柄,否则返回NULL) */
int CreateTimer(DWORD Interval,void (*Pointer)())
{
int i=0;
if (TimerUsed==MAXTIMER) return NULL;

while (tmTM[ i].Used);

tmTM[i].Pointer=Pointer;
tmTM[i].Interval=Interval;
tmTM[i].Enable=TRUE;
tmTM[i].Used=TRUE;
tmTM[i].LastTimer=BiosTimer();

TimerUsed ;
return i;
}

/* 删除一个时钟 */
void KillTimer(int *TimerID)
{
if (tmTM[*TimerID].Used)
{
TimerUsed--;
tmTM[*TimerID].Used=FALSE;

来源:十度教育
作者:
关键字:潜艇
发表日期:2006-6-24 20:25:13

网页显示有限 阅读全文请下载本文完整版WORD文档

上一篇:几个游戏代码(机器人大战)   下一篇:用c语言演绎“生命游戏”


共7页 9 7 [1] [2] [3] [4] [5] [6] [78 :>

2008-11-23 20:08:50
本文的相类似文章
  • 美国一面包房常年向核潜艇供应水果蛋糕
  • 美潜艇与日渔船相撞
  • 海军潜艇学院:2007年研究生招生简章
  • 海军潜艇学院:2006年考研调剂信息
  • 在学习中进步 在进步中成长 教程中国相随您的成长之路
    华腾联合科技股份有限公司版权所有
    广告联系:Rosibo@163.com