📄 game.c
字号:
/*
game.c
游戏主要程序文件
最后修改: 2007-06-19
*/
#include <stdio.h>
#include <dos.h>
#include "graph.h"
#include "key.h"
#include "char.h"
#include "map.h"
#include "player.h"
#include "gift.h"
#include "tank.h"
#include "bullet.h"
#include "sound.h"
extern CPlayer g_PPlayer1, g_PPlayer2, g_PEnemy;
extern char g_byStopTank, g_byProtectBase;
extern int g_cntStopTank, g_cntProtectBase;
extern CTank *g_pTank[60][60];
extern CTank *g_pTHead, *g_pTTail, *g_pTank1, *g_pTank2;
extern CBullet *g_pBullet[60][60];
extern CBullet *g_pBHead, *g_pBTail;
extern CGift *g_pGift[60][60];
extern CGift *g_pTheGift;
extern char g_byBaseBombed;
typedef struct Config_Struct /* 存储按键设置 */
{
char m_byKeyUp1;
char m_byKeyDown1;
char m_byKeyLeft1;
char m_byKeyRight1;
char m_byKeyFire1;
char m_byKeyUp2;
char m_byKeyDown2;
char m_byKeyLeft2;
char m_byKeyRight2;
char m_byKeyFire2;
} CConfig;
CConfig g_Config;
char g_nPlayers;
char g_nLv;
char g_szMapPath[12]="maps\\00.map";
int g_cntTiming=-1;
void Init() /* 初始化 */
{
int key;
FILE *p;
if(!OpenCharSet())
{
printf("Can't open file ASC16 or HZK16.\n");
exit(0);
}
InitGraph();
InstallKeyboard();
p=fopen("tank.cfg", "rb");
if(p!=NULL)
{
fread(&g_Config, sizeof(g_Config), 1, p); /* 读入按键设置 */
fclose(p);
}
else
{ /* 默认按键 */
g_Config.m_byKeyUp1 = KEY_UP;
g_Config.m_byKeyDown1 = KEY_DOWN;
g_Config.m_byKeyLeft1 = KEY_LEFT;
g_Config.m_byKeyRight1 = KEY_RIGHT;
g_Config.m_byKeyFire1 = KEY_SPACE;
g_Config.m_byKeyUp2 = KEY_W;
g_Config.m_byKeyDown2 = KEY_S;
g_Config.m_byKeyLeft2 = KEY_A;
g_Config.m_byKeyRight2 = KEY_D;
g_Config.m_byKeyFire2 = KEY_WAVE;
}
/* 画提示框 */
Box(160, 180, 479, 299, WHITE);
Rect(161, 181, 478, 298, BLACK);
Box(163, 183, 476, 198, BLUE);
OutTextXY(163, 183, 477, 198, "游戏模式", WHITE, 13);
OutTextXY(163, 212, 477, 227, "请选择游戏模式:", BLACK, 13);
OutTextXY(163, 244, 477, 259, " 单人模式请按 F2 键", BLACK, 13);
OutTextXY(163, 260, 477, 275, " 双人模式请按 F3 键", BLACK, 13);
key=BIOSKey();
while(key!=KEY_F2&&key!=KEY_F3) key=BIOSKey(); /* 等待用户按 F2 或 F3 */
if(key==KEY_F2) g_nPlayers=1;
else g_nPlayers=2;
Box(160, 180, 479, 299, BLACK); /* 清除提示框 */
/* 画界面、初始化数据 */
Rect(481, 0, 636, 479, YELLOW);
OutTextXY(491, 400, 626, 480, "坦克大战\nv1.0 final\n作者: 溪流", WHITE, 13);
g_nLv=1;
g_PEnemy.m_bySide=-1;
g_PEnemy.m_byLevel=1;
g_PEnemy.m_byHasBoat=0;
OutTextXY(540, 1, 572, 16, "敌方", WHITE, 13);
OutTextXY(491, 17, 626, 32, "坦克数:", WHITE, 13);
g_PPlayer1.m_bySide=1;
g_PPlayer1.m_nTanks=4;
g_PPlayer1.m_byLevel=1;
g_PPlayer1.m_byHasBoat=0;
OutTextXY(540, 41, 588, 56, "玩家一", WHITE, 13);
OutTextXY(491, 57, 626, 88, "火力:\n坦克数:", WHITE, 13);
if(g_nPlayers==2)
{
g_PPlayer2.m_bySide=1;
g_PPlayer2.m_nTanks=4;
g_PPlayer2.m_byLevel=1;
g_PPlayer2.m_byHasBoat=0;
OutTextXY(540, 97, 588, 112, "玩家二", WHITE, 13);
OutTextXY(491, 113, 626, 144, "火力:\n坦克数:", WHITE, 13);
}
OutTextXY(491, 177, 626, 192, " 玩家一 玩家二", WHITE, 13);
OutTextXY(491, 193, 626, 208, "上:", WHITE, 13);
OutTextXY(491, 209, 626, 224, "下:", WHITE, 13);
OutTextXY(491, 225, 626, 240, "左:", WHITE, 13);
OutTextXY(491, 241, 626, 256, "右:", WHITE, 13);
OutTextXY(491, 257, 626, 272, "火:", WHITE, 13);
OutTextXY(523, 193, 626, 208, GetKeyName(g_Config.m_byKeyUp1), WHITE, 13);
OutTextXY(523, 209, 626, 224, GetKeyName(g_Config.m_byKeyDown1), WHITE, 13);
OutTextXY(523, 225, 626, 240, GetKeyName(g_Config.m_byKeyLeft1), WHITE, 13);
OutTextXY(523, 241, 626, 256, GetKeyName(g_Config.m_byKeyRight1), WHITE, 13);
OutTextXY(523, 257, 626, 272, GetKeyName(g_Config.m_byKeyFire1), WHITE, 13);
OutTextXY(579, 193, 626, 208, GetKeyName(g_Config.m_byKeyUp2), WHITE, 13);
OutTextXY(579, 209, 626, 224, GetKeyName(g_Config.m_byKeyDown2), WHITE, 13);
OutTextXY(579, 225, 626, 240, GetKeyName(g_Config.m_byKeyLeft2), WHITE, 13);
OutTextXY(579, 241, 626, 256, GetKeyName(g_Config.m_byKeyRight2), WHITE, 13);
OutTextXY(579, 257, 626, 272, GetKeyName(g_Config.m_byKeyFire2), WHITE, 13);
OutTextXY(491, 275, 626, 291, "音乐:F6 按键:F8", WHITE, 13);
OutTextXY(491, 292, 626, 308, "暂停:P 退出:Esc", WHITE, 13);
OutTextXY(528, 322, 592, 337, "第 关", YELLOW, BLACK);
srand(clock());
while(rand()%4!=1); /* 让伪随机数来得更随机一些 */
}
int ReadTheMap(int n) /* 读入某关地图 */
{
FILE *p;
if(n<=0||n>99) return 0;
g_szMapPath[6]='0'+n%10;
g_szMapPath[5]='0'+n/10;
return ReadMap(g_szMapPath);
}
char str[3]="00";
char *Num2Str(int n)
{
str[1]=n%10+'0';
str[0]=(n/10)%10+'0';
if(str[0]=='0')str[0]=' ';
return str;
}
int StartGame(int n) /* 进入某关 */
{
int i, j;
CTank *pt=g_pTHead, *pt1;
CBullet *pb=g_pBHead, *pb1;
OutTextXY(552, 322, 568, 337, Num2Str(n), YELLOW, BLACK);
/* 初始化数据 */
g_PEnemy.m_nTanks=20;
g_PEnemy.m_nRestTanks=20;
g_PPlayer1.m_nRestTanks=g_PPlayer1.m_nTanks;
if(g_nPlayers==2)
{
g_PPlayer2.m_nRestTanks=g_PPlayer2.m_nTanks;
}
g_pTHead=NULL;
g_pBHead=NULL;
g_pTank1=NULL;
g_pTank2=NULL;
for(i=0;i<60;i++)
{
for(j=0;j<60;j++)
{
g_pTank[i][j]=NULL;
g_pBullet[i][j]=NULL;
g_pGift[i][j]=NULL;
}
}
while(pt!=NULL)
{
pt1=pt;
pt=pt->m_pNext;
free(pt1);
}
while(pb!=NULL)
{
pb1=pb;
pb=pb->m_pNext;
free(pb1);
}
g_pTheGift=NULL;
g_byStopTank=0;
g_byProtectBase=0;
if(ReadTheMap(n))
{
DrawMap();
SetMap(29, 59, 100);
SetMap(30, 59, 100);
return 1;
}
return 0;
}
void UpdateMessage() /* 更新提示信息 */
{
int f;
OutTextXY(555, 17, 571, 32, Num2Str(g_PEnemy.m_nRestTanks), WHITE, BLACK);
f=(g_pTank1!=NULL)?g_pTank1->m_byLevel:0;
OutTextXY(555, 57, 571, 72, Num2Str(f), WHITE, BLACK);
OutTextXY(555, 73, 571, 88, Num2Str(g_PPlayer1.m_nRestTanks), WHITE, BLACK);
if(g_nPlayers==2)
{
f=(g_pTank2!=NULL)?g_pTank2->m_byLevel:0;
OutTextXY(555, 113, 571, 128, Num2Str(f), WHITE, BLACK);
OutTextXY(555, 129, 571, 144, Num2Str(g_PPlayer2.m_nRestTanks), WHITE, BLACK);
}
}
int CheckWin() /* 是否胜利 */
{
if(g_byBaseBombed==1) return -1;
switch(g_nPlayers)
{
case 1:
if(g_PPlayer1.m_nTanks==0) return -1;
case 2:
if(g_PPlayer1.m_nTanks==0&&g_PPlayer2.m_nTanks==0) return -1;
}
if(g_PEnemy.m_nTanks==0) return 1;
return 0;
}
int GameAction(int count) /* 游戏动作 */
{
CTank *pt;
CBullet *pb;
if(count%8==0) /* 每八周期产生动作 */
{
/* 创建玩家坦克 */
if(g_PPlayer1.m_nRestTanks>0&&g_pTank1==NULL)
{
CreateTank(26, 58, &g_PPlayer1);
}
if(g_PPlayer2.m_nRestTanks>0&&g_pTank2==NULL)
{
CreateTank(32, 58, &g_PPlayer2);
}
/* 玩家动作 */
/* 玩家1 */
if(g_pTank1!=NULL)
{
if(g_byStopTank!=2)
{
if(GetKeyState(g_Config.m_byKeyUp1))
{
if(g_pTank1->m_byDirect==1)
{
g_pTank1->m_byState=1;
}
else
{
ChangeTankDirect(g_pTank1, 1);
}
}
if(GetKeyState(g_Config.m_byKeyDown1))
{
if(g_pTank1->m_byDirect==2)
{
g_pTank1->m_byState=1;
}
else
{
ChangeTankDirect(g_pTank1, 2);
}
}
if(GetKeyState(g_Config.m_byKeyLeft1))
{
if(g_pTank1->m_byDirect==3)
{
g_pTank1->m_byState=1;
}
else
{
ChangeTankDirect(g_pTank1, 3);
}
}
if(GetKeyState(g_Config.m_byKeyRight1))
{
if(g_pTank1->m_byDirect==4)
{
g_pTank1->m_byState=1;
}
else
{
ChangeTankDirect(g_pTank1, 4);
}
}
}
if(GetKeyState(g_Config.m_byKeyFire1))
{
if(g_pTank1->m_nBullets<g_pTank1->m_byLevel+1) CreateBullet(g_pTank1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -