生活随笔
收集整理的這篇文章主要介紹了
C语言版扫雷
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
用C語言實現掃雷,首先應該有基本的思路,創建兩個相同大小的數組,一個用于布雷(初始化為全0,布雷時將雷置為1),另一個給用戶展示(初始化為星號,用戶輸入坐標后統計周圍雷的分布并打印雷的個數)。由于需要統計每個坐標周圍類的個數,所以將數組創建大一圈,以方便統計。若輸了,打印出雷陣告訴玩家雷的分布。
具體實現:
game.h文件
#ifndef __GAME_H__
#define __GAME_H__#define ROWS 10
#define COLS 10#define MINE_COUNT 30void display(char arr[ROWS + 2][COLS + 2] , int rows, int cols); //打印雷陣數組
void set_mine(char mine[ROWS + 2][COLS + 2], int rows, int cols); //布雷
void get_mine_count(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2], int x, int y); //統計每格雷的個數
void get_around_mine_count(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2], int x, int y); //統計周圍雷的個數
void first_remove(char mine[ROWS + 2][COLS + 2], int x, int y); //第一個是雷移走#endif //__GAME_H__game.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include "game.h"void display(char arr[ROWS + 2][COLS + 2], int rows, int cols) //打印雷陣數組
{int i = 0;int j = 0;printf(" ");for (i = 1; i <= rows;i++) //打印數組行序號{printf("%d ",i);}printf("\n");for (i = 1; i <= rows;i++){ printf("%-3d", i); //打印數組列序號for (j = 1; j <= cols; j++){printf("%c ",arr[i][j]);}printf("\n");}
}
void set_mine(char mine[ROWS + 2][COLS + 2], int rows, int cols) //布雷
{srand((unsigned int)time(NULL));int count = MINE_COUNT;while (count){int x = rand() % 10 + 1;int y = rand() % 10 + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--; }}
}void get_mine_count(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2], int x, int y) //統計每格雷的個數
{int count = 0; //統計雷的個數count=((mine[x - 1][y - 1] - '0') +(mine[x - 1][y] - '0')+ (mine[x - 1][y + 1] - '0')+ (mine[x][y + 1] - '0') +(mine[x + 1][y + 1] - '0') +(mine[x + 1][y] - '0') +(mine[x + 1][y - 1] - '0') +(mine[x][y - 1] - '0'));show[x][y] = count + '0'; //數字+字符變成字符存起來
} void get_around_mine_count(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2], int x, int y) //統計周圍雷的個數
{get_mine_count(mine, show, x, y);if (mine[x-1][y-1] == '0')get_mine_count(mine, show, x-1, y-1);if (mine[x-1][y] == '0')get_mine_count(mine, show, x-1, y);if (mine[x-1][y+1] == '0')get_mine_count(mine, show, x-1, y+1);if (mine[x][y+1] == '0')get_mine_count(mine, show, x, y+1);if (mine[x+1][y+1] == '0')get_mine_count(mine, show, x+1, y+1);if (mine[x+1][y] == '0')get_mine_count(mine, show, x+1, y);if (mine[x+1][y-1] == '0')get_mine_count(mine, show, x+1, y-1);if (mine[x][y-1] == '0')get_mine_count(mine, show, x, y-1);}void first_remove(char mine[ROWS + 2][COLS + 2], int x, int y) //第一個是雷移走
{if (mine[x][y] == '1'){for (int i = 1; i <= ROWS; i++){for (int j = 1; j <= COLS; j++){if (mine[i][j] == '0'){mine[i][j] = '1';mine[x][y] = '0';break;}}if (mine[x][y] == '0'){break;}}}
}
test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include "game.h"void main_menu() //主界面
{printf("-------------------\n");printf("| 1.play |\n");printf("| 0.exit |\n");printf("-------------------\n");
}void game()
{int win = 0; //點擊的次數int count = 0; //統計雷的個數int first = 1;char mine[ROWS + 2][COLS + 2] = { 0 }; //埋雷的數組char show[ROWS + 2][COLS + 2] = { 0 }; //展示的數組memset(mine, '0', sizeof(char)* (ROWS+2) *(COLS + 2)); //數組初始化memset(show, '*', sizeof(char)* (ROWS + 2) *(COLS + 2));display(show, ROWS, COLS); //打印展示的雷陣set_mine(mine, ROWS, COLS); //布雷//display(mine, ROWS, COLS); //調試的時候可以取消注釋打印出雷的分布 while (win<ROWS*COLS - MINE_COUNT){int x = 0, y = 0;printf("請輸入坐標:\n");scanf("%d%d",&x,&y);if (first == 1){first_remove(mine, x, y);first++;}if (mine[x][y] == '1'){printf("雷炸了!YOU LOSE !\n");display(mine, ROWS, COLS);break;}else{win++;get_around_mine_count(mine,show, x, y); //統計周圍雷的個數//get_mine_count(mine,show, x, y);// show[x][y] = count + '0'; //數字+字符變成字符存起來display(show, ROWS, COLS); }}if (win >= ROWS*COLS - MINE_COUNT){printf("YOU WIN !!!\n");}
}enum Option //枚舉
{EXIT,PLAY
};
int main()
{int x = 0;do{main_menu();printf("輸入1繼續、0退出:\n");scanf("%d", &x);switch (x){case EXIT:break;case PLAY:game();break;default:printf("選擇錯誤,請重輸入:\n");break;}} while (x);return 0;
}
運行結果:
總結
以上是生活随笔為你收集整理的C语言版扫雷的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。