/*
(单机两人对站版,编译器:TC 2.0)
双击PAOPAO.EXE运行,如果不是全屏的话,请按Alt+Enter键使它变成全屏。
玩家一:黄色的笑脸
向上: w
向下: s
向左: a
向右: d
放泡泡:空格
玩家二:红色的笑脸
向上: UP(方向键)
向下: DOWN
向左: LEFT
向右: RIGHT
放泡泡:回车
退出:
ESC
o: 增加泡泡个数
上下方向的箭头: 增加泡泡的威力。
人物被泡泡炸后就不能动了,过一段时间才能恢复,如果在这段时间被另外一个玩家碰了的话,就输了。
编程思想:
在游戏循环中不端检查按键,对控制键执行相关操作,对其他键则忽略处理。
对于还没有爆炸的泡泡(或刚爆炸还没有擦除的泡泡)用“队列”存储。每
循环一次就检查“队头”元素的时间到了没有,时间到了就让它爆炸(或擦除爆炸
痕迹)。爆炸时还要检查其爆炸范围内有没有其他的泡泡,有的话就引爆它。
*/
/*-------------------------------------------------
paopaodang.c -- a demo of paopaotang game
(c) wonderful,wangchengbo 2004
-------------------------------------------------*/
/**********************************************************/
/* 程序中用到的库函数所在头文件应用 #include 命令包含进来 */
#include <stdio.h>
#include <stdlib.h>
#include <bios.h>
#include <ctype.h>
#include <conio.h>
#include <dos.h>
#include <time.h>
#include <alloc.h>
/**********************************************************/
#define TIME_DELAY 3
#define WIN_DELAY 18
#define MAXQSIZE 100
#define PAO_TIME 50
#define BLAST_TIME 10
#define PAOMAN_DELAY 60 /* 人被炸后恢复需要的时间 */
/* 键盘中断函数(借用一个TC做的CS游戏中的) */
#define KEY_Y 0x15
#define KEY_N 0x31
#define KEY_A 0x1E
#define KEY_D 0x20
#define KEY_S 0x1f
#define KEY_W 0x11
#define KEY_ESC 0x01
#define KEY_ENTER 0x1c
#define KEY_SPACE 0x39
#define KEY_UP 0x48
#define KEY_LEFT 0x4b
#define KEY_RIGHT 0x4d
#define KEY_DOWN 0x50
#define PLAY1UP KEY_W
#define PLAY1LEFT KEY_A
#define PLAY1DOWN KEY_S
#define PLAY1RIGHT KEY_D
#define PLAY1FIRE KEY_SPACE
#define PLAY2UP KEY_UP
#define PLAY2DOWN KEY_DOWN
#define PLAY2LEFT KEY_LEFT
#define PLAY2RIGHT KEY_RIGHT
#define PLAY2FIRE KEY_ENTER
void InstallKeyboard(void);
void ShutDownKeyboard(void);
void far interrupt NewInt9(void);
int GetKey(int ScanCode);
char key_state[128],key_pressed[128];
void interrupt far (*OldInt9Handler)();
void InstallKeyboard(void) /*键盘中断程序*/
{
int i;
for(i=0;i<128;i++)
key_state[i]=key_pressed[i]=0;
OldInt9Handler = getvect(9); /*中断向量值*/
setvect(9,NewInt9); /*中断程序NewInt9地址存入指定的中断向量表中INT 09H*/
}
void ShutDownKeyboard(void)
{
setvect(9,OldInt9Handler);
}
void far interrupt NewInt9(void)
{
unsigned char ScanCode,temp;
ScanCode=inportb(0x60);
temp=inportb(0x61);
outportb(0x61,temp | 0x80);
outportb(0x61,temp & 0x7f);
if(ScanCode&0x80)
{
ScanCode&=0x7f;
key_state[ScanCode]=0;
}
else
{
key_state[ScanCode]=1;
key_pressed[ScanCode]=1;
}
outportb(0x20,0x20);
}
int GetKey(int ScanCode)
{
int res;
res=key_state[ScanCode]|key_pressed[ScanCode];
key_pressed[ScanCode]=0;
return res;
}
/*>>>>>>>>>>>> Man function -- copyright Wonderful and WangChengBo <<<<<<<<<<<<<*/
typedef enum
{
PLAY1=1, PLAY2=2
}which_play;
typedef enum
{
CAN,
CANNOT
}MOVE;
typedef struct
{
int x, y; /*the position of the man */
which_play which; /* play1 or play2?*/
MOVE can_move; /* can man move? */
int len; /*paopao's length*/
int pao_num; /* how many pao can the man fire?*/
int old_time; /* 人被泡泡炸后,恢复的时间 */
}man;
DrawMan(man m)
{
gotoxy(m.x+15, m.y+6);
if (m.which == PLAY1)
{
textcolor(YELLOW);
}
else
{
textcolor(LIGHTRED);
}
putch(2);
}
DrawPaoMan(man m)
{
gotoxy(m.x+15, m.y+6);
if (m.which == PLAY1)
{
textcolor(YELLOW);
}
else
{
textcolor(LIGHTRED);
}
putch(1);
}
EraseMan(man m)
{
gotoxy(m.x+15, m.y+6);
textcolor(BLACK);
putch(' ');
}
DrawPao(int x, int y)
{
gotoxy(x+15, y+6);
textcolor(LIGHTBLUE);
putch('O');
}
DrawBlast1(int x, int y)
{
gotoxy(x+15, y+6);
textcolor(LIGHTBLUE);
putch('#');
}
char name[12][48] =
{
" # # # # ",
"###### ###### # ###### ###### # ",
" # # # # # # # # ",
" # ###### # # ###### # ",
" # # # ######### # # # #########",
" # ###### # # ###### # ",
" # # ## # # # ## # ",
" # ####### # # # ####### # # ",
" # # # ## # # # ## ",
" ## # # # ## # # # ",
" ## # # ### ## # # ### ",
" # # "
};
int Name_X = 48;
int Name_Y = 12;
void DrawBegin()
{
int x, y;
for (y=0; y<Name_Y; ++y)
{
for(x=0; x<Name_X; ++x)
{
gotoxy(x+21, y+5);
textcolor(LIGHTBLUE);
putch(name[y][x]);
}
}
gotoxy(19, 20);
printf("Press any key to Enter the game!");
}
char map1[8][17] =
{"#################",
"# @@@@ @ #@# ##",
"# #@#@#@ @@@ #",
"# @@@ @@ #@#@##",
"#@#@#@#@ @@@@@@#",
"#@@@@@ @@#@#@##",
"#@#@#@#@@ @@@@@#",
"#################"};
int Map_X = 17;
int Map_Y = 8;
char map[8][17];
void DrawMap()
{
int x, y;
for (y=0; y<Map_Y; ++y)
{
for(x=0; x<Map_X; ++x)
{
gotoxy(x+15, y+6);
if(map[y][x] == '#')
{
textcolor(GREEN);
putch(219);
}
else if(map[y][x] == '@')
{
textcolor(BROWN);
putch(178);
}
else
putch(' ');
}
}
textcolor(BLUE);
gotoxy(48, 4);
printf("Player1 key:");
gotoxy(48, 5);
printf(" UP----w");
gotoxy(48, 6);
printf(" DOWN--s");
gotoxy(48, 7);
printf(" LEFT--a");
gotoxy(48, 8);
printf(" RIGHT-d");
gotoxy(48, 9);
printf(" FIRE--space");
gotoxy(48, 11);
printf("Player2 key:");
gotoxy(48, 12);
printf(" UP----up");
gotoxy(48, 13);
printf(" DOWN--down");
gotoxy(48, 14);
printf(" LEFT--left");
gotoxy(48, 15);
printf(" RIGHT-right");
gotoxy(48, 16);
printf(" FIRE--ENTER");
gotoxy(48, 18);
printf("exit game:");
gotoxy(48, 19);
printf(" ESC");
gotoxy(38, 2);
textcolor(LIGHTRED);
putch('P');
putch('A');
putch('O');
putch('P');
putch('A');
putch('O');
}
Treasure(int x, int y)
{
int i;
i = random(15);
if (i > 10)
{
switch (i)
{
case 11:
case 12:
map[y][x] = 'O';
gotoxy(x+15, y+6);
textcolor(YELLOW);
putch('o');
break;
case 13:
case 14:
map[y][x] = '-';
gotoxy(x+15, y+6);
textcolor(YELLOW);
putch(18);
break;
default:
break;
}
}
else
{
map[y][x] = ' ';
gotoxy(x+15, y+6);
putch(' ');
}
}
int MoveUp(man *m, man *p)
{
if (map[m->y - 1][m->x] == '#' || map[m->y - 1][m->x] == '@'
|| map[m->y - 1][m->x] == 'o' || m->can_move == CANNOT)
{
return 1;
}
EraseMan(*m);
if (map[m->y][m->x] == 'o')
{
DrawPao(m->x, m->y);
}
--(m->y);
DrawMan(*m);
switch (map[m->y][m->x])
{
case 'a':
case 'b':
m->can_move = CANNOT;
m->old_time = clock();
break;
case 'O':
++(m->pao_num);
map[m->y][m->x] = ' ';
break;
case '-':
++(m->len);
map[m->y][m->x] = ' ';
break;
default:
break;
}
if (m->x == p->x && m->y == p->y && p->can_move == CANNOT)
{
gotoxy(36, 3);
printf("Play%d Win!!", m->which);
return 0;
}
return 1;
}
int MoveDown(man *m, man *p)
{
if (map[m->y + 1][m->x] == '#' || map[m->y + 1][m->x] == '@'
|| map[m->y + 1][m->x] == 'o' || m->can_move == CANNOT)
{
return 1;
}
EraseMan(*m);
if (map[m->y][m->x] == 'o')
{
DrawPao(m->x, m->y);
}
++(m->y);
DrawMan(*m);
switch (map[m->y][m->x])
{
case 'a':
case 'b':
m->can_move = CANNOT;
m->old_time = clock();
break;
case 'O':
++(m->pao_num);
map[m->y][m->x] = ' ';
break;
case '-':
++(m->len);
map[m->y][m->x] = ' ';
break;
default:
break;
}
if (m->x == p->x && m->y == p->y && p->can_move == CANNOT)
{
gotoxy(36, 3);
printf("Play%d Win!!", m->which);
return 0;
}
return 1;
}
int MoveLeft(man *m, man *p)
{
if (map[m->y][m->x - 1] == '#' || map[m->y][m->x - 1] == '@'
|| map[m->y][m->x - 1] == 'o' || m->can_move == CANNOT)
{
return 1;
}
EraseMan(*m);
if (map[m->y][m->x] == 'o')
{
DrawPao(m->x, m->y);
}
--(m->x);
DrawMan(*m);
switch (map[m->y][m->x])
{
case 'a':
case 'b':
m->can_move = CANNOT;
m->old_time = clock();
break;
case 'O':
++(m->pao_num);
map[m->y][m->x] = ' ';
break;
case '-':
++(m->len);
map[m->y][m->x] = ' ';
break;
default:
break;
}
if (m->x == p->x && m->y == p->y && p->can_move == CANNOT)
{
gotoxy(36, 3);
printf("Play%d Win!!", m->which);
return 0;
}
return 1;
}
int MoveRight(man *m, man *p)
{
if (map[m->y][m->x + 1] == '#' || map[m->y][m->x + 1] == '@'
|| map[m->y][m->x + 1] == 'o' || m->can_move == CANNOT)
{
return 1;
}
EraseMan(*m);
if (map[m->y][m->x] == 'o')
{
DrawPao(m->x, m->y);
}
++(m->x);
DrawMan(*m);
switch (map[m->y][m->x])
{
case 'a':
case 'b':
m->can_move = CANNOT;
m->old_time = clock();
break;
case 'O':
++(m->pao_num);
map[m->y][m->x] = ' ';
break;
case '-':
++(m->len);
map[m->y][m->x] = ' ';
break;
default:
break;
}
if (m->x == p->x && m->y == p->y && p->can_move == CANNOT)
{
gotoxy(36, 3);
printf("Play%d Win!!", m->which);
return 0;
}
return 1;
}
/*>>>>>>>>>>> paopao functions -- copyright wonderful and WangChengBo <<<<<<<<<<<<*/
typedef struct
{
int x;
int y;
int original_time;
int len;
which_play which;
}PAO;
/*--------------------------------------------------------------*/
typedef PAO QElemType;
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct
{
QueuePtr front; /*队头,最早出队列的一端*/
QueuePtr rear; /*队尾,允许插入的一端*/
}LinkQueue;
void InitalQueue(LinkQueue *Q)
{
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
Q->front->next = NULL;
}
int EnQueue(LinkQueue *Q, QElemType e)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if (p == NULL)
{
return 0;
}
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
return 1;
}
int QueueHead(LinkQueue *Q, QElemType *e)
{
if (Q->front == Q->rear)
{
return 0;
}
*e = Q->front->next->data;
return 1;
}
int FindElemDelete(LinkQueue *Q, QElemType *e, int x, int y)
{
QueuePtr p, q = Q->front;
for (p = Q->front->next; p != 0; p = p->next)
{
if (p->data.x == x && p->data.y == y)
{
q->next = p->next;
*e = p->data;
if (p == Q->rear)
{
Q->rear = q;
}
free(p);
return 1;
}
else
{
q = p;
}
}
return 0;
}
int DeQueue(LinkQueue *Q)
{
QueuePtr p;
if (Q->front == Q->rear)
{
return 0;
}
p = Q->front->next;
Q->front->next = p->next;
if (Q->rear == p)
{
Q->rear = Q->front;
}
free(p);
return 1;
}
void DestroyQueue(LinkQueue *Q)
{
while (Q->front)
{
Q->rear = Q->front->next;
free(Q->front);
Q->front = Q->rear;
}
}
void Paopao(man *m, LinkQueue *Q)
{
PAO pao;
if (m->can_move == CANNOT || m->pao_num == 0)
{
return;
}
DrawPaoMan(*m);
map[m->y][m->x] = 'o';
pao.x = m->x;
pao.y = m->y;
pao.original_time = clock();
pao.len = m->len;
pao.which = m->which;
--m->pao_num;
/*入队列 */
EnQueue(Q, pao);
}
void PaoBlast(PAO pao, man *p1, man *p2, LinkQueue *Q, LinkQueue *B)
{
int i = 1, end = 0;
PAO e;
switch (pao.which)
{
case PLAY1:
++(p1->pao_num);
break;
case PLAY2:
++(p2->pao_num);
break;
}
DrawBlast1(pao.x, pao.y);
map[pao.y][pao.x] = 'b';
if (p1->x == pao.x && p1->y == pao.y)
{
DrawPaoMan(*p1);
p1->can_move = CANNOT;
p1->old_time = clock();
}
else if (p2->x == pao.x && p2->y == pao.y)
{
DrawPaoMan(*p2);
p2->can_move = CANNOT;
p2->old_time = clock();
}
/*--------------------Up----------------------*/
for (; i <= pao.len; ++i)
{
end = 0;
switch (map[pao.y-i][pao.x])
{
case '#':
end = 1;
break;
case ' ':
DrawBlast1(pao.x, pao.y-i);
map[pao.y-i][pao.x] = 'b';
break;
case '@':
end = 1;
DrawBlast1(pao.x, pao.y-i);
map[pao.y-i][pao.x] = 'a';
break;
case 'o':
if (FindElemDelete(Q, &e, pao.x, pao.y-i) == 1)
{
e.original_time = clock();
EnQueue(B, e);
PaoBlast(e, p1, p2, Q, B);
}
break;
default:
break;
}
if (p1->x == pao.x && p1->y == pao.y-i)
{
DrawPaoMan(*p1);
p1->can_move = CANNOT;
p1->old_time = clock();
}
else if (p2->x == pao.x && p2->y == pao.y-i)
{
DrawPaoMan(*p2);
p2->can_move = CANNOT;
p2->old_time = clock();
}
if (end == 1)
{
break;
}
}
/*----------------------Down------------------------*/
for (i=1; i <= pao.len; ++i)
{
end = 0;
switch (map[pao.y+i][pao.x])
{
case '#':
end = 1;
break;
case ' ':
DrawBlast1(pao.x, pao.y+i);
map[pao.y+i][pao.x] = 'b';
break;
case '@':
end = 1;
DrawBlast1(pao.x, pao.y+i);
map[pao.y+i][pao.x] = 'a';
break;
case 'o':
if (FindElemDelete(Q, &e, pao.x, pao.y+i) == 1)
{
e.original_time = clock();
EnQueue(B, e);
PaoBlast(e, p1, p2, Q, B);
}
break;
default:
break;
}
if (p1->x == pao.x && p1->y == pao.y+i)
{
DrawPaoMan(*p1);
p1->can_move = CANNOT;
p1->old_time = clock();
}
else if (p2->x == pao.x && p2->y == pao.y+i)
{
DrawPaoMan(*p2);
p2->can_move = CANNOT;
p2->old_time = clock();
}
if (end == 1)
{
break;
}
}
/*---------------------Left-------------------------*/
for (i=1; i <= pao.len; ++i)
{
end = 0;
switch (map[pao.y][pao.x-i])
{
case '#':
end = 1;
break;
case ' ':
DrawBlast1(pao.x-i, pao.y);
map[pao.y][pao.x-i] = 'b';
break;
case '@':
end = 1;
DrawBlast1(pao.x-i, pao.y);
map[pao.y][pao.x-i] = 'a';
break;
case 'o':
if (FindElemDelete(Q, &e, pao.x-i, pao.y) == 1)
{
e.original_time = clock();
EnQueue(B, e);
PaoBlast(e, p1, p2, Q, B);
}
break;
default:
break;
}
if (p1->x == pao.x-i && p1->y == pao.y)
{
DrawPaoMan(*p1);
p1->can_move = CANNOT;
p1->old_time = clock();
}
else if (p2->x == pao.x-i && p2->y == pao.y)
{
DrawPaoMan(*p2);
p2->can_move = CANNOT;
p2->old_time = clock();
}
if (end == 1)
{
break;
}
}
/*----------------------Right-----------------------*/
for (i=1; i <= pao.len; ++i)
{
end = 0;
switch (map[pao.y][pao.x+i])
{
case '#':
end = 1;
break;
case ' ':
DrawBlast1(pao.x+i, pao.y);
map[pao.y][pao.x+i] = 'b';
break;
case '@':
end = 1;
DrawBlast1(pao.x+i, pao.y);
map[pao.y][pao.x+i] = 'a';
break;
case 'o':
if (FindElemDelete(Q, &e, pao.x+i, pao.y) == 1)
{
e.original_time = clock();
EnQueue(B, e);
PaoBlast(e, p1, p2, Q, B);
}
break;
default:
break;
}
if (p1->x == pao.x+i && p1->y == pao.y)
{
DrawPaoMan(*p1);
p1->can_move = CANNOT;
p1->old_time = clock();
}
else if (p2->x == pao.x+i && p2->y == pao.y)
{
DrawPaoMan(*p2);
p2->can_move = CANNOT;
p2->old_time = clock();
}
if (end == 1)
{
break;
}
}
}
void EraseBlast(PAO pao, man *p1, man *p2)
{
int i = 1, end = 0;
gotoxy(pao.x+15, pao.y+6);
putch(' ');
map[pao.y][pao.x] = ' ';
if (p1->x == pao.x && p1->y == pao.y)
{
DrawPaoMan(*p1);
}
else if (p2->x == pao.x && p2->y == pao.y)
{
DrawPaoMan(*p2);
}
/*----------------------UP-------------------*/
for (; i <= pao.len; ++i)
{
end = 0;
switch (map[pao.y-i][pao.x])
{
case 'b':
map[pao.y-i][pao.x] = ' ';
gotoxy(pao.x+15, pao.y-i+6);
putch(' ');
break;
case 'a':
Treasure(pao.x, pao.y-i);
case '#':
end = 1;
break;
default:
break;
}
if (p1->x == pao.x && p1->y == pao.y-i && p1->can_move == CANNOT)
{
DrawPaoMan(*p1);
}
else if (p2->x == pao.x && p2->y == pao.y-i && p2->can_move == CANNOT)
{
DrawPaoMan(*p2);
}
if (end == 1)
{
break;
}
}
/*---------------DOWN-----------------*/
for (i=1; i <= pao.len; ++i)
{
end = 0;
switch (map[pao.y+i][pao.x])
{
case 'b':
map[pao.y+i][pao.x] = ' ';
gotoxy(pao.x+15, pao.y+i+6);
putch(' ');
break;
case 'a':
Treasure(pao.x, pao.y+i);
case '#':
end = 1;
break;
default:
break;
}
if (p1->x == pao.x && p1->y == pao.y+i && p1->can_move == CANNOT)
{
DrawPaoMan(*p1);
}
else if (p2->x == pao.x && p2->y == pao.y+i && p2->can_move == CANNOT)
{
DrawPaoMan(*p2);
}
if (end == 1)
{
break;
}
}
/*---------------LEFT-----------------*/
for (i=1; i <= pao.len; ++i)
{
end = 0;
switch (map[pao.y][pao.x-i])
{
case 'b':
map[pao.y][pao.x-i] = ' ';
gotoxy(pao.x+15-i, pao.y+6);
putch(' ');
break;
case 'a':
Treasure(pao.x-i, pao.y);
case '#':
end = 1;
break;
default:
break;
}
if (p1->x == pao.x-i && p1->y == pao.y && p1->can_move == CANNOT)
{
DrawPaoMan(*p1);
p1->can_move = CANNOT;
}
else if (p2->x == pao.x-i && p2->y == pao.y && p2->can_move == CANNOT)
{
DrawPaoMan(*p2);
p2->can_move = CANNOT;
}
if (end == 1)
{
break;
}
}
/*-------------RIGHT------------------*/
for (i=1; i <= pao.len; ++i)
{
end = 0;
switch (map[pao.y][pao.x+i])
{
case 'b':
map[pao.y][pao.x+i] = ' ';
gotoxy(pao.x+15+i, pao.y+6);
putch(' ');
break;
case 'a':
Treasure(pao.x+i, pao.y);
case '#':
end = 1;
break;
default:
break;
}
if (p1->x == pao.x+i && p1->y == pao.y && p1->can_move == CANNOT)
{
DrawPaoMan(*p1);
p1->can_move = CANNOT;
}
else if (p2->x == pao.x+i && p2->y == pao.y && p2->can_move == CANNOT)
{
DrawPaoMan(*p2);
p2->can_move = CANNOT;
}
if (end == 1)
{
break;
}
}
}
int main()
{
int END = 0;
int x, y;
man play1 = {1, 1, PLAY1, CAN, 1, 1}, play2 = {14, 1, PLAY2, CAN, 1, 1};
LinkQueue PaoQueue, BlastQueue;
int iCurrentTime, iOldTime;
PAO PaoHead, BlastHead;
for (y=0; y<Map_Y; ++y)
{
for (x=0; x<Map_X; ++x)
{
map[y][x] = map1[y][x];
}
}
clrscr();
randomize();
DrawBegin();
getch();
clrscr();
DrawMap();
DrawMan(play1);
DrawMan(play2);
InitalQueue(&PaoQueue);
InitalQueue(&BlastQueue);
InstallKeyboard();
iOldTime = clock();
while (END != 1)
{
if (GetKey(KEY_ESC))
{
END=1;
}
/*---------Play1--------------*/
if (GetKey(PLAY1UP))
{
if (!MoveUp(&play1, &play2))
{
while (clock() - iOldTime <= WIN_DELAY);
END = 1;
}
}
if (GetKey(PLAY1DOWN))
{
if (!MoveDown(&play1, &play2))
{
while (clock() - iOldTime <= WIN_DELAY);
END = 1;
}
}
if (GetKey(PLAY1LEFT))
{
if (!MoveLeft(&play1, &play2))
{
while (clock() - iOldTime <= WIN_DELAY);
END = 1;
}
}
if (GetKey(PLAY1RIGHT))
{
if (!MoveRight(&play1, &play2))
{
while (clock() - iOldTime <= WIN_DELAY);
END = 1;
}
}
if (GetKey(PLAY1FIRE))
{
Paopao(&play1, &PaoQueue);
}
/*---------Play2--------------*/
if (GetKey(PLAY2UP))
{
if (!MoveUp(&play2, &play1))
{
while (clock() - iOldTime <= WIN_DELAY);
END = 1;
}
}
if (GetKey(PLAY2DOWN))
{
if (!MoveDown(&play2, &play1))
{
while (clock() - iOldTime <= WIN_DELAY);
END = 1;
}
}
if (GetKey(PLAY2LEFT))
{
if (!MoveLeft(&play2, &play1))
{
while (clock() - iOldTime <= WIN_DELAY);
END = 1;
}
}
if (GetKey(PLAY2RIGHT))
{
if (!MoveRight(&play2, &play1))
{
while (clock() - iOldTime <= WIN_DELAY);
END = 1;
}
}
if (GetKey(PLAY2FIRE))
{
Paopao(&play2, &PaoQueue);
}
/*---------Ok! we check if the pao is blast!----------------*/
iCurrentTime = clock();
if (QueueHead(&PaoQueue, &PaoHead))
{
if ((iCurrentTime - PaoHead.original_time) >= PAO_TIME)
{
DeQueue(&PaoQueue);
map[PaoHead.y][PaoHead.x] = ' ';
gotoxy(PaoHead.x+15, PaoHead.y+6);
putch(' ');
/* blast */
PaoBlast(PaoHead, &play1, &play2, &PaoQueue, &BlastQueue);
PaoHead.original_time = iCurrentTime;
EnQueue(&BlastQueue, PaoHead);
}
}
if (QueueHead(&BlastQueue, &BlastHead))
{
if ((iCurrentTime - BlastHead.original_time) >= BLAST_TIME)
{
DeQueue(&BlastQueue);
/*-- Erase the blast --*/
EraseBlast(BlastHead, &play1, &play2);
}
}
if (play1.can_move == CANNOT)
{
if (iCurrentTime - play1.old_time >= PAOMAN_DELAY)
{
play1.can_move = CAN;
DrawMan(play1);
}
}
if (play2.can_move == CANNOT)
{
if (iCurrentTime - play2.old_time >= PAOMAN_DELAY)
{
play2.can_move = CAN;
DrawMan(play2);
}
}
while (clock() - iOldTime < TIME_DELAY);
iOldTime = clock();
if (END == 1)
{
gotoxy(34, 3);
textcolor(WHITE);
printf("Play again?(y/n)");
while (1)
{
if (GetKey(KEY_Y))
{
DestroyQueue(&PaoQueue);
DestroyQueue(&BlastQueue);
InitalQueue(&PaoQueue);
InitalQueue(&BlastQueue);
for (y=0; y<Map_Y; ++y)
{
for (x=0; x<Map_X; ++x)
{
map[y][x] = map1[y][x];
}
}
play1.x = 1;
play1.y = 1;
play1.which = PLAY1;
play1.can_move = CAN;
play1.len = 1;
play1.pao_num = 1;
play2.x = 14;
play2.y = 1;
play2.which = PLAY2;
play2.can_move = CAN;
play2.len = 1;
play2.pao_num = 1;
textcolor(LIGHTBLUE);
clrscr();
DrawMap();
DrawMan(play1);
DrawMan(play2);
END = 0;
break;
}
else if (GetKey(KEY_N))
{
break;
}
}
}
}
ShutDownKeyboard();
DestroyQueue(&PaoQueue);
DestroyQueue(&BlastQueue);
return 0;
}
评论