|
1楼 * 描述 : 超级迷宫 (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); } } |
|
|
|
|
2楼 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); |
|
|
|
|
3楼 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); } } |
|
|
|
|
4楼 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 结束*/ |
|
|
|
|
5楼 #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{ |
|
|
|
|
6楼 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; |
|
|
|
|
7楼 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; |
|
|
|
|
8楼 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 结束*/ |
|
|
|
|
13楼 {{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 结束*/ |
|
|
|
|
14楼 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; |
|
|
|
|
15楼 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 结束*/ |
|
|
|
|
16楼 #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(); |
|
|
|
|
17楼 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; |
|
|
|
|
18楼 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; |
|
|
|
|
19楼 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); } |
|
|
|
|
20楼 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); } |
|
|
|
|
21楼 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(); } |
|
|
|
|
22楼 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); } |
|
|
|
|
23楼 上学期,看了很多迷宫游戏代码,都存在着迷宫是规定的的缺点 于是,假期发很,写了这样一个游戏...由于考滤到TC2编译时的内存模式 所以,作了很大的改动(使结构体不再那么结构)...其中的算法可能也不是很好, 不过总算圆了心愿... 希望你喜欢。*/ |
|
|
|
|
25楼 总共有五个文件,crtMaze.c, logo.c, menu.c, mazemain.c, music.c 编译时打开mainmain.c...(用TC 2) |
|
|
|
|
27楼 你把源文件全部复制粘贴,然后发送,让他自己分栏,就不会出现这个问题了。一个文件发一次。 另外,编译环境也放在第一贴的开头比较好。等你重发,精品应该完美点,对吧?呵呵 |
|
|
|
|
30楼 /* 把此文件保存为mazeMain.c * 描述 : 超级迷宫 (Super Maze) * 环境:tc2+win2000 * 作者 : 文曦畅 Wen Xichang 2004-11-10 */ |
|
|
|
