日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

扫雷游戏的编写

發布時間:2024/1/1 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 扫雷游戏的编写 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們都玩過一款名為掃雷的游戲,而利用我們所學的C語言也可以模擬實現掃雷的功能。通過對掃雷的了解,明白其原理。首先在一塊區域上,選取一個坐標點,如果該坐標點是雷點,游戲結束;如果是安全區,而且周圍都為安全區,則會進行擴展,雷區的附近會有坐標顯示雷存在的顆數。
根據C語言所學,大致思路是:系統布雷,玩家選取坐標,是安全區,游戲繼續,擴展或者顯示周圍雷數;如果雷區,則游戲結束。用隨機數的生成,在一個10X10的二維數組布雷,雷數為10顆,用遞歸的方法對安全區進行擴展和對周圍雷數的探測。
我們將程序分為3個模塊,首先為頭文件:函數的聲明,宏的定義,頭文件的引入;然后是測試文件:主函數部分;最后是游戲主要程序的編寫。

1.頭文件(game.h)

#ifndef __GAME_H__#define __GAME_H__#include <stdio.h> #include <stdlib.h> #include <time.h> #include<string.h>extern void meun(); extern void Map(char a[][10]); extern char Discorn(char a[][10],int x,int y); extern void Extend(char a[][10], char b[][10],int x,int y); extern void Judgement(char a[][10]); extern void Set(); extern void game();#endif //__GAME_H__

2.測試程序(test.c)

#include"game.h"int main() {srand((unsigned)time(NULL)); //隨機數種子產生int a;do{meun();scanf_s("%d", &a);switch (a){case 1:game();break;case 0:break;default:printf("輸入錯誤\n11");system("cls");break;}} while (a);return 0; }

3.主要游戲程序部分(game.h)

//游戲程序 void game() {printf("--------------------------------------------------------------------\n");Set(); char mine[10][10]; memset(mine, ' ', sizeof(mine)); //對雷區進行初始化int i = 0;while (i < 10){int x = rand() % 10 ; //隨機數的接受(產生0-9的隨機數)int y = rand() % 10 ;if (mine[y][x] == ' ') //布置地雷(不能重復) {mine[y][x] = 'X';i++;}}//Map(mine); //雷區的顯示Judgement(mine); //輸贏的判斷 }//游戲界面 void meun() {printf("*************************************************************\n");printf("************ Welcome to Minesweeper **************\n");printf("*************************************************************\n");printf("************ - 1. Play - **************\n");printf("************ - 0. Exit - **************\n");printf("*************************************************************\n"); }//游戲地圖的初始化 void Set() {char set[10][10];memset(set, '*', sizeof(set));Map(set); }//打印地圖 void Map(char m[10][10]) {int i, j;printf("\n\n");for (j = 1; j < 11; j++){if (j == 1)printf(" ");printf("%3d", j);}printf("\n");for (i = 0; i < 10; i++){printf("%2d", i + 1);for (j = 0; j < 10; j++){printf("%3c", m[i][j]);}printf("\n");}printf("\n");printf("\n--------------------------------------------------------------------\n"); }//對安全區的擴展 void Extend(char a[10][10], char set[10][10], int x, int y) {if ((a[y - 1][x - 1] != 'X') && (a[y - 1][x] != 'X') &&(a[y - 1][x + 1] != 'X') && (a[y][x + 1] != 'X') &&(a[y][x - 1] != 'X') && (a[y + 1][x] != 'X') &&(a[y + 1][x + 1] != 'X') && (a[y + 1][x - 1] != 'X')){if ((x - 1 > -1) && ((y - 1) > -1) && (a[y - 1][x - 1] ==' ') && (set[y - 1][x - 1] != ' ')){set[y - 1][x - 1] = ' ';char ret1 = Discorn(a, x - 1, y - 1);if (ret1 == '0')ret1 = ' ';elseset[y - 1][x - 1] = ret1;Extend(a, set, x - 1, y - 1);}if (((x - 1) > -1) && (y < 10) && (y>-1) && (a[y][x - 1] == ' ') && (set[y][x - 1] != ' ')){set[y][x - 1] = ' ';char ret2 = Discorn(a, x - 1, y);if (ret2 == '0')ret2 = ' ';elseset[y][x - 1] = ret2;Extend(a, set, x - 1, y);}if ((x - 1 >-1) && (y + 1< 10) && (a[y + 1][x - 1] == ' ') && (set[y + 1][x - 1] != ' ')){set[y + 1][x - 1] = ' ';char ret3 = Discorn(a, x - 1, y + 1);if (ret3 == '0')ret3 = ' ';elseset[y + 1][x - 1] = ret3;Extend(a, set, x - 1, y + 1);}if ((x>-1) && (x < 10) && (y + 1 < 10) && (a[y + 1][x] == ' ') && (set[y + 1][x] != ' ')){set[y + 1][x] = ' ';char ret4 = Discorn(a, x, y + 1);if (ret4 == '0')ret4 = ' ';elseset[y + 1][x] = ret4;Extend(a, set, x, y + 1);}if ((x>-1) && (x < 10) && (y - 1>-1) && (a[y - 1][x] == ' ') && (set[y - 1][x] != ' ')){set[y - 1][x] = ' ';char ret5 = Discorn(a, x, y - 1);if (ret5 == '0')ret5 = ' ';elseset[y - 1][x] = ret5;Extend(a, set, x, y - 1);}if ((x + 1 < 10) && (y - 1 >-1) && (a[y - 1][x + 1] == ' ') && (set[y - 1][x + 1] != ' ')){set[y - 1][x + 1] = ' ';char ret6 = Discorn(a, x + 1, y - 1);if (ret6 == '0')ret6 = ' ';elseset[y - 1][x + 1] = ret6;Extend(a, set, x + 1, y - 1);}if ((x + 1 < 10) && (y<10) && (y>-1) && (a[y][x + 1] == ' ') && (set[y][x + 1] != ' ')){set[y][x + 1] = ' ';char ret7 = Discorn(a, x + 1, y);if (ret7 == '0')ret7 = ' ';elseset[y][x + 1] = ret7;Extend(a, set, x + 1, y);}if ((x + 1 < 10) && ((y + 1) < 10) && (a[y + 1][x + 1] == ' ') && (set[y + 1][x + 1])){set[y + 1][x + 1] = ' ';char ret8 = Discorn(a, x + 1, y + 1);if (ret8 == '0')ret8 = ' ';elseset[y + 1][x + 1] = ret8;Extend(a, set, x + 1, y + 1);}} }//對周圍雷數進行統計 char Discorn(char a[10][10], int x, int y) {char count = '0';if (((x - 1) > -1) && ((y - 1) > -1) && (a[y - 1][x - 1] == 'X'))count++;if (((x - 1) > -1) && (y < 10) && (y>-1) && (a[y][x - 1] == 'X'))count++;if (((x - 1) > -1) && ((y + 1) < 10) && (a[y + 1][x - 1] == 'X'))count++;if ((x>-1) && (x < 10) && ((y + 1) < 10) && (a[y + 1][x] == 'X'))count++;if ((x>-1) && (x < 10) && ((y - 1)>-1) && (a[y - 1][x] == 'X'))count++;if (((x + 1) < 10) && ((y - 1) >-1) && (a[y - 1][x + 1] == 'X'))count++;if (((x + 1) < 10) && (y<10) && (y>-1) && (a[y][x + 1] == 'X'))count++;if (((x + 1) < 10) && ((y + 1) < 10) && (a[y + 1][x + 1] == 'X'))count++;return count; }//判斷輸贏 void Judgement(char a[10][10]) {int x, y;char set[10][10];memset(set, '*', sizeof(set));while (1){int count = 0;printf("input coordinate:");scanf("%d %d", &x, &y);system("cls"); //對屏幕的刷新if (x > 10 || y > 10 || x < 0 || y < 0){printf("Please again!!!\n");continue;}x = x - 1;y = y - 1;if (a[y][x] == 'X'){Map(a);printf("you were dead!!!\n");break;}else{char ret = Discorn(a, x, y);if (ret == '0')ret = ' ';set[y][x] = ret;Extend(a, set, x, y);Map(set);for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++)if (set[i][j] == '*')count++;}}if (count == 10){printf("You win this game!!!\n");break;}} }

圖片展示


游戲的擴展部分需要用到函數的遞歸,本程序的精華所在,通過遞歸和限制條件的設置,對安全區進行一步步擴展,遞歸的引入很好的結局了這一問題。
程序還可以進行擴展,對游戲雷數的設置,難度的設置等,新的功能及優化等著進一步的完善。

Author:yk

總結

以上是生活随笔為你收集整理的扫雷游戏的编写的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。