tft每日頭條

 > 遊戲

 > c語言掃雷語句

c語言掃雷語句

遊戲 更新时间:2024-10-17 03:08:14
一:遊戲介紹

《掃雷》是一款大衆類的益智小遊戲,于1992年發行。遊戲目标是在最短的時間内根據點擊格子出現的數字找出所有非雷格子,同時避免踩雷,踩到一個雷即全盤皆輸

c語言掃雷語句(C語言掃雷遊戲)1

二:C語言實現掃雷(1)新建文件

整個遊戲需要三個文件,第一個是頭文件“Saolei.h”用于聲明函數,宏定義等,第二個是“Saolei_game.c”用于實現頭文件中所聲明函數的功能,第三個是"Saolei_test.c"用于控制整個遊戲邏輯。

c語言掃雷語句(C語言掃雷遊戲)2

(2)邏輯流程

第一:打印主體邏輯框架

c語言掃雷語句(C語言掃雷遊戲)3

第二:設置雷場

  1. 對于排雷遊戲,使用鼠标點擊某個小方格後,如果有雷當場暴斃,如果沒有累,則會顯示出此格子上下左右及四個對角出的格子上總的雷的數目。所以定義一個9×9的字符數組mine,用字符1表示此處有雷,用字符0表示此處無雷。所以定義mine數組,并初始化顯示如下
  2. 上述中有一個問題,我們實際玩掃雷遊戲的時候,開始界面是空白的,但是如果這樣一上來就把mine數組打印出來,豈不是已經排完了嗎?所以我們必須還需要一個相同的數組,這個數組的每個元素類似于一個“遮罩”,在遮罩下面到底是雷還是什麼無從得知,隻有用戶輸入坐标後才能揭曉,而這個數組也同時作為排雷數組。于是建立一個同大小的show數組,全部元素被初始化為"*"。
  3. 兩個數組建立好之後,不得不考慮另外一個問題。我們在排雷時需要判斷某個方格周圍的類的數目,那麼勢必就要訪問到這些方格,對于中間的方格沒有問題,但是對于邊緣的方格(如下),在訪問其右側方格時就會出現越界的問題最先想到的方法就是訪問之前判斷其有效性,但是這樣的方法想一想就覺得麻煩。所以我們可以這樣:我們的棋盤是9×9,但是我們設置為11×11,也就是多出兩行和兩列,這樣我們在訪問時就不會産生越界,反正那多出的兩行和兩列的元素上一定是沒有雷的。

所以我們在宏定義時,要這樣定義

c語言掃雷語句(C語言掃雷遊戲)4

所以部分代碼需要修改,這裡需要注意打印時是要從(1,1)到(9,9)

c語言掃雷語句(C語言掃雷遊戲)5

4. 最後,用戶排雷時是需要坐标的,但是由于格子太大,不容易一眼看出坐标,所以我們可以加入行号和列号來進行輔助

c語言掃雷語句(C語言掃雷遊戲)6

第三:布雷我們定義字符1表示此處有雷,字符0表示此處無雷。一般的掃雷遊戲均有初級,中級和高級等遊戲難度分級,其難度取決于雷的數目,數目越多難度越大。所以在布置雷時首先要決定需要布置多少個雷,然後進入一個循環,利用系統生成随機坐标,判斷生成坐标對應的位置是否有雷,如果沒有雷,則放置一顆雷同時将類的數目減小1,如果有雷則繼續生成下一個随機坐标重複上述過程。直到最後的類全部放置完畢。

c語言掃雷語句(C語言掃雷遊戲)7

c語言掃雷語句(C語言掃雷遊戲)8

第四:排雷

  1. 排雷時有一個十分重要的操作就是如果用戶沒有踩到雷,需要統計該位置周圍的雷的數目,我們将其封裝為一個函數,參數除了數組外需要接受一個坐标周圍對應的坐标關系如下想要探查其周圍雷的數目固然可以使用逐個遍曆比較的方式進行的,但是這裡還有一種更為簡單的方法,由于數組裡存儲的全部都是字符0或字符1,而數字1=字符1-字符0,數字2=字符2-字符0·····依次類推。于是我們可以将其周圍的字符全部加起來減去8個字符0就是所得雷的個數

c語言掃雷語句(C語言掃雷遊戲)9

2. 排查雷時,該函數就要同時傳入mine數組和show數組,進入函數後,讓用戶輸入坐标,根據用戶輸入的坐标對應到雷場中進行判斷,如果輸入的位置有雷當場炸死,如果沒有雷則調用函數探查周圍雷的信息并返回,将此信息傳遞給同位置的show數組,并顯示給用戶,如下

c語言掃雷語句(C語言掃雷遊戲)10

c語言掃雷語句(C語言掃雷遊戲)11

c語言掃雷語句(C語言掃雷遊戲)12

3. 最後一點,上述還沒有實現的一點就是什麼時候判斷為赢了,9×9的方格有10個雷,則剩餘的71個位置沒有雷。所以定義個變量win,每次沒有碰到雷時win ,循環結束條件是當win>9×9-10。

c語言掃雷語句(C語言掃雷遊戲)13

三:全部代碼

頭文件

#pragma once #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 board[Rows][Cols],int rows,int cols,char set);//初始化放雷數組 void displayBoard(char board[Rows][Cols],int row,int col);//顯示 void setMine(char board[Rows][Cols], int row,int col);//設置雷 void FindMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col);//找雷 int get_mine_count(char board[Rows][Cols], int x, int y); 123456789101112131415

函數實現文件

#include "Saolei.h" void initBoard(char board[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 ) { board[i][j] = set; } } } void displayBoard(char board[Rows][Cols], int row, int col) { int i = 0; int j = 0; for (i = 0; i <= col; i )//列号 { printf("%d ", i); } printf("\n"); for (i = 0; i <= col; i )//列号下的橫線 { printf("—"); } printf("\n"); for (int i = 1; i <=row; i ) { printf("%d", i); printf("|"); for (int j = 1; j <=col; j ) { printf("%c ", board[i][j]); } printf("\n"); } } void setMine(char board[Rows][Cols], int row, int col) { int count = EASY_COUNT;//count個雷 while (count) { int x = rand() % row 1; int y = rand() % col 1;//範圍為1-9; if (board[x][y] == '0') { board[x][y] = '1'; count--; } } } int get_mine_count(char board[Rows][Cols], int x, int y) { return board[x - 1][y - 1] board[x - 1][y] board[x - 1][y 1] board[x][y - 1] board[x][y 1] board[x 1][y - 1] board[x 1][y] board[x 1][y 1] - 8 * '0'; } void FindMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col) { int x, y = 0; int win = 0; while (win<row*col-EASY_COUNT) { printf("請輸入你的坐标\n"); scanf_s("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { //坐标合法 if (mine[x][y] == '1')//遇到雷了 { printf("You Lose!\n"); displayBoard(mine, row, col); break; } else//不是雷,統計信息 { int count = get_mine_count(mine, x, y);//得到該位置周圍的雷的個數 show[x][y] = count '0'; displayBoard(show, row, col); win ; } } else { printf("輸入有誤,重新輸入\n"); } } if (win == row * col - EASY_COUNT) { printf("you win\n"); } } 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108

邏輯控制文件

#define _CRT_SECURE_NO_WARNINGS 1 #include "Saolei.h"; void menu() { printf("*************************\n"); printf("**********1.play*********\n"); printf("**********0.exit*********\n"); printf("*************************\n"); } void game() { printf("遊戲開始\n"); char mine[Rows][Cols] = {0};//放雷 char show[Rows][Cols] = { 0 };//排雷 initBoard(mine, Rows, Cols,'0');//初始化放雷數組 initBoard(show, Rows, Cols,'*');//初始化排雷數組 printf("\n"); printf("雷場如下\n"); displayBoard(show, Row, Col);//顯示 setMine(mine, Row, Col);//報雷 FindMine(mine, show, Row, Col);//排雷 } void test() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("請選擇:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出遊戲\n"); break; default: printf("輸入錯誤\n"); break; } } while (input); } int main() { test(); return 0; }

如果需要獲取工程文件,請關注公衆号【0與1】,并正在後台回複【C語言】

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关遊戲资讯推荐

热门遊戲资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved