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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

使用C语言写一个扫雷小游戏

發(fā)布時(shí)間:2023/12/19 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用C语言写一个扫雷小游戏 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

相信掃雷游戲小伙伴們肯定都玩過(guò)吧,學(xué)習(xí)了C語(yǔ)言中的數(shù)組、函數(shù)等基礎(chǔ)內(nèi)容之后就可以自己寫(xiě)一個(gè)簡(jiǎn)易的掃雷小游戲了,今天就我寫(xiě)掃雷小游戲的過(guò)程及思路寫(xiě)一篇博客,希望大家看完我的博客能有所收獲。

軟件及環(huán)境

VS2013
(說(shuō)明:以下所提到的mine為置雷的棋盤(pán),show為顯示排雷信息的棋盤(pán))

掃雷游戲基本過(guò)程

掃雷游戲:輸入坐標(biāo)如果該位置不是雷,則顯示數(shù)字代表該坐標(biāo)周?chē)袔讉€(gè)雷;如果該位置是雷則游戲結(jié)束。
優(yōu)化:如果輸入坐標(biāo)該位置不是雷,且該位置周?chē)鷽](méi)有雷,則可以展開(kāi)一片,直到周?chē)欣椎牡胤健?/p>

  • 首先我們需要兩個(gè)棋盤(pán)來(lái)供我們使用,一個(gè)棋盤(pán)用于置雷,另外一個(gè)用于打印提示用戶(hù)排雷,棋盤(pán)使用二維字符數(shù)組來(lái)進(jìn)行創(chuàng)建。(字符數(shù)組可以節(jié)省內(nèi)存)
  • 初始化兩個(gè)棋盤(pán),用于置雷的棋盤(pán)mine初始化為全‘0’,用于打印提示用戶(hù)排雷的棋盤(pán)show初始化為全‘*’。(可以根據(jù)自己需要改變)
  • 置雷:雷的放置是隨機(jī)的,這里我們使用到了隨機(jī)函數(shù)進(jìn)行隨機(jī)置雷。
  • 排雷:用戶(hù)輸入想要排查的坐標(biāo),如果該位置是雷則游戲結(jié)束;如果該位置不是雷則顯示周?chē)嬖诘睦椎膫€(gè)數(shù)。優(yōu)化后的排雷函數(shù)可以展開(kāi)一片。
    大致的游戲過(guò)程就是這樣。
  • 優(yōu)化排雷思路

    優(yōu)化排雷應(yīng)該注意的條件:

  • 該坐標(biāo)不是雷且周?chē)鷽](méi)有雷—滿(mǎn)足展開(kāi)一片
  • 該坐標(biāo)不是雷但是周?chē)欣住蛴≈車(chē)欣椎膫€(gè)數(shù)(遞歸的截至條件)
    在代碼實(shí)現(xiàn)的過(guò)程中需要注意幾個(gè)問(wèn)題:
    ①遞歸的截止條件②注意數(shù)組的邊界,不要越界③這里遞歸訪(fǎng)問(wèn)很容易重復(fù)訪(fǎng)問(wèn)某一個(gè)坐標(biāo),所以需要進(jìn)行判斷
    我的實(shí)現(xiàn)思路:
    玩家輸入坐標(biāo),如果在mine棋盤(pán)中為’0‘(說(shuō)明該位置沒(méi)有雷),在show棋盤(pán)中為’*’(說(shuō)明該位置未被訪(fǎng)問(wèn)過(guò)),1<=x<=col,1<=y<=row(沒(méi)有越界),進(jìn)行判斷:如果周?chē)鷽](méi)有雷就將該坐標(biāo)置為空格,通過(guò)遞歸的思路依次判斷該坐標(biāo)周?chē)?個(gè)坐標(biāo)即可。如果周?chē)欣拙陀?jì)算周?chē)椎臄?shù)量轉(zhuǎn)化為字符形式存入show棋盤(pán)的相應(yīng)坐標(biāo),返回上一層遞歸。
    代碼如下:
  • void SetSpace(char board1[ROWS][COLS],char board2[ROWS][COLS], int x, int y) //board1為放置雷的棋盤(pán),board2為顯示排雷信息的棋盤(pán) {while (board1[x][y] == '0' && board2[x][y] =='*' && x >=1 && x <= ROW && y >= 1 && y <= COL){if (GetMine(board1, x, y) == 0)//周?chē)鷽](méi)有雷{board2[x][y] = ' ';SetSpace(board1, board2, x, y + 1);SetSpace(board1, board2, x - 1, y + 1);SetSpace(board1, board2, x - 1, y);SetSpace(board1, board2, x - 1, y - 1);SetSpace(board1, board2, x, y - 1);SetSpace(board1, board2, x + 1, y - 1);SetSpace(board1, board2, x + 1, y);SetSpace(board1, board2, x + 1, y + 1);}else //周?chē)欣?/span>{board2[x][y] = GetMine(board1, x, y) + '0';break;}} }

    代碼實(shí)現(xiàn)(含優(yōu)化)

    文件及目錄結(jié)構(gòu)

    game.h頭文件

    #include<stdio.h> #include<time.h> #include<stdlib.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define MINE_NUM 10 //放置雷的數(shù)量 #define TIME ROW*COL-MINE_NUM void DisplayBoard(char board[ROWS][COLS], int row, int col);void InitBoard(char board[ROWS][COLS], int row, int col, char s); void SetMine(char board[ROWS][COLS], int row, int col); void FindMine(char board1[ROWS][COLS], char board2[ROWS][COLS], int row, int col); void FindMinePlus(char board1[ROWS][COLS], char board2[ROWS][COLS], int row, int col); //優(yōu)化排雷 void SetSpace(char board1[ROWS][COLS], char board2[ROWS][COLS], int x, int y);

    game.c文件

    #define _CRT_SECURE_NO_WARNINGS 1 #include "game.h"int GetMine(char board1[ROWS][COLS], int x, int y) //統(tǒng)計(jì)坐標(biāo)x,y周?chē)睦椎膫€(gè)數(shù) {return (board1[x-1][y ] + board1[x - 1][y - 1] + board1[x ][y-1] + board1[x + 1][y - 1] + board1[x+1][y ]+ board1[x + 1][y + 1] + board1[x ][y+1] + board1[x - 1][y + 1] - 8 * '0'); } void InitBoard(char board[ROWS][COLS], int row, int col, char s) {int i = 0, j = 0;for ( i = 0; i < row; i++){for ( j = 0; j < col; j++){board[i][j] = s;}} }void DisplayBoard(char board[ROWS][COLS], int row, int col) {int i = 0, 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 ", board[i][j]);}printf("\n");}printf("*******************\n"); } void SetMine(char board[ROWS][COLS], int row, int col) //放置雷 {int mine_count = MINE_NUM;while (mine_count > 0){int x = rand() % col + 1;int y = rand() % row + 1;if (board[x][y] != '1'){board[x][y] = '1';mine_count--;}} } void FindMine(char board1[ROWS][COLS],char board2[ROWS][COLS], int row, int col) {int x = 0, y = 0,time = 0;while (time < TIME){printf("請(qǐng)輸入要排查的坐標(biāo):\n");scanf("%d%d", &x, &y);if (board1[x][y] == '1'){printf("很遺憾,你被炸死了\n");DisplayBoard(board1, row, col);break;}else{if (board2[x][y] == '*'){time++;}board2[x][y] = GetMine(board1,x,y)+'0';DisplayBoard(board2, row, col);}}if (time == TIME){printf("恭喜排雷成功!\n");} } void SetSpace(char board1[ROWS][COLS],char board2[ROWS][COLS], int x, int y) {while (board1[x][y] == '0' && board2[x][y] =='*' && x >=1 && x <= ROW && y >= 1 && y <= COL){if (GetMine(board1, x, y) == 0)//周?chē)鷽](méi)有雷{board2[x][y] = ' ';SetSpace(board1, board2, x, y + 1);SetSpace(board1, board2, x - 1, y + 1);SetSpace(board1, board2, x - 1, y);SetSpace(board1, board2, x - 1, y - 1);SetSpace(board1, board2, x, y - 1);SetSpace(board1, board2, x + 1, y - 1);SetSpace(board1, board2, x + 1, y);SetSpace(board1, board2, x + 1, y + 1);}else //周?chē)欣?/span>{board2[x][y] = GetMine(board1, x, y) + '0';break;}} } int Mine_Num(char board[ROWS][COLS], int row, int col) {int i = 0, j = 0,count = 0;for (i = 1; i <= row; i++){for (j = 1; j <= col; j++){if (board[i][j] == '*')count++;}}return count; } void FindMinePlus(char board1[ROWS][COLS], char board2[ROWS][COLS], int row, int col) {int x = 0, y = 0;while (1){printf("請(qǐng)輸入要排查的坐標(biāo):\n");scanf("%d%d", &x, &y);if (board1[x][y] == '1'){printf("很遺憾,你被炸死了!\n");DisplayBoard(board1, ROW, COL);break;}else{SetSpace(board1, board2, x, y);DisplayBoard(board2, ROW, COL);if (Mine_Num(board2, ROW, COL) == MINE_NUM){printf("恭喜你,排雷成功!\n");break;}}}}

    main.c文件

    #define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void menu() {printf(" (^=^) \n");printf("**************歡迎進(jìn)入掃雷游戲*************\n");printf("請(qǐng)選擇: \n");printf(" 1.掃雷 \n");printf(" 0.退出 \n"); } void game() {char mine[ROWS][COLS];char show[ROWS][COLS];InitBoard(mine,ROWS,COLS,'0');InitBoard(show, ROWS, COLS, '*');DisplayBoard(mine, ROW, COL);DisplayBoard(show, ROW, COL);SetMine(mine,ROW,COL);DisplayBoard(mine, ROW, COL);FindMinePlus(mine, show, ROW, COL);} void playGame() {int choice = 0;do{menu();scanf("%d", &choice);switch (choice){case 1:game();playGame();break;case 0:exit(0);break;default:printf("選擇錯(cuò)誤,請(qǐng)重新選擇正確的選項(xiàng)!\n");break;}} while (choice !=1 && choice!= 0);} int main() {srand((unsigned int)time(NULL));playGame();return 0; }

    效果和截圖

    (為了演示所以直接打印了置雷棋盤(pán))
    簡(jiǎn)易掃雷:
    此過(guò)程需要你把棋盤(pán)上所有不是雷的位置找出來(lái)最后才能獲得游戲勝利,過(guò)程未免太過(guò)漫長(zhǎng),給玩家?guī)?lái)不好的體驗(yàn)。

    優(yōu)化后:
    優(yōu)化后的游戲體驗(yàn)明顯提升啦!

    以上代碼以及思路如有不妥之處望積極提出,代碼我放在我的碼云上啦,需要看的小伙伴戳這里!!https://gitee.com/yuan-xinyi/c-language/tree/master/findmine

    總結(jié)

    以上是生活随笔為你收集整理的使用C语言写一个扫雷小游戏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。