掃雷程式------展開功能與第一步免死功能的實現
阿新 • • 發佈:2018-11-02
完整工程檔案:
https://github.com/Yubao-wss/Game/tree/master/Demine/Demine
如下程式碼為排雷函式:
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int k = 0; int l = 0; int win = 0; while (win < row*col - COUNT) { printf("請輸入要排查的座標:"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (win == 0) //判斷是否為第一步 { if (mine[x][y] == '1') { mine[x][y] = '0'; while (1) { k = rand() % row + 1; l = rand() % col + 1; if (mine[k][l] == '0') { mine[k][l] = '1';//移動雷 break; } } } win++; /*DisplayBoard(mine, ROW, COL);*/ } if (mine[x][y] == '1') { printf("你被炸死了!\n"); DisplayBoard(mine, row, col); break; } else { int count = GetMineCount(mine, x, y); show[x][y] = count + '0'; if (count == 0) { OpenBoard(mine, show, x, y); //呼叫展開函式 } DisplayBoard(show, row, col); win = 0;//初始化win計數 for (x = 1; x <= row; x++) { for (y = 1; y <= col; y++) { if (show[x][y] != '*') win++; //win此時等於現在玩家棋盤上不是‘*’的座標的個數 } } } } else { printf("座標非法,請重新輸入!\n"); } } if (win == row*col - COUNT) //成功的條件 { printf("排雷成功!\n"); DisplayBoard(mine, row, col); } }
展開函式:
void OpenBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y) { show[x][y] = ' '; if (mine[x - 1][y] == '0'&&x - 1 > 0 && y > 0 && show[x - 1][y] == '*') { x = x - 1; show[x][y] = GetMineCount(mine, x, y) + '0'; if (GetMineCount(mine, x, y) == 0) { OpenBoard(mine, show, x, y); } x = x + 1; } if (mine[x][y + 1] == '0'&&x > 0 && y + 1 > 0 && show[x][y + 1] == '*') { y = y + 1; show[x][y] = GetMineCount(mine, x, y) + '0'; if (GetMineCount(mine, x, y) == 0) { OpenBoard(mine, show, x, y); } y = y - 1; } if (mine[x][y - 1] == '0'&&x > 0 && y - 1 > 0 && show[x][y - 1] == '*') { y = y - 1; show[x][y] = GetMineCount(mine, x, y) + '0'; if (GetMineCount(mine, x, y) == 0) { OpenBoard(mine, show, x, y); } y = y + 1; } if (mine[x + 1][y] == '0'&&x + 1 > 0 && y > 0 && show[x + 1][y] == '*') { x = x + 1; show[x][y] = GetMineCount(mine, x, y) + '0'; if (GetMineCount(mine, x, y) == 0) { OpenBoard(mine, show, x, y); } x = x - 1; } }
還有很多需要優化的地方!
執行情況