/* (单机两人对站版,编译器: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;}

评论