C实现扫雷
掃雷 收獲很大
尤其是打印數據區域和隨機數
根據雷的分布填充不為雷的區域
邊上區域遍歷時候 考慮越界
第一版本
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<graphics.h> #define ROW 10//行 #define COL 10//列 #define NUM 10//雷的個數 ? int map[ROW+2][COL+2];//需要輔助區域,用來計算9宮格中雷的數量 void gameinit(){//隨機數的種子srand((unsigned int)time(NULL)); ?for (int ?i = 0; i < ROW; i++){for ( int j = 0; j < COL; j++){/* code */map[i][j]=0;}}//布雷 -1表示雷 NUM表示雷數量int n=0;while(n<NUM){int r=rand()% ROW;int c=rand()% COL;if (map[r][c]==0)//如果前一個位置不是雷,那么使他為雷。{map[r][c]=-1;n++;}}//while //根據雷的分布,填充不為雷的區域的數據for (int ?i = 1; i <=ROW+1; i++){for (int ?j = 1; j <COL+1; j++){if (map[i][j]!=-1){for (int ?m = i-1; m <=i+1; m++){for (int ?n = j-1; n<=j+1; n++){if (map[m][n]==-1){map[i][j]++;n++;/* code */}} ?}}}} } ? void gamedraw(){//打印游戲區,而不是輔助區域for (int ?i = 1; i <= ROW; i++){for ( int j = 1; j <=COL; j++){/* code */printf("%3d",map[i][j]);}printf("\n");/* code */} } int main(){gameinit();gamedraw();return 0; } ??
vscode和dev c++搞easyx環境比較麻煩 也是先放棄了
但是vs里面打代碼沒有提示,提示不舒服
第二版(圖形化ok,簡單加密ok)
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<graphics.h> //圖片寬度 #define SIZE 50 #define ROW 10//行 #define COL 10//列 #define NUM 10//雷的個數 IMAGE img[12];//12張圖片 int map[ROW + 2][COL + 2];//需要輔助區域,用來計算9宮格中雷的數量 ? ? ? void gameinit() {//隨機數的種子srand((unsigned int)time(NULL)); ?for (int i = 0; i < ROW+2; i++){for (int j = 0; j < COL+2; j++){/* code */map[i][j] = 0;}}//布雷 -1表示雷 NUM表示雷數量int n = 0;while (n < NUM){int r = rand() % ROW;int c = rand() % COL;if (map[r][c] == 0)//如果前一個位置不是雷,那么使他為雷。{map[r][c] = -1;n++;}}//while //根據雷的分布,填充不為雷的區域的數據for (int i = 1; i <= ROW + 1; i++){for (int j = 1; j < COL + 1; j++){if (map[i][j] != -1){for (int m = i - 1; m <= i + 1; m++){for (int n = j - 1; n <= j + 1; n++){if (map[m][n] == -1){map[i][j]++;n++;/* code */}} ?}}}}//先進行加密for (int i = 1;i < ROW + 1;i++) {for (int j = 1;j < COL + 1;j++) {map[i][j] += 20;}} ? ? } void Playgame() {//定義一個鼠標消息MOUSEMSG msg = { 0 };while (1) {msg = GetMouseMsg();} } void gamedraw() {//打印游戲區,而不是輔助區域for (int i = 1; i <= ROW; i++){for (int j = 1; j <= COL; j++){/* code */printf("%3d", map[i][j]);if(map[i][j] == -1){putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[9]);//雷}else if (map[i][j] >= 0 && map[i][j] <= 8) {putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[map[i][j]]);//數字}else if (map[i][j] >= 19 && map[i][j] <= 28) {putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[10]);//空白圖片}else if (map[i][j] >30) {putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[11]);//標記}}printf("\n");/* code */} } ? int main() {initgraph(SIZE * ROW, SIZE* COL, SHOWCONSOLE);loadimage(&img[0], L"0.jpg", SIZE, SIZE);loadimage(&img[1], L"1.jpg", SIZE, SIZE);loadimage(&img[2], L"2.jpg", SIZE, SIZE);loadimage(&img[3], L"3.jpg", SIZE, SIZE);loadimage(&img[4], L"4.jpg", SIZE, SIZE);loadimage(&img[5], L"5.jpg", SIZE, SIZE);loadimage(&img[6], L"6.jpg", SIZE, SIZE);loadimage(&img[7], L"7.jpg", SIZE, SIZE);loadimage(&img[8], L"8.jpg", SIZE, SIZE);loadimage(&img[9], L"9.jpg", SIZE, SIZE);//雷loadimage(&img[10], L"10.jpg", SIZE, SIZE);//空白loadimage(&img[11], L"11.jpg", SIZE, SIZE);//標記//之前取值范圍為-1到8,加密(加20),得到19到28 為空白的對應 ?gameinit();gamedraw();while (1);?return 0; ? ? } ?第三版(完成左右鍵相應功能)
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<graphics.h> //圖片寬度 #define SIZE 50 #define ROW 10//行 #define COL 10//列 #define NUM 10//雷的個數 IMAGE img[12];//12張圖片 int map[ROW + 2][COL + 2];//需要輔助區域,用來計算9宮格中雷的數量 ? ? ? void gameinit() {//隨機數的種子srand((unsigned int)time(NULL)); ?for (int i = 0; i < ROW+2; i++){for (int j = 0; j < COL+2; j++){/* code */map[i][j] = 0;}}//布雷 -1表示雷 NUM表示雷數量int n = 0;while (n < NUM){int r = rand() % ROW;int c = rand() % COL;if (map[r][c] == 0)//如果前一個位置不是雷,那么使他為雷。{map[r][c] = -1;n++;}}//while //根據雷的分布,填充不為雷的區域的數據for (int i = 1; i <= ROW + 1; i++){for (int j = 1; j < COL + 1; j++){if (map[i][j] != -1){for (int m = i - 1; m <= i + 1; m++){for (int n = j - 1; n <= j + 1; n++){if (map[m][n] == -1){map[i][j]++;n++;/* code */}} ?}}}}//先進行加密for (int i = 1;i < ROW + 1;i++) {for (int j = 1;j < COL + 1;j++) {map[i][j] += 20;}} ? ? } int ?Playgame() {//定義一個鼠標消息MOUSEMSG msg = { 0 };int r, c;while (1) {msg = GetMouseMsg();switch (msg.uMsg){case WM_LBUTTONDOWN://鼠標左鍵 打開掃雷的空白圖片r = msg.x / SIZE + 1;c = msg.y / SIZE + 1;if (map[r][c] >= 19 && map[r][c] <= 28) {map[r][c]-=20;}return map[r][c];break;case WM_RBUTTONDOWN://鼠標右鍵 :標記空白圖片 取消標記圖片r = msg.x / SIZE + 1;c = msg.y / SIZE + 1;if (map[r][c] >= 19 && map[r][c] <= 28) {map[r][c] += 50;}else ?if (map[r][c]>30) {//取消標記map[r][c] -= 50;}return map[r][c];break;}} } void gamedraw() {//打印游戲區,而不是輔助區域for (int i = 1; i <= ROW; i++){for (int j = 1; j <= COL; j++){/* code */printf("%3d", map[i][j]);if(map[i][j] == -1){putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[9]);//雷}else if (map[i][j] >= 0 && map[i][j] <= 8) {putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[map[i][j]]);//數字}else if (map[i][j] >= 19 && map[i][j] <= 28) {putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[10]);//空白圖片}else if (map[i][j] >30) {putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[11]);//標記}}printf("\n");/* code */} } ? int main() {initgraph(SIZE * ROW, SIZE* COL, SHOWCONSOLE);loadimage(&img[0], L"0.jpg", SIZE, SIZE);loadimage(&img[1], L"1.jpg", SIZE, SIZE);loadimage(&img[2], L"2.jpg", SIZE, SIZE);loadimage(&img[3], L"3.jpg", SIZE, SIZE);loadimage(&img[4], L"4.jpg", SIZE, SIZE);loadimage(&img[5], L"5.jpg", SIZE, SIZE);loadimage(&img[6], L"6.jpg", SIZE, SIZE);loadimage(&img[7], L"7.jpg", SIZE, SIZE);loadimage(&img[8], L"8.jpg", SIZE, SIZE);loadimage(&img[9], L"9.jpg", SIZE, SIZE);//雷loadimage(&img[10], L"10.jpg", SIZE, SIZE);//空白loadimage(&img[11], L"11.jpg", SIZE, SIZE);//標記//之前取值范圍為-1到8,加密(加20),得到19到28 為空白的對應gameinit();while (1) {gamedraw();Playgame();}return 0; } ?第四版 (判斷輸贏)
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<graphics.h> //圖片寬度 #define SIZE 50 #define ROW 10//行 #define COL 10//列 #define NUM 10//雷的個數 int count;//點開的數量 IMAGE img[12];//12張圖片 int map[ROW + 2][COL + 2];//需要輔助區域,用來計算9宮格中雷的數量 ? ? ? void gameinit() {//隨機數的種子srand((unsigned int)time(NULL)); ?for (int i = 0; i < ROW+2; i++){for (int j = 0; j < COL+2; j++){/* code */map[i][j] = 0;}}//布雷 -1表示雷 NUM表示雷數量int n = 0;while (n < NUM){int r = rand() % ROW;int c = rand() % COL;if (map[r][c] == 0)//如果前一個位置不是雷,那么使他為雷。{map[r][c] = -1;n++;}}//while //根據雷的分布,填充不為雷的區域的數據for (int i = 1; i <= ROW + 1; i++){for (int j = 1; j < COL + 1; j++){if (map[i][j] != -1){for (int m = i - 1; m <= i + 1; m++){for (int n = j - 1; n <= j + 1; n++){if (map[m][n] == -1){map[i][j]++;n++;/* code */}} ?}}}}//先進行加密for (int i = 1;i < ROW + 1;i++) {for (int j = 1;j < COL + 1;j++) {map[i][j] += 20;}} ? ? } int ?Playgame() {//定義一個鼠標消息MOUSEMSG msg = { 0 };int r, c;while (1) {msg = GetMouseMsg();switch (msg.uMsg){case WM_LBUTTONDOWN://鼠標左鍵 打開掃雷的空白圖片r = msg.x / SIZE + 1;c = msg.y / SIZE + 1;if (map[r][c] >= 19 && map[r][c] <= 28) {map[r][c]-=20;count++;} ?return map[r][c];break;case WM_RBUTTONDOWN://鼠標右鍵 :標記空白圖片 取消標記圖片r = msg.x / SIZE + 1;c = msg.y / SIZE + 1;if (map[r][c] >= 19 && map[r][c] <= 28) {map[r][c] += 50;}else ?if (map[r][c]>30) {//取消標記map[r][c] -= 50;}return map[r][c];break;}} } void gamedraw() {//打印游戲區,而不是輔助區域for (int i = 1; i <= ROW; i++){for (int j = 1; j <= COL; j++){/* code */printf("%3d", map[i][j]);if(map[i][j] == -1){putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[9]);//雷}else if (map[i][j] >= 0 && map[i][j] <= 8) {putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[map[i][j]]);//數字}else if (map[i][j] >= 19 && map[i][j] <= 28) {putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[10]);//空白圖片}else if (map[i][j] >30) {putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[11]);//標記}}printf("\n");/* code */} } ? int main() {HWND hwnd=initgraph(SIZE * ROW, SIZE* COL, SHOWCONSOLE);loadimage(&img[0], L"0.jpg", SIZE, SIZE);loadimage(&img[1], L"1.jpg", SIZE, SIZE);loadimage(&img[2], L"2.jpg", SIZE, SIZE);loadimage(&img[3], L"3.jpg", SIZE, SIZE);loadimage(&img[4], L"4.jpg", SIZE, SIZE);loadimage(&img[5], L"5.jpg", SIZE, SIZE);loadimage(&img[6], L"6.jpg", SIZE, SIZE);loadimage(&img[7], L"7.jpg", SIZE, SIZE);loadimage(&img[8], L"8.jpg", SIZE, SIZE);loadimage(&img[9], L"9.jpg", SIZE, SIZE);//雷loadimage(&img[10], L"10.jpg", SIZE, SIZE);//空白loadimage(&img[11], L"11.jpg", SIZE, SIZE);//標記//之前取值范圍為-1到8,加密(加20),得到19到28 為空白的對應gameinit(); ? ?while (1) {gamedraw();//輸的時候if (Playgame() == -1) {gamedraw();MessageBox(hwnd, L"you are lost", L"", MB_OK); ?break;}//贏if (ROW*COL-NUM==count) {gamedraw();MessageBox(hwnd, L"you are win!", L"", MB_OK);break;} ?}?return 0; ? ? } ??
第五版(遞歸成片打開 )
?
bug已找到,昨晚找了半小時沒找出來,今天找了5min
else要和第一個最內層的if匹配
問題解決,睡覺。?
總結
- 上一篇: scrapy基础 之 静态网页实例
- 下一篇: 扫雷开发C语言