[日常練習] 5. 基於掃雷遊戲的C語言實現!
阿新 • • 發佈:2018-11-10
#include "game.h" void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set) { int i = 0; int j = 0; for(i=0; i<rows; i++) { for(j=0; j<cols; j++) { arr[i][j] = set; } } } void DisplayBoard(char arr[ROWS][COLS], int row, int col) { int i = 0; int j = 0; for(i=0; i<=row; i++) { printf("%d ", i); } printf("\n"); //忽略掉了 for(i=1; i<=row; i++) { printf("%d ", i); for(j=1; j<=col; j++) { printf("%c ", arr[i][j]); } printf("\n"); } printf("\n"); } void SetMine(char arr[ROWS][COLS], int row, int col) //選擇遊戲難度,簡單 10*10 複雜20*20 { int count = EASY_COUNT; while(count) { int x = rand()%9+1; //rand函式使用規則 // int y = rand()%9+1; if(arr[x][y] == '0'); { arr[x][y] = '1'; count--; } } } int GetMineCount(char mine[ROWS][COLS], int x, int y) { return mine[x-1][y]+mine[x-1][y-1]+mine[x][y-1]+mine[x+1][y-1] +mine[x+1][y]+mine[x+1][y+1]+mine[x][y+1]+mine[x-1][y+1]-8*'0'; } void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int a = 0; int win = 0; int stap = 0; while(win<row*col-EASY_COUNT) { printf("請輸入座標:>"); scanf("%d %d", &x, &y); stap++; if(stap==1 && mine[x][y] == '1') //保證第一下不被炸死 { mine[x][y] = '0'; //for(a=1; a<=row-x; a++) //漏洞,最後一行怎麼辦!!! //{ // if(mine[x+a][y] == '0') // { // mine[x+a][y] = '1'; // } // if(mine[x+a][y] = '1') // { // break; // } //} } if(x>=1 && x<=row && y>=1 && y<=col) { if(mine[x][y] == '1') { printf("你被炸死了!\n"); DisplayBoard(mine, ROW, COL); break; } else { int count = GetMineCount(mine, x, y); win++; show[x][y] = count+'0'; DisplayBoard(show, ROW, COL); } } else { printf("輸入錯誤!\n"); } } if(win == row*col-EASY_COUNT) { printf("恭喜,排雷成功!\n"); } }
//game.h #ifndef __GAME_H__ #define __GAME_H__ #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 10 void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set); void DisplayBoard(char arr[ROWS][COLS], int row, int col); void SetMine(char arr[ROWS][COLS], int row, int col); void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col); int GetMineCount(char mine[ROWS][COLS], int x, int y); #endif //__GAME_H__
//test.c #include "game.h" void menu() { printf("************************************\n"); printf("********《《 1. play 》》*********\n"); printf("********《《 0. exit 》》*********\n"); printf("************************************\n"); } void game() { //佈置雷陣 char mine[ROWS][COLS] = {0}; // '0' char show[ROWS][COLS] = {0}; // '*' InitBoard(mine, ROWS, COLS, '0'); InitBoard(show, ROWS, COLS, '*'); SetMine(mine, ROW, COL); //佈置雷 DisplayBoard(mine, ROW, COL); DisplayBoard(show, ROW, COL); FindMine(mine, show, ROW, COL); //掃雷 } void test() { int input = 0; srand((unsigned int)time(NULL)); //注意! do { menu(); printf("請選擇則:>"); scanf("%d", &input); switch(input) { case 1: game(); break; case 0: printf("退出遊戲!\n"); default: printf("選擇錯誤,請重新輸入:>"); } }while (input); } int main() { test(); //測試遊戲 return 0; }
有幾個問題:
掃雷要成片出現!
第一下不能被直接炸死!