论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

C语言程序设计:随机生成的迷宫游戏

文章类别:C语言程序设计 | 发表日期:2011-3-23 8:59:19

/* 把此文件保存为mazeMain.c 
 * 描述   : 超级迷宫 (Super Maze) 
 * 作者   : 文曦畅 Wen Xichang   2004-11-10 
 */ 
#define UP 0x4800 
#define DOWN 0x5000 
#define LEFT 0x4b00 
#define RIGHT 0x4d00 
#define KEY_W 0x1157 
#define KEY_w 0x1177 
#define KEY_S 0x1f53 
#define KEY_s 0x1f73 
#define KEY_A 0x1e41 
#define KEY_a 0x1e61 
#define KEY_D 0x2044 
#define KEY_d 0x2064 
#define ENTER 0x1c0d 
#define SPACE 0x3920 
#define F1 0x3b00 
#define ESC 0x11b 


#include <stdio.h> 
#include <graphics.h> 
#include <stdlib.h> 
#include <bios.h> 
#include "crtMaze.c" 
#include "menu.c" 
#include "logo.c" 
#include "music.c" 

int playerNum = 1; 
int gameLevel = 0; 
char reachIdx[75][97]; 

void initMaze (int flag); 
void initGrphErrExit (void); 
void playGame (void); 
void updateThe (Index idx); 
void updateRect (Index idx, int len); 
void mazeUpdateEx (Index p1, Index p2); 

void initMaze(int flag){ 
int i,j; 
for(i = 0; i < maxIdxY; i++){ 
for(j = 0; j < maxIdxX; j++){ 
maze[i][j] = 0; 
if(gameLevel == 0) reachIdx[i][j] = 1; 
else reachIdx[i][j] = 0; 
if((i == 0) || (j == 0) || (i == maxIdxY - 1) || (j == maxIdxX - 1)){ 
maze[i][j] = 1; 
} 
else if((i % 2 == 0) && (j % 2 == 0)){ 
maze[i][j] = 1; 
} 
} 
} 
if (flag == 0) 
randomize(); 
} 

void initGrphErrExit (void){ 
int gd = VGA, gm = VGAHI, errorcode; 
/*registerbgidriver(EGAVGA_driver);*/ 
initgraph(&gd, &gm, ""); 
errorcode = graphresult(); 
if (errorcode != grOk) 
{ 
printf("\nGraphics error: %s\n", grapherrormsg(errorcode)); 
printf("\nI am sorry that an error occurred.\n\n"); 
printf("\t\tPress any key to exit..."); 
getch(); 
exit(0); 
} 
}void playGame(void){ 
Index bgIdx = {1, 1}; 
Index edIdx; 
Index player1 = bgIdx,  
 player2; 
Index tmp; 
int key = 0; 
int i,j; 

int musIdx = 0; 
initMusic(); 

playerNum = inMenu(MENU_MAIN); 
edIdx.x = maxIdxX - 2; 
edIdx.y = maxIdxY - 2; 
player2 = edIdx; 
initMaze(1); 
createMaze(bgIdx, edIdx); 
maze[player1.y][player1.x] = 6; 
if (playerNum > 1) 
maze[player2.y][player2.x] = 7; 
logo(2); 
mazeUpdateEx(player1,player2); 

for(;;){ 
if (bioskey(1)) 
key=bioskey(0); 
else 
key=0; 

switch(key){ 
case UP: 
if(maze[player1.y - 1][player1.x] != 1){ 
maze[player1.y][player1.x] = 2; 
updateThe(player1); 
player1.y--; 
maze[player1.y][player1.x] = 6; 
updateThe(player1); 
} 
if (gameLevel != 0) mazeUpdateEx(player1,player2); 
break; 
case DOWN: 
if(maze[player1.y + 1][player1.x] != 1){ 
maze[player1.y][player1.x] = 2; 
updateThe(player1); 
player1.y++; 
maze[player1.y][player1.x] = 6; 
updateThe(player1); 
} 
if (gameLevel != 0) mazeUpdateEx(player1,player2); 
break; 
case LEFT: 
if(maze[player1.y][player1.x - 1] != 1){ 
maze[player1.y][player1.x] = 2; 
updateThe(player1); 
player1.x--; 
maze[player1.y][player1.x] = 6; 
updateThe(player1); 
} 
if (gameLevel != 0) mazeUpdateEx(player1,player2); 
break; 
case RIGHT: 
if(maze[player1.y][player1.x + 1] != 1){ 
maze[player1.y][player1.x] = 2; 
updateThe(player1); 
player1.x++; 
maze[player1.y][player1.x] = 6; 
updateThe(player1); 
} 
if (gameLevel != 0) mazeUpdateEx(player1,player2); 
break; 
case KEY_W: 
case KEY_w: 
if(playerNum > 1){ 
if(maze[player2.y - 1][player2.x] != 1){ 
maze[player2.y][player2.x] = 2; 
updateThe(player2); 
player2.y--; 
maze[player2.y][player2.x] = 7; 
updateThe(player2); 
} 
} 
if (gameLevel != 0) mazeUpdateEx(player1,player2); 
break; 
case KEY_S: 
case KEY_s: 
if(playerNum > 1){ 
if(maze[player2.y + 1][player2.x] != 1){ 
maze[player2.y][player2.x] = 2; 
updateThe(player2); 
player2.y++; 
maze[player2.y][player2.x] = 7; 
updateThe(player2); 
} 
} 
if (gameLevel != 0) mazeUpdateEx(player1,player2); 
break; 
case KEY_A: 
case KEY_a: 
if(playerNum > 1){ 
if(maze[player2.y][player2.x - 1] != 1){ 
maze[player2.y][player2.x] = 2; 
updateThe(player2); 
player2.x--; 
maze[player2.y][player2.x] = 7; 
updateThe(player2); 
} 
} 
if (gameLevel != 0) mazeUpdateEx(player1,player2); 
break; 
case KEY_D: 
case KEY_d: 
if(playerNum > 1){ 
if(maze[player2.y][player2.x + 1] != 1){ 
maze[player2.y][player2.x] = 2; 
updateThe(player2); 
player2.x++; 
maze[player2.y][player2.x] = 7; 
updateThe(player2); 
} 
} 
if (gameLevel != 0) mazeUpdateEx(player1,player2); 
break; 
case ENTER: 
inMenu(MENU_PAUSE); 
logo(2); etcolor(WHITE); 
if (gameLevel != 3){ 
for(i = 0; i < maxIdxY; i++){ 
for(j = 0; j < maxIdxX; j++){ 
if(reachIdx[i][j] == 1){ 
tmp.x = j; 
tmp.y = i; 
updateThe(tmp); 
} 
} 
} 
} 
else 
mazeUpdateEx(player1,player2); 
break; 
case ESC: 
switch(inMenu(MENU_GAMING)){ 
case 1: 
case 0: 
logo(2); 
setcolor(WHITE); 
if (gameLevel != 3){ 
for(i = 0; i < maxIdxY; i++){ 
for(j = 0; j < maxIdxX; j++){ 
if(reachIdx[i][j] == 1){ 
tmp.x = j; 
tmp.y = i; 
updateThe(tmp); 
} 
} 
} 
} 
else 
mazeUpdateEx(player1,player2); 
break; 
case 2:
initMaze(1); 
edIdx.x = maxIdxX - 2; 
edIdx.y = maxIdxY - 2; 
player1 = bgIdx; 
player2 = edIdx; 
createMaze(bgIdx, edIdx); 
maze[player1.y][player1.x] = 6; 
if (playerNum > 1) 
maze[player2.y][player2.x] = 7; 
logo(2); 

setfillstyle(SOLID_FILL,0); 
bar(50,50,MWIDTH+60,MHEIGHT+40); 

mazeUpdateEx(player1,player2); 
break; 
case 3:
playerNum = inMenu(MENU_MAIN); 
initMaze(1); 
edIdx.x = maxIdxX - 2; 
edIdx.y = maxIdxY - 2; 
player1 = bgIdx; 
player2 = edIdx; 
createMaze(bgIdx, edIdx); 
maze[player1.y][player1.x] = 6; 
if (playerNum > 1) 
maze[player2.y][player2.x] = 7; 
logo(2); 
mazeUpdateEx(player1,player2); 
break; 
case 4:
closegraph(); 
exit(1); 
} 
} 
if ((player1.x == edIdx.x && player1.y == edIdx.y) || (player2.x == bgIdx.x && player2.y == bgIdx.y)){ 
inMenu(MENU_SUCCESS); 
initMaze(1); 
edIdx.x = maxIdxX - 2; 
edIdx.y = maxIdxY - 2; 
player1 = bgIdx; 
player2 = edIdx; 
createMaze(bgIdx, edIdx); 
maze[player1.y][player1.x] = 6; 
if (playerNum > 1) 
maze[player2.y][player2.x] = 7; 
logo(2); 

setfillstyle(SOLID_FILL,0); 
bar(50,50,MWIDTH+60,MHEIGHT+40); 

mazeUpdateEx(player1,player2); 

musIdx = (musIdx >= 3 ? 0 : (musIdx + 1));
} 
playMusic(musIdx, 1); 
} 
}void updateThe(Index idx){ 
int width; 
int height; 

width = MWIDTH / maxIdxX; 
height = MHEIGHT / maxIdxY; 
if(showMode == 0) { 
if(maze[idx.y][idx.x] == 1){ 

if(idx.y > 0) 
if(maze[idx.y - 1][idx.x] == 1) 
line((50+width*idx.x), (60+height*idx.y), (50+width*idx.x), (60+height*idx.y) - (height / 2));
if(idx.y < maxIdxY - 1) 
if(maze[idx.y + 1][idx.x] == 1) 
line((50+width*idx.x), (60+height*idx.y), (50+width*idx.x), (60+height*idx.y) + (height / 2)); 
if(idx.x > 0) 
if(maze[idx.y][idx.x - 1] == 1) 
line((50+width*idx.x), (60+height*idx.y), (50+width*idx.x) - (width / 2), (60+height*idx.y)); 
if(idx.x < maxIdxX - 1) 
if(maze[idx.y][idx.x + 1] == 1) 
line((50+width*idx.x), (60+height*idx.y), (50+width*idx.x) + (width / 2), (60+height*idx.y)); 
} 
else if (maze[idx.y][idx.x] == 6 || maze[idx.y][idx.x] == 7){ 
setfillstyle(SOLID_FILL,maze[idx.y][idx.x]); 
bar((50+width*idx.x) - (width / 2), (60+height*idx.y) - (height / 2), (50+width*idx.x) + (width / 2), (60+height*idx.y) + (height / 2)); 
} 
else { 
setfillstyle(SOLID_FILL,0);  
  bar((50+width*idx.x) - (width / 2), (60+height*idx.y) - (height / 2), (50+width*idx.x) + (width / 2), (60+height*idx.y) + (height / 2)); 
  } 
} 
else{ 
if(maze[idx.y][idx.x] == 2){ 
setfillstyle(SOLID_FILL,15); 
bar((50+width*idx.x), (60+height*idx.y), (50+width*idx.x) + width, (60+height*idx.y) + height); 
} 
else{ 
setfillstyle(SOLID_FILL,maze[idx.y][idx.x]); 
bar((50+width*idx.x), (60+height*idx.y), (50+width*idx.x) + width, (60+height*idx.y) + height); 
} 
} 
} 

void updateRect(Index idx, int len){ 
Index bg,ed,tmp; 
int i,j; 

bg.x = (idx.x - len < 0 ? 0 : idx.x - len); 
bg.y = (idx.y - len < 0 ? 0 : idx.y - len); 
ed.x = (idx.x + len > maxIdxX - 1 ? maxIdxX - 1 : idx.x + len); 
ed.y = (idx.y + len > maxIdxY - 1 ? maxIdxY - 1 : idx.y + len); 

for(i = bg.y; i <= ed.y; i++){ 
for(j = bg.x; j <= ed.x; j++){ 
if(reachIdx[i][j] != 1){ 
tmp.x = j; 
tmp.y = i; 
updateThe(tmp); 
if(gameLevel != 3) 
reachIdx[i][j] = 1; 
} 
} 
} 
updateThe(idx); 
} 
void mazeUpdateEx(Index p1, Index p2){ 
static Index PP1 = {0, 0},PP2 = {0, 0}; 
int width; 
int height; 

setcolor(WHITE); 
switch(gameLevel){ 
case 0: 
mazeUpdate(); 
break; 
case 1:
updateRect(p1, 8); 
updateRect(p2, 8); 
break; 
case 2: 
updateRect(p1, 4); 
updateRect(p2, 4); 
break; 
case 3:
width = MWIDTH / maxIdxX; 
height = MHEIGHT / maxIdxY; 
setfillstyle(SOLID_FILL, BLACK); 
if (PP1.x > p1.x) bar((50+width*p1.x) + 4 * width, (60+height*p1.y) - 4 * height, (50+width*p1.x) + 5 * width, (60+height*p1.y) + 4 * height); 
else if (PP1.x < p1.x) bar((50+width*p1.x) - 5 * width, (60+height*p1.y) - 4 * height, (50+width*p1.x) - 2 * width, (60+height*p1.y) + 4 * height); 
if (PP1.y > p1.y) bar((50+width*p1.x) - 4 * width, (60+height*p1.y) + 2 * height, (50+width*p1.x) + 4 * width, (60+height*p1.y) + 5 * height); 
else if (PP1.y < p1.y) bar((50+width*p1.x) - 4 * width, (60+height*p1.y) - 5 * height, (50+width*p1.x) + 4 * width, (60+height*p1.y) - 2 * height); 

if (PP2.x > p2.x) bar((50+width*p2.x) + 4 * width, (60+height*p2.y) - 4 * height, (50+width*p2.x) + 5 * width, (60+height*p2.y) + 4 * height); 
else if (PP2.x < p2.x) bar((50+width*p2.x) - 5 * width, (60+height*p2.y) - 4 * height, (50+width*p2.x) - 2 * width, (60+height*p2.y) + 4 * height); 
if (PP2.y > p2.y) bar((50+width*p2.x) - 4 * width, (60+height*p2.y) + 2 * height, (50+width*p2.x) + 4 * width, (60+height*p2.y) + 5 * height); 
else if (PP2.y < p2.y) bar((50+width*p2.x) - 4 * width, (60+height*p2.y) - 5 * height, (50+width*p2.x) + 4 * width, (60+height*p2.y) - 2 * height); 

PP1 = p1; 
PP2 = p2; 
setcolor(WHITE); 
updateRect(p1, 3); 
updateRect(p2, 3); 
break; 
} 
} int main(){ 
int i,j; 
initGrphErrExit(); 
initMaze(0); 

playGame(); 
getch(); 
} 
/*mazeMain 结束*//*把此文件保存为crtMaze.c*/ 
#define MWIDTH 480 
#define MHEIGHT 350 
#define BEND_LEVEL 35 

#include <stdio.h> 
#include <graphics.h> 
#include <stdlib.h> 

typedef struct { 
int x; 
int y; 
}Index; 

typedef unsigned char Status; 

Status maze[75][97]; 
int showMode = 0; 
int maxIdxX = 61; 
int maxIdxY = 47; 

void createMaze (Index bgIdx, Index edIdx); 
void mazeUpdate (void); 
int canReach (Index idx1, Index idx2); 
int stackFind2 (Index idx1, Index idx2); 
int dirRand (int dirIn); 
int createMainPath (Index idx1, Index idx2, int num, int flag);
int randTrue (int pst); 
int createPath (Index idx1, int len, int num, int flag);
int getOutCount (void); 
void  beautifyMaze (Index start); 
void waterFlood (Index start); 
void  crPhLT (void); 
void  crPhRB (void); 
void createMaze(Index bgIdx, Index edIdx){ 
int k,l; 
createMainPath(bgIdx, edIdx, 1000, 1); 
while(getOutCount() != 0){ 
crPhLT(); 
crPhRB(); 
} 
beautifyMaze(bgIdx); 
} 
void crPhLT(void){ 
Index tmp; 
int i,j; 
for(i = 1; i < maxIdxY - 1; i++){ 
for(j = 1; j < maxIdxX - 1; j++){ 
if (maze[i][j] == 12){ 
tmp.y = i; 
tmp.x = j; 
if(createPath(tmp, 50, 100, 1)) return; 
} 
} 
} 
} 

void crPhRB(void){ 
Index tmp; 
int i,j; 
for(i = maxIdxY - 2; i > 0; i--){ 
for(j = maxIdxX - 2; j > 0; j--){ 
if (maze[i][j] == 12){ 
tmp.y = i; 
tmp.x = j; 
if(createPath(tmp, 50, 100, 1)) return; 
} 
} 
} 
} 

void mazeUpdate(void){ 
int i,j; 
int width; 
int height; 

width = MWIDTH / maxIdxX; 
height = MHEIGHT / maxIdxY; 

if (showMode == 0) { 
setfillstyle(SOLID_FILL,0); 
bar(50,50,MWIDTH+60,MHEIGHT+40); 
setcolor(WHITE); 
} 

for(i = 0; i < maxIdxY; i++){ 
for(j = 0; j < maxIdxX; j++){ 
if(showMode == 0) { 
if(maze[i][j] == 1){ 

if(i > 0) 
if(maze[i - 1][j] == 1) 
line((50 + width * j), (60 + height * i), (50 + width * j), (60 + height * i) - (height / 2));
if(i < maxIdxY - 1) 
if(maze[i + 1][j] == 1) 
line((50 + width * j), (60 + height * i), (50 + width * j), (60 + height * i) + (height / 2)); 
if(j > 0) 
if(maze[i][j - 1] == 1) 
line((50 + width * j), (60 + height * i), (50 + width * j) - (width / 2), (60 + height * i)); 
if(j < maxIdxX - 1) 
if(maze[i][j + 1] == 1) 
line((50 + width * j), (60 + height * i), (50 + width * j) + (width / 2), (60 + height * i)); 
} 
else if (maze[i][j] == 6 || maze[i][j] == 7){ 
setfillstyle(SOLID_FILL,maze[i][j]); 
bar((50 + width * j) - (width / 2), (60 + height * i) - (height / 2), (50 + width * j) + (width / 2), (60 + height * i) + (height / 2)); 
} 
else { 
setfillstyle(SOLID_FILL,0);  
  bar((50 + width * j) - (width / 2), (60 + height * i) - (height / 2), (50 + width * j) + (width / 2), (60 + height * i) + (height / 2)); 
  } 
} 
else{ 
if(maze[i][j] == 2){ 
setfillstyle(SOLID_FILL,15); 
bar((50 + width * j), (60 + height * i), (50 + width * j) + width, (60 + height * i) + height); 
} 
else{ setfillstyle(SOLID_FILL,maze[i][j]); 
bar((50 + width * j), (60 + height * i), (50 + width * j) + width, (60 + height * i) + height); 
} 
} 
} 
} 
} 

int canReach(Index idx1, Index idx2){ 
int ret; 
int tmpST[75][97]; 
int i,j; 

if ((maze[idx1.y][idx1.x] == 1) || (maze[idx2.y][idx2.x] == 1)) return 0; 

for(i = 0; i < maxIdxY; i++) 
for(j = 0; j < maxIdxX; j++) 
tmpST[i][j] = maze[i][j]; 
ret = stackFind2(idx1, idx2); 
for(i = 0; i < maxIdxY; i++) 
for(j = 0; j < maxIdxX; j++) 
maze[i][j] = tmpST[i][j]; 
return ret; 
} 

int stackFind2(Index idx1, Index idx2){ 
register int i, j, count = 0; 

maze[idx1.y][idx1.x] = 11; 
for(;;){ 
count = 0; 
for(i = 1; i < maxIdxY - 1; i++){ 
for(j = 1; j < maxIdxX - 1; j++){ 
if(maze[i][j] == 11){ 
if(maze[i + 1][j] == 0){ 
maze[i + 1][j] = 11; 
count++; 
} 
if(maze[i][j + 1] == 0){ 
maze[i][j + 1] = 11; 
count++; 
} 
if(maze[i - 1][j] == 0){ 
maze[i - 1][j] = 11; 
count++; 
} 
if(maze[i][j - 1] == 0){ 
maze[i][j - 1] = 11; 
count++; 
} 
} 
if(maze[idx2.y][idx2.x] == 11) return 1; 
} 
} 
if(count == 0) 
return ((maze[idx2.y][idx2.x] == 11) ? 1 : 0); 
} 
} 

int dirRand(int dirIn){ 
int dir[4] = {0, 0, 0, 0}; 
int ind = 0; 
int ret; 
int tmp; 
static int lstDir; 

if((dirIn == 0) || (dirIn == 1) || (dirIn == 2) || (dirIn == 4) || (dirIn == 8)) 
return dirIn;
else{
if(dirIn >= 8){ 
dirIn -= 8; 
dir[ind] = 8; 
ind++; 
} 
if(dirIn >= 4){ 
dirIn -= 4; 
dir[ind] = 4; 
ind++; 
} 
if(dirIn >= 2){ 
dirIn -= 2; 
dir[ind] = 2; 
ind++; 
} 
if(dirIn){ 
dir[ind] = 1; 
ind++; 
} 

tmp = random(100); 
if (tmp > BEND_LEVEL) 
if ((dir[0] == lstDir || dir[1] == lstDir || dir[2] == lstDir || dir[3] == lstDir) && (lstDir != 0)) 
return lstDir; 
else 
ret = (random(100)) % ind; 
else 
ret = (random(100)) % ind; 
lstDir = dir[ret]; 
return lstDir; 
} 
} 

int createMainPath (Index idx1, Index idx2, int num, int flag){ 
Index crIdx = idx1; 
Index tmp; 
int dirCh = 0; 
int tmpDir = 0;
int qDir = 0; 
int outCnt = 0; 

if(!canReach(idx1, idx2)) return 0; 

while(crIdx.x != idx2.x || crIdx.y != idx2.y){ 
maze[crIdx.y][crIdx.x] = 2; 
dirCh = 0;tmpDir = 0;qDir = 0; 
tmp.y = crIdx.y - 1; 
tmp.x = crIdx.x; 
if (maze[tmp.y][tmp.x] == 0) 
if (canReach(tmp, idx2)) 
dirCh += 8; 
else maze[tmp.y][tmp.x] = 1; 

tmp.y = crIdx.y + 1; 
tmp.x = crIdx.x; 
if (maze[tmp.y][tmp.x] == 0)  
if (canReach(tmp, idx2)) 
dirCh += 2; 
else maze[tmp.y][tmp.x] = 1; 

tmp.y = crIdx.y; 
tmp.x = crIdx.x + 1; 
if (maze[tmp.y][tmp.x] == 0) 
if (canReach(tmp, idx2)) 
dirCh += 1; 
else maze[tmp.y][tmp.x] = 1; 

tmp.y = crIdx.y; 
tmp.x = crIdx.x - 1; 
if (maze[tmp.y][tmp.x] == 0) 
if (canReach(tmp, idx2)) 
dirCh += 4; 
else maze[tmp.y][tmp.x] = 1; 

tmpDir = dirRand(dirCh); 
qDir = dirCh - tmpDir; if (qDir >= 8){ 
qDir -= 8; 
if(flag == 1 && outCnt < num){ 
if(randTrue(15)){ 
maze[crIdx.y - 1][crIdx.x] = 12; 
outCnt++; 
} 
else 
maze[crIdx.y - 1][crIdx.x] = 1; 
} 
else 
maze[crIdx.y - 1][crIdx.x] = 1; 
} 
if (qDir >= 4){ 
qDir -= 4; 
if(flag == 1 && outCnt < num){ 
if(randTrue(15)){ 
maze[crIdx.y][crIdx.x - 1] = 12; 
outCnt++; 
} 
else 
maze[crIdx.y][crIdx.x - 1] = 1; 
} 
else 
maze[crIdx.y][crIdx.x - 1] = 1; 
} 
if (qDir >= 2){ 
qDir -= 2; 
if(flag == 1 && outCnt < num){ 
if(randTrue(15)){ 
maze[crIdx.y + 1][crIdx.x] = 12; 
outCnt++; 
} 
else 
maze[crIdx.y + 1][crIdx.x] = 1; 
} 
else 
maze[crIdx.y + 1][crIdx.x] = 1; 
} 
if (qDir == 1){ 
if(flag == 1 && outCnt < num){ 
if(randTrue(15)){ 
maze[crIdx.y][crIdx.x + 1] = 12; 
outCnt++; 
} 
else 
maze[crIdx.y][crIdx.x + 1] = 1; 
} 
else 
maze[crIdx.y][crIdx.x + 1] = 1; 
} 

switch(tmpDir){
case 8: 
crIdx.y--; 
break; 
case 2: 
crIdx.y++; 
break; 
case 1: 
crIdx.x++; 
break; 
case 4: 
crIdx.x--; 
break; 
default: 
printf("Maybe there're some BUG in Creating Path!\n"); 
mazeUpdate(); 
getch(); 
exit(0); 
} 
} 
maze[idx2.y][idx2.x] = 2; 
if(maze[idx2.y + 1][idx2.x] == 0) maze[idx2.y + 1][idx2.x] = 1; 
if(maze[idx2.y][idx2.x + 1] == 0) maze[idx2.y][idx2.x + 1] = 1; 
if(maze[idx2.y][idx2.x - 1] == 0) maze[idx2.y][idx2.x - 1] = 1; 
if(maze[idx2.y - 1][idx2.x] == 0) maze[idx2.y - 1][idx2.x] = 1; 
if(maze[idx2.y + 1][idx2.x + 1] == 0) maze[idx2.y + 1][idx2.x + 1] = 1; 
if(maze[idx2.y - 1][idx2.x + 1] == 0) maze[idx2.y - 1][idx2.x + 1] = 1; 
if(maze[idx2.y + 1][idx2.x - 1] == 0) maze[idx2.y + 1][idx2.x - 1] = 1; 
if(maze[idx2.y - 1][idx2.x - 1] == 0) maze[idx2.y - 1][idx2.x - 1] = 1; 

return 1; 
} 

int randTrue (int pst){ 
if (pst > 100) pst = 100; 
if (pst < 0) pst = 0; 
if (random(100) < pst) return 1; 
else return 0; 
} 

int createPath (Index idx1, int len, int num, int flag){ 
Index crIdx = idx1; 
Index tmp; 
int dirCh = 0; 
int tmpDir = 0;
int qDir = 0; 
int outCnt = 0;
int lngth = 0; 

if ((maze[crIdx.y + 1][crIdx.x] != 0) && \ 
 (maze[crIdx.y - 1][crIdx.x] != 0) && \ 
 (maze[crIdx.y][crIdx.x + 1] != 0) && \ 
 (maze[crIdx.y][crIdx.x - 1] != 0)){ 
maze[crIdx.y][crIdx.x] = 1; 

  return 0; 
} 

while(1){ 
maze[crIdx.y][crIdx.x] = 2; 
lngth++; 
if (lngth >= len) break; 

dirCh = 0;tmpDir = 0;qDir = 0; 

tmp.y = crIdx.y - 1; 
tmp.x = crIdx.x; 
if (maze[tmp.y][tmp.x] == 0) 
dirCh += 8; 

tmp.y = crIdx.y + 1; 
tmp.x = crIdx.x; 
if (maze[tmp.y][tmp.x] == 0) 
dirCh += 2; 

tmp.y = crIdx.y; 
tmp.x = crIdx.x + 1; 
if (maze[tmp.y][tmp.x] == 0) 
dirCh += 1; 

tmp.y = crIdx.y; 
tmp.x = crIdx.x - 1; 
if (maze[tmp.y][tmp.x] == 0) 
dirCh += 4; 

if (dirCh == 0) break; 

tmpDir = dirRand(dirCh); 
qDir = dirCh - tmpDir; if (qDir >= 8){ 
qDir -= 8; 
if(flag == 1 && outCnt < num){ 
if(randTrue(30)){ 
maze[crIdx.y - 1][crIdx.x] = 12; 
outCnt++; 
} 
else 
maze[crIdx.y - 1][crIdx.x] = 1; 
} 
else 
maze[crIdx.y - 1][crIdx.x] = 1; 
} 
if (qDir >= 4){ 
qDir -= 4; 
if(flag == 1 && outCnt < num){ 
if(randTrue(30)){ 
maze[crIdx.y][crIdx.x - 1] = 12; 
outCnt++; 
} 
else 
maze[crIdx.y][crIdx.x - 1] = 1; 
} 
else 
maze[crIdx.y][crIdx.x - 1] = 1; 
} 
if (qDir >= 2){ 
qDir -= 2; 
if(flag == 1 && outCnt < num){ 
if(randTrue(30)){ 
maze[crIdx.y + 1][crIdx.x] = 12; 
outCnt++; 
} 
else 
maze[crIdx.y + 1][crIdx.x] = 1; 
} 
else 
maze[crIdx.y + 1][crIdx.x] = 1; 
} 
if (qDir == 1){ 
if(flag == 1 && outCnt < num){ 
if(randTrue(30)){ 
maze[crIdx.y][crIdx.x + 1] = 12; 
outCnt++; 
} 
else 
maze[crIdx.y][crIdx.x + 1] = 1; 
} 
else 
maze[crIdx.y][crIdx.x + 1] = 1; 
} 

switch(tmpDir){
case 8: 
crIdx.y--; 
break; 
case 2: 
crIdx.y++; 
break; 
case 1: 
crIdx.x++; 
break; 
case 4: 
crIdx.x--; 
break; 
default: 
printf("Maybe there're some BUG in Creating Path!\n"); 
mazeUpdate(); 
getch(); 
exit(0); 
} 
} 
if(maze[crIdx.y + 1][crIdx.x] == 0) maze[crIdx.y + 1][crIdx.x] = 1; 
if(maze[crIdx.y][crIdx.x + 1] == 0) maze[crIdx.y][crIdx.x + 1] = 1; 
if(maze[crIdx.y][crIdx.x - 1] == 0) maze[crIdx.y][crIdx.x - 1] = 1; 
if(maze[crIdx.y - 1][crIdx.x] == 0) maze[crIdx.y - 1][crIdx.x] = 1; 
if(maze[crIdx.y + 1][crIdx.x + 1] == 0) maze[crIdx.y + 1][crIdx.x + 1] = 1; 
if(maze[crIdx.y - 1][crIdx.x + 1] == 0) maze[crIdx.y - 1][crIdx.x + 1] = 1; 
if(maze[crIdx.y + 1][crIdx.x - 1] == 0) maze[crIdx.y + 1][crIdx.x - 1] = 1; 
if(maze[crIdx.y - 1][crIdx.x - 1] == 0) maze[crIdx.y - 1][crIdx.x - 1] = 1; 
return 1; 
} 

int getOutCount(void){ 
int c = 0; 
int i,j; 
for(i = 1; i < maxIdxY - 1; i++) 
for(j = 1; j < maxIdxX - 1; j++) 
if (maze[i][j] == 12) c++; 
return c; 
} 

void beautifyMaze (Index start){ 
int i, j; 
Index tmp; 
for(i = 1; i < maxIdxY - 1; i++){ 
for(j = 1; j < maxIdxX - 1; j++){ 
if (maze[i][j] == 0){ 
maze[i][j] = 12; 
tmp.y = i; 
tmp.x = j; 
createPath(tmp, 100, 0, 0); 
} 
} 
} 

for(i = 1; i < maxIdxY - 1; i++){ 
for(j = 1; j < maxIdxX - 1; j++){ 
if ((maze[i + 1][j] == 1) && \ 
   (maze[i - 1][j] == 1) && \ 
   (maze[i][j + 1] == 1) && \ 
   (maze[i][j - 1] == 1) && \ 
   (maze[i + 1][j - 1] == 1) && \ 
   (maze[i - 1][j + 1] == 1) && \ 
   (maze[i + 1][j + 1] == 1) && \ 
   (maze[i - 1][j - 1] == 1)){ 
maze[i][j] = 2; 
if(j > maxIdxX/2) maze[i][j - 1] = 2; 
else maze[i][j + 1] = 2; 
} 
} 
} 

waterFlood(start); 
for(i = 1; i < maxIdxY - 1; i++){
for(j = 1; j < maxIdxX - 1; j++){ 
if (maze[i][j] == 2){ 
if (i == 1 && j == 1) continue; 
else if (i == 1){ 
maze[i][j - 1] = 2; 
waterFlood(start); 
} 
else { 
maze[i - 1][j] = 2; 
waterFlood(start); 
} 
} 
} 
} 

for(i = 1; i < maxIdxY - 1; i++){ 
for(j = 1; j < maxIdxX - 1; j++){ 
if (maze[i][j] == 5) maze[i][j] = 2; 
} 
} 
} 

void waterFlood (Index start){ 
register int i, j, count = 0; 

maze[start.y][start.x] = 5; 
for(;;){ 
count = 0; 
for(i = 1; i < maxIdxY - 1; i++){ 
for(j = 1; j < maxIdxX - 1; j++){ 
if(maze[i][j] == 5 ){ 
if(maze[i + 1][j] == 2){ 
maze[i + 1][j] = 5; 
count++; 
} 
if(maze[i][j + 1] == 2){ 
maze[i][j + 1] = 5; 
count++; 
} 
if(maze[i - 1][j] == 2){ 
maze[i - 1][j] = 5; 
count++; 
} 
if(maze[i][j - 1] == 2){ 
maze[i][j - 1] = 5; 
count++; 
} 
} 
} 
} 
if(count == 0) 
return; 
} 
} 

/*crtMaze.c 结束*/struct Note soundNotes[4][4] = {{{C,P1},{E,P1},{G,P1},{C1,P1}}, 
{{C1,P4_1},{G,P4_1},{C1,P4_1},{G,P4_1}}, 
{{C0,P4_1}}, 
{{E0,P4_1},{G0,P4_1}} 
 }; 

struct { 
int interval; 
int lastTime; 
} musicTimer; 

int musicOn = 1; 
int songLen[4] = {106,75,76,64}; 
int soundLen[4] = {3,3,0,1}; 

int  getMemTime (void); 
void  initMusic (void); 
void playMusic (int musIdx, int loop); 
void  playSound (int musIdx, int key); 

int getMemTime(){ 
int ret; 
ret = peek(0x0,0x46e); 
ret <<= 8; 
ret += peek(0x0,0x46c); 
return (ret); 
} 
void initMusic(void){ 
musicTimer.lastTime = getMemTime(); 
musicTimer.interval = 0; 
} 

void playMusic(int musIdx, int loop){ 
static tmpIdx = 0; 
static tmploop = 0; 
static current = 0; 
int vTime; 

if(musIdx != tmpIdx || loop != tmploop){ 
current = 0; 
tmpIdx = musIdx; 
tmploop = loop; 
} 

if(musicOn){ 
vTime=getMemTime() - musicTimer.lastTime; 
if(vTime >= musicTimer.interval){ 
if(current > songLen[musIdx] - 1){ 
if (loop != 0){ 
current = 0; 
sound(musicNotes[musIdx][current].s); 
musicTimer.interval = musicNotes[musIdx][current].len; 
musicTimer.lastTime = getMemTime(); 
current++; 
} 
else 
nosound(); 
return; 
} 
else{ 
sound(musicNotes[musIdx][current].s); 
musicTimer.interval = musicNotes[musIdx][current].len; 
musicTimer.lastTime = getMemTime(); 
current++; 
} 
} 
} 
} 

void playSound(int musIdx, int key){ 
static tmpIdx = 0; 
static tmpKey = 0; 
static current = 0; 
int vTime; 

if(musIdx != tmpIdx || key != tmpKey){ 
current = 0; 
tmpIdx = musIdx; 
tmpKey = key; 
} 

if(musicOn){ 
vTime=getMemTime() - musicTimer.lastTime; 
if(vTime >= musicTimer.interval){ 
if(current > soundLen[musIdx]){ 
nosound(); 
return; 
} 
else{ 
sound(soundNotes[musIdx][current].s); 
musicTimer.interval = soundNotes[musIdx][current].len; 
musicTimer.lastTime = getMemTime(); 
current++; 
} 
} 
} 
} 
/*music.c 结束*//*把此文件保存为logo.c*/ 
void logo (int lgIndex); 

void logo (int lgIndex){ 
switch(lgIndex){ 
case 0:
settextstyle(0, 0, 5); 
setcolor(RED); 
outtextxy(175, 41, "S"); 
setcolor(YELLOW); 
outtextxy(210, 41, "U"); 
setcolor(BLUE); 
outtextxy(250, 41, "P"); 
setcolor(CYAN); 
outtextxy(290, 41, "E"); 
setcolor(MAGENTA); 
outtextxy(330, 41, "R"); 
settextstyle(0, 0, 7); 
setcolor(LIGHTBLUE); 
outtextxy(310, 100, "M"); 
setcolor(RED); 
outtextxy(360, 100, "A"); 
setcolor(YELLOW); 
outtextxy(410, 100, "Z"); 
setcolor(BLUE); 
outtextxy(460, 100, "E"); 
setcolor(MAGENTA); 
rectangle(167,84,380,90); 
setcolor(GREEN); 
rectangle(288,159,524,165); 

setcolor(RED); 
rectangle(170,104,279,153); 
setcolor(YELLOW); 
rectangle(156,122,254,186); 
setcolor(BLUE); 
rectangle(226,129,264,198); 
setcolor(CYAN); 
rectangle(115,145,187,209); 

setcolor(MAGENTA); 
rectangle(376,48,422,71); 
setcolor(GREEN); 
rectangle(399,63,458,80); 
setcolor(LIGHTBLUE); 
rectangle(446,35,588,93); 
setcolor(MAGENTA); 
settextstyle(0, 0, 0); 
outtextxy(475, 46, "PROGRAMMER"); 
outtextxy(470, 68, "WEN XICHANG"); 
settextstyle(0, 0, 0); 
break;
case 1: 
setcolor(WHITE); 
outtextxy(155, 103, "SUPER MAZE"); 
setcolor(LIGHTBLUE); 
outtextxy(155, 131, "VER 1.1"); 
setcolor(RED); 
outtextxy(155, 155, "PROGRAMMER"); 
outtextxy(155, 175, "WEN XICHANG"); 
outtextxy(155, 191, "GDUFS"); 
setcolor(LIGHTBLUE); 
outtextxy(385, 317, "2005.2.7"); 

setcolor(YELLOW); 
rectangle(444,138,468,164); 
setcolor(LIGHTBLUE); 
rectangle(411,150,453,182); 
setcolor(GREEN); 
rectangle(393,170,438,240); 
setcolor(MAGENTA); 
rectangle(380,198,428,264); 
setcolor(GREEN); 
rectangle(295,257,471,273); 
setcolor(BLUE); 
rectangle(155,285,361,316); 
setcolor(CYAN); 
rectangle(318,240,329,321); 
setcolor(YELLOW); 
outtextxy(160, 290, "QQ:375020128"); 
break;case 2: 

setcolor(GREEN); 
rectangle(457,12,579,35); 
setcolor(WHITE); 
outtextxy(478, 19, "SUPER MAZE"); 

setcolor(LIGHTBLUE); 
rectangle(589,185,602,433); 
setcolor(RED); 
rectangle(573,360,596,424); 
setcolor(GREEN); 
rectangle(548,395,612,446); 
setcolor(BLUE); 
rectangle(438,429,569,456); 
setcolor(YELLOW); 
rectangle(349,434,498,446); 
setcolor(MAGENTA); 
rectangle(141,437,375,440); 
setcolor(WHITE); 
setfillstyle(SOLID_FILL, WHITE); 
bar(271,413,530,426); 

setcolor(BLACK); 
outtextxy(276, 416, "WENXICHANG@STUDENT.GDUFS.EDU.CN"); 
break; 
case 3: 
setcolor(GREEN); 
rectangle(249,215,305,237); 
setcolor(MAGENTA); 
rectangle(277,233,321,248); 
setcolor(YELLOW); 
rectangle(301,244,370,257); 
setcolor(BLUE); 
rectangle(367,215,381,266); 
setcolor(LIGHTBLUE); 
rectangle(239,253,319,278); 
setcolor(RED); 
outtextxy(247, 261, "OPTIONS"); 
break; 
case 4: 
setcolor(GREEN); 
rectangle(240,162,325,188); 
setcolor(LIGHTBLUE); 
rectangle(277,155,305,166); 
setcolor(CYAN); 
rectangle(313,177,357,207); 
setcolor(BLUE); 
rectangle(348,162,370,185); 
setcolor(YELLOW); 
rectangle(362,172,426,195); 

setcolor(YELLOW); 
outtextxy(250, 171, "MAZE..."); 
break; 
case 5: 
settextstyle(0, 0, 3); 
setcolor(YELLOW); 
outtextxy(255, 215, "PAUSE!"); 
settextstyle(0, 0, 0); 
break; 
case 6: 
settextstyle(0, 0, 2); 
setcolor(GREEN); 
rectangle(245,183,253,204); 
setcolor(MAGENTA); 
rectangle(251,179,269,191); 
setcolor(RED); 
rectangle(263,185,381,196); 
setcolor(LIGHTBLUE); 
rectangle(257,263,289,300); 
setcolor(YELLOW); 
rectangle(278,270,387,277); 
setcolor(CYAN); 
rectangle(378,266,395,286); 
setcolor(BLUE); 
rectangle(387,254,398,276); 

setcolor(YELLOW); 
outtextxy(245, 215, "WELL DONE!"); 
settextstyle(0, 0, 0); 
} 
} 
/*logo.c 结束*//*把此文件保存为menu.c*/ 
 #define MENU_MAIN 0 
 #define MENU_OPTIONS 1 
 #define MENU_ABOUT 2 
 #define MENU_SIZE_SELECT 3 
 #define MENU_GAMING 4 
 #define MENU_PAUSE 5 
 #define MENU_SUCCESS 6 
 #define MENU_LEVEL 7 
  
char *strMain[6] = {" ", "1 PLAYER", "2 PLAYERS", "OPTIONS...", "ABOUT", "QUIT"}; 
char *strOptions[6] = {" ", "SOUND: ", "MAZE SIZE...", "DRAW MODE: ", "GAME LEVEL...", "EXIT"}; 
char *strSize[5] = {" ", "HUGE", "LARGE", "NORMAL", "SMALL"}; 
char *strGaming[5] = {" ", "CONTINUE", "NEW GAME", "RETURN TO MAIN MENU...", "QUIT"}; 
char *strLevel[5] = {" ", "EASY", "NORMAL", "HARD", "UNBELIEVABLE"}; 

extern int musicOn; 
extern int playerNum; 
extern int gameLevel; 

int  inMenu (int mnIndex); 
void updateMenu (char *str[], int num, int crnt, int x, int y); 
void outMenu (int mnIndex); /* x, y 起始位置, style 风格 */ 
void dBorder (int x1, int y1, int x2, int y2, int color); 
void initMaze (int flag); 
void logo (int lgIndex); 
void  playSound (int musIdx, int key); 

int inMenu(int mnIndex){ 
int current = 1; 
int key; 
int tmp; 
static int muDelta = 3; 
int sdIdx = 3; 

muDelta++; 
switch(mnIndex){ 
case MENU_MAIN: 
cleardevice();updateMenu(strMain, 6, current, 290, 240); 
logo(0); 
dBorder(260, 220, 380 ,390, LIGHTBLUE); 
for(;;){ 
if (bioskey(1)) 
key=bioskey(0); 
else 
key=0; 

switch(key){ 
case UP: 
current = (current <= 1 ? 1 : current - 1); 
updateMenu(strMain, 6, current, 290, 240); 
sdIdx = 2; 
muDelta++; 
break; 
case DOWN: 
current = (current >= 5 ? 5 : current + 1); 
updateMenu(strMain, 6, current, 290, 240); 
sdIdx = 2; 
muDelta++; 
break; 
case ENTER: 
if (current <= 2){ 
outMenu(MENU_MAIN); 
return current; 
} 
else if (current == 3) inMenu(MENU_OPTIONS); 
else if (current == 4) inMenu(MENU_ABOUT); 
else if (current == 5) { 
closegraph(); 
exit(1); 
} 
logo(0); 
updateMenu(strMain, 6, current, 290, 240); 
dBorder(260, 220, 380 ,390, LIGHTBLUE); 
break; 
} 
playSound(sdIdx, muDelta); 
} 
case MENU_OPTIONS: 
setfillstyle(SOLID_FILL,0); 
bar(220, 80, 420, 300); 
dBorder(220, 80, 420, 300,LIGHTBLUE); 
logo(3); 
updateMenu(strOptions, 6, current, 250, 100); 
bar(320,120,360,135); 
if (musicOn) outtextxy(320 ,120, "ON"); 
else outtextxy(320 ,120, "OFF"); 
bar(360, 160, 409, 200); 
if (showMode) outtextxy(360, 160, "PUZZLE"); 
else outtextxy(360, 160, "LINE"); 

for(;;){ 
if (bioskey(1)) 
key=bioskey(0); 
else 
key=0; 

switch(key){ 
case UP:  
current = (current <= 1 ? 1 : current - 1); 
updateMenu(strOptions, 6, current, 250, 100); 
sdIdx = 2; 
muDelta++; 
break; 
case DOWN:  
current = (current >= 5 ? 5 : current + 1); 
updateMenu(strOptions, 6, current, 250, 100); 
sdIdx = 2; 
muDelta++; 
break;case ENTER: 
switch(current){ 
case 1: 
musicOn = (musicOn == 0 ? 1: 0); 

updateMenu(strOptions, 6, current, 250, 100); 
bar(320,120,360,135); 
if (musicOn) outtextxy(320 ,120, "ON"); 
else outtextxy(320 ,120, "OFF"); 
bar(360, 160, 409, 200); 
if (showMode) outtextxy(360, 160, "PUZZLE"); 
else outtextxy(360, 160, "LINE"); 

sdIdx = 2; 
muDelta++; 
break; 

case 2: 
tmp = inMenu(MENU_SIZE_SELECT); 

logo(3); 
dBorder(220, 80, 420, 300, LIGHTBLUE); 
updateMenu(strOptions, 6, current, 250, 100); 
bar(320,120,360,135); 
if (musicOn) outtextxy(320 ,120, "ON"); 
else outtextxy(320 ,120, "OFF"); 
bar(360, 160, 409, 200); 
if (showMode) outtextxy(360, 160, "PUZZLE"); 
else outtextxy(360, 160, "LINE"); 

switch(tmp){ 
case 1: 
maxIdxX = 97; 
maxIdxY = 75; 
break; 
case 2: 
maxIdxX = 79; 
maxIdxY = 61; 
break; 
case 3: 
maxIdxX = 61; 
maxIdxY = 47; 
break; 
case 4: 
maxIdxX = 43; 
maxIdxY = 33; 
} 
initMaze(1); 
break; 
case 3: 
showMode = (showMode == 0? 1:0); 

updateMenu(strOptions, 6, current, 250, 100); 
bar(320,120,360,135); 
if (musicOn) outtextxy(320 ,120, "ON"); 
else outtextxy(320 ,120, "OFF"); 
bar(360, 160, 409, 200); 
if (showMode) outtextxy(360, 160, "PUZZLE"); 
else outtextxy(360, 160, "LINE"); 

sdIdx = 2; 
muDelta++; 

break; 
case 4: 
tmp = inMenu(MENU_LEVEL); 

logo(3); 
dBorder(220, 80, 420, 300, LIGHTBLUE); 
updateMenu(strOptions, 6, current, 250, 100); 
bar(320,120,360,135); 
if (musicOn) outtextxy(320 ,120, "ON"); 
else outtextxy(320 ,120, "OFF"); 
bar(360, 160, 409, 200); 
if (showMode) outtextxy(360, 160, "PUZZLE"); 
else outtextxy(360, 160, "LINE"); 

if (tmp != 0) gameLevel = tmp - 1; 
break; 
case 5: 
outMenu(MENU_OPTIONS); 
return 5; 
} 
break;case ESC: 
outMenu(MENU_OPTIONS); 
return 0; 
} 
playSound(sdIdx, muDelta); 
} 
case MENU_ABOUT: 
setfillstyle(SOLID_FILL,0); 
bar(128, 84, 512, 344); 
logo(1); 
dBorder(128, 84, 512, 344,LIGHTBLUE); 
while(getch() != 13); 
outMenu(MENU_ABOUT); 
return 0; 
case MENU_SIZE_SELECT: 
setfillstyle(SOLID_FILL,0); 
bar(320, 120, 400, 220); 

switch(maxIdxX){ 
case 97: 
current = 1; 
break; 
case 79: 
current = 2; 
break; 
case 61: 
current = 3; 
break; 
case 43: 
current = 4; 
} 

updateMenu(strSize, 5, current, 340, 117); 
dBorder(320, 120, 400, 220, LIGHTBLUE); 

for(;;){ 
if (bioskey(1)) 
key=bioskey(0); 
else 
key=0; 

switch(key){ 
case UP: 
current = (current <= 1 ? 1 : current - 1); 
updateMenu(strSize, 5, current, 340, 117); 

sdIdx = 2; 
muDelta++; 
break; 
case DOWN:  
current = (current >= 4 ? 4 : current + 1); 
updateMenu(strSize, 5, current, 340, 117); 

sdIdx = 2; 
muDelta++; 
break; 
case ENTER: 
outMenu(MENU_SIZE_SELECT); 
return current; 
case ESC: 
outMenu(MENU_SIZE_SELECT); 
return 0; 
} 
playSound(sdIdx, muDelta); 
}case MENU_LEVEL: 
setfillstyle(SOLID_FILL,0); 
bar(270, 120, 400, 220); 

current = gameLevel + 1; 

updateMenu(strLevel, 5, current, 290, 117); 
dBorder(270, 120, 400, 220, LIGHTBLUE); 

for(;;){ 
if (bioskey(1)) 
key=bioskey(0); 
else 
key=0; 

switch(key){ 
case UP: 
current = (current <= 1 ? 1 : current - 1); 
updateMenu(strLevel, 5, current, 290, 117); 
sdIdx = 2; 
muDelta++; 
break; 
case DOWN:  
current = (current >= 4 ? 4 : current + 1); 
updateMenu(strLevel, 5, current, 290, 117); 
sdIdx = 2; 
muDelta++; 
break; 
case ENTER: 
outMenu(MENU_LEVEL); 
return current; 
case ESC: 
outMenu(MENU_LEVEL); 
return 0; 
} 
playSound(sdIdx, muDelta); 
} 
case MENU_GAMING: 
setfillstyle(SOLID_FILL,0); 
bar(190, 140, 450, 320); 
logo(4); 
dBorder(190, 140, 450, 320,LIGHTBLUE); 
updateMenu(strGaming, 5, current, 250, 200); 

for(;;){ 
if (bioskey(1)) 
key=bioskey(0); 
else 
key=0; 

switch(key){ 
case UP: 
current = (current <= 1 ? 1 : current - 1); 
updateMenu(strGaming, 5, current, 250, 200); 
sdIdx = 2; 
muDelta++; 
break; 
case DOWN:  
current = (current >= 4 ? 4 : current + 1); 
updateMenu(strGaming, 5, current, 250, 200); 
sdIdx = 2; 
muDelta++; 
break; 
case ESC: 
outMenu(MENU_GAMING); 
return 0; 
case ENTER: 
outMenu(MENU_GAMING); 
return current; 
} 
playSound(sdIdx, muDelta); 
}case MENU_PAUSE: 
setfillstyle(SOLID_FILL,0); 
bar(220, 160,420, 320); 
dBorder(220, 160, 420, 320, LIGHTBLUE); 
logo(5); 

for(;;){ 
if (bioskey(1)) 
key=bioskey(0); 
else 
key=0; 
playSound(1, muDelta); 
if (key == ENTER || key == SPACE) 
break; 
} 
outMenu(MENU_PAUSE); 
return 0; 
case MENU_SUCCESS: 
setfillstyle(SOLID_FILL,0); 
bar(220, 160,420, 320); 
dBorder(220, 160, 420, 320, LIGHTBLUE); 
logo(6); 
for(;;){ 
if (bioskey(1)) 
key=bioskey(0); 
else 
key=0; 
playSound(0, muDelta); 
if (key == ENTER || key == SPACE) 
break; 
} 

outMenu(MENU_SUCCESS); 
return 0; 
} 
} 

void updateMenu(char *str[], int num, int crnt, int x, int y){ 
int i; 

settextstyle(0, 0, 0); 
for(i = 1; i < num; i++){ 
if (i == crnt){ 
setcolor(RED); 
outtextxy(x - 12, y + 20 * i, "\4"); 
setcolor(BLUE); 
outtextxy(x, y + 20 * i, str[i]); 
} 
else{ 
setcolor(BLACK); 
outtextxy(x - 12, y + 20 * i, "\4"); 
setcolor(GREEN); 
outtextxy(x, y + 20 * i, str[i]); 
} 
}
} 

void outMenu(int mnIndex){ 
switch(mnIndex){ 
case MENU_MAIN: 
cleardevice(); 
break; 
case MENU_OPTIONS: 
setfillstyle(SOLID_FILL,0); 
bar(220, 80, 420, 300); 
break; 
  case MENU_ABOUT: 
  setfillstyle(SOLID_FILL,0); 
bar(128, 84, 512, 344); 
break; 
case MENU_SIZE_SELECT: 
setfillstyle(SOLID_FILL,0); 
bar(320, 120, 400, 220); 
break; 
case MENU_LEVEL: 
setfillstyle(SOLID_FILL,0); 
bar(270, 120, 400, 220); 
break; 
  case MENU_GAMING: 
  setfillstyle(SOLID_FILL,0); 
bar(190, 140, 450, 320); 
break; 
  case MENU_PAUSE: 
  case MENU_SUCCESS: 
  setfillstyle(SOLID_FILL,0); 
bar(220, 160,420, 320); 
} 
nosound(); 
}
void dBorder(int x1, int y1, int x2, int y2, int color){ 
setcolor(color); 
  line(x1, y1, x2, y1); 
  line(x2, y1, x2, y2); 
  line(x2, y2, x1, y2); 
  line(x1, y2, x1, y1); 
 
  line(x1+10, y1, x1, y1+10); 
  line(x2-10, y1, x2, y1+10); 
  line(x1, y2-10, x1+10, y2); 
  line(x2-10, y2, x2, y2-10); 
 
  line(x1+15, y1+5, x2-15, y1+5); 
  line(x2-15, y1+5, x2-5, y1+15); 
  line(x2-5, y1+15, x2-5, y2-15); 
  line(x2-5, y2-15, x2-15, y2-5); 
  line(x2-15, y2-5, x1+15, y2-5); 
  line(x1+15, y2-5, x1+5, y2-15); 
  line(x1+5, y2-15, x1+5, y1+15); 
  line(x1+5, y1+15, x1+15, y1+5); 
}/*写在最后: 
 上学期,看了很多迷宫游戏代码,都存在着迷宫是规定的的缺点 
 于是,假期发很,写了这样一个游戏...由于考滤到TC2编译时的内存模式 
 所以,作了很大的改动(使结构体不再那么结构)...其中的算法可能也不是很好, 
 不过总算圆了心愿... 
 希望你喜欢。*/

再声明一下,第9, 10, 11贴为废贴,(重复了) 
总共有五个文件,crtMaze.c, logo.c, menu.c, mazemain.c, music.c 
编译时打开mainmain.c...(用TC 2)

视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058