1. 程式人生 > >掃雷遊戲。。c++編寫。。

掃雷遊戲。。c++編寫。。

我知道很簡單,就這樣吧。。

/**********************掃雷*********************/
/*******************2012-11-20******************/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <queue>
using namespace std;

struct node
{
    int x,y;
};

queue<node> q;
int map[1010][1010],already[1010][1010];
int tempx,tempy,m,n,k,x0,y0,sum,l;
node temp,temp2;
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};

bool judge()
{
    if (tempx<0 || tempx>m-1 || tempy<0 || tempy>n-1) return false;
    if (map[tempx][tempy]==-1) return false;
    if (already[tempx][tempy]==0) return false;
    return true;
}

void push()
{
    temp2.x=tempx;temp2.y=tempy;
    q.push(temp2);
    already[tempx][tempy]=0;
}

bool bfs()
{
    while (!q.empty()) q.pop();
    temp.x=x0;temp.y=y0;
    if (already[x0][y0]==0) return true;
    if (map[x0][y0]==-1) return false;
    q.push(temp);
    already[x0][y0]=0;
    while (!q.empty())
    {
        sum++;
        temp=q.front();
        if (map[temp.x][temp.y]==0)
            for (int i=0;i<=7;i++)
            {
                tempx=temp.x+dir[i][0];
                tempy=temp.y+dir[i][1];
                if (judge())
                    push();
            }
        q.pop();
    }
    return true;
}

void print()
{
    cout << "  ";
    for (int i=1;i<=n;i++) cout << i%10;
    cout << endl << "  ";
    for (int i=1;i<=n;i++) cout << "-";
    cout << endl;
    for (int i=0;i<=m-1;i++)
    {
        cout << (i+1)%10 << "|";
        for (int j=0;j<=n-1;j++)
        {
            switch(already[i][j])
            {
            case 0:
                if (map[i][j]==0) cout << " ";
                else
                {
                    if (map[i][j]==-1) cout << "*";
                    else cout << map[i][j];
                }
                break;
            case -1:
                cout << ".";break;
            default:
                cout << "?";
            }
        }
        cout << "|" << endl;
    }
    cout << "  ";
    for (int i=1;i<=n;i++) cout << "-";
    cout << endl;
}

double random(double start, double end)
{
    return start+(end-start)*rand()/(RAND_MAX + 1.0);
}

int judge2(int i,int j)
{
    if (i<0 || i>m-1 || j<0 || j>n-1) return 0;
    if (map[i][j]==-1) return 1;
    return 0;
}

void creat()
{
    srand(time(0));
    int a,b;
    memset(map,0,sizeof(map));
    memset(already,-1,sizeof(already));
    for (int i=1;i<=k;i++)
    {
        while (1)
        {
            a=(int)random(0,m);
            b=(int)random(0,n);
            if (map[a][b]==0)
            {
                map[a][b]=-1;
                break;
            }
        }
    }
    for (int i=0;i<=m-1;i++)
        for (int j=0;j<=n-1;j++)
            if (map[i][j]==0)
                for (int w=0;w<=7;w++)
                    map[i][j]+=judge2(i+dir[w][0],j+dir[w][1]);
}

bool del()
{
    system("cls");
    if (!bfs())
    {
        cout << "I'm sorry!" << endl << endl;
        memset(already,0,sizeof(already));
        print();
        return false;
    }
    if (sum!=m*n-k)
        cout << "Good job!" << endl << endl;
    else
    {
        cout << "Congratulations!!" << endl << endl;
        memset(already,0,sizeof(already));
    }
    print();
    return true;
}

int main()
{
    cout << "--------------------掃雷--------------------" << endl;
    cout << "一開始輸入三個數,分別表示行數,列數以及雷數" << endl;
    cout << "然後請每次輸入三個正整數,1 a b或者2 a b" << endl;
    cout << "輸入1 a b代表,點選a行b列的格子" << endl;
    cout << "輸入2 a b代表,在a行b列上標上旗子(做上標記)" << endl;
    cout << "--------------------------------------------" << endl;
    cin >> m >> n >> k;
    if (k>=m*n)
        cout << "ERROR!" << endl;
    else
    {
        creat();
        system("cls");
        cout << "Map created!" << endl << endl;
        print();
        sum=0;
        while (1)
        {
            if (sum==m*n-k) break;
            cin >> l >> x0 >> y0;
            x0--;y0--;
            if ((l-1)*(l-2)!=0 || x0<0 || x0>m-1 || y0<0 || y0>n-1)
            {
                system("cls");
                cout << "Input ERROR!" << endl << endl;
                print();
            }
            if (l==1)
                if (!del())
                    break;
            if (l==2)
            {
                already[x0][y0]=-already[x0][y0];
                system("cls");
                cout << "Try it!" << endl << endl;
                print();
            }
        }
    }
    system("pause");
    return 0;
}

相關推薦

輸入一個日期(年月日),輸出該日期的後天C語言實現

對於這個問題,首先想到後天就是日再加2,那麼如果輸入的這個日期是每個月的前些天,輸出結果就是年,月,日+2.這麼簡單。但是如果輸入的這個日期是月末的兩天,那月份一定會加1,如果這個月是12月,那年份也要加1,月份變為1,日期也會改變。而且,每個月的天數都不一樣,更需要注意的是

掃雷遊戲的實現C++

掃雷遊戲是Windows作業系統自帶的一個小遊戲,幾乎每個電腦使用者都接觸過它。它同時也是一款比較經典的小遊戲,實現它的方法很多,也可以用不同演算法和語言實現。近期用了兩個週末(各一天)和大半個月的空餘時間終於實現了一個比較完整的掃雷程式。現通過C++來呈現這款小遊戲的實現

掃雷遊戲c++編寫

我知道很簡單,就這樣吧。。 /**********************掃雷*********************/ /*******************2012-11-20******************/ #include <iostream&g

掃雷遊戲加入windows的真實目的

掃雷最原始的版本可以追溯到1973年一款名為“方塊”的遊戲。   不久,“方塊”被改寫成了遊戲“Rlogic”。在“Rlogic”裡,玩家的任務是作為美國海軍陸戰隊隊員,為指揮中心探出一條沒有地雷的安全路線,如果路全被地雷堵死就算輸。兩年後,湯姆·安德森在“Rlogic”的基礎上又編寫出了遊戲“地雷

面試題:編寫一個函式來查詢字串陣列中的最長公共字首 如果不存在公共字首,返回空字串 ""c++實現)

例項說明 示例 1: 輸入: ["flower","flow","flight"] 輸出: "fl" 示例 2: 輸入: ["dog","racecar","car"] 輸出: "" 解釋: 輸入不存在公共字首。 說明: 所有輸入只包含小寫字母 a-z&

C++編寫一個函式來查詢字串陣列中的最長公共字首如果不存在公共字首,返回空字串 ""

設定一個臨時變數儲存第一個字串的每一位就可以了,比較第2-n個字串的是否一直相等 是的話儲存,不是的話返回之前的字串。 可能三個字串完全相同,所以最後還應該有一個return  示例 1: 輸入: ["flower","flow","flight"] 輸出: "f

c#編寫socks代理伺服器,大白話細述協議的最重要部分

由於我是個粗人,是個菜鳥,只會講大白話,只想知道咱老百姓想聽的內容。 不知道為什麼那些網文作者都說socks代理比http代理複雜,http代理和socks代理我都做了,明顯感覺http代理比socks代理要複雜很多,因為http代理要自己解析http協議,這是我的http

掃雷遊戲是一款十分經典的單機小遊戲 問題 H: 掃雷遊戲

題目描述 掃雷遊戲是一款十分經典的單機小遊戲。在n行m列的雷區中有一些格子含有地雷(稱之為地雷格),其他格子不含地雷(稱之為非地雷格)。玩家翻開一個非地雷格時,該格將會出現一個數字——提示周圍格子中有

Rust 2017 調查報告:學習曲線是最大痛點(最大的問題是這門語言太偏底層了,現在做底層的少了還有C這個繞不過去的存在)

穩定版 china 發展 1.5 原型 平臺 正在 報告 超過 Rust 官方在社區上做了一次調查,以了解用戶如何看待 Rust 的發展。調查共收到 5368 份回復,其中有 大約 2/3 的是 Rust 用戶,剩下的 1/3 是非 Rust 用戶,調查結果如下。 點此查

我對C#的認知

UC 概念 了解 人在 run 工程師 ase 關於 asp 關於開發者的技術水平到底該如何定義,到底一個人的技術水平應該定位在高、中、低的標準是什麽呢?很多人覺得這是一個仁者見仁的問題,有人覺得根據公司的那個員工等級判斷。答案是肯定不是,從純開發技術的角度來分析。很多人覺

python setup.py install 報錯:error: [WinError 3] 系統找不到指定的路徑: 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\PlatformSDK\\lib

Outline 在通過 setup.py 安裝python模組時,遇到了以下報錯: # 執行 python setup.py install # 報錯: error: [WinError 3] 系統找不到指定的路徑。: 'C:\\Program Files (x86)\\Microsof

[日常練習] 4. 基於交換兩整形變數值的三種方法的C語言實現

當面試題遇到:交換兩整形變數的值。你是感到無比的“慶幸”遇到這麼簡單的面試題,還是有一點“慌張”,怕是自己想的太簡單了吧!今天我們就來處理幾道小題,並且深入探討一下交換兩整形的3種C語言實現方法!當你再遇到這種問題的時候,你將一點都不慌!你,穩得一批! 練習題目: 1. 給定兩個整形

編寫程式,輸入球到半徑,計算並輸出球的體積圓周率取3.14159

撰寫人——軟工二班——陳喜平 題目描述 編寫程式,輸入球到半徑,計算並輸出球的體積。圓周率取3.14159。 輸入 球到半徑。 輸出 球的體積。注意:保留3位小數,輸出後換行。 樣例輸入 10 樣例輸出 4188.787 提示 來源 hnldyhy #include<stdio

資料結構篇:連結串列多項式的加法與乘法C++)

連結串列多項式還算比較簡單的。 步驟分為 1.建立連結串列                  2.連結串列排序                  3.連結串列的自我化簡                   4.進行運算                  5.進行自我

Lily上課時使用字母數字圖片教小朋友們學習英語單詞,每次都需要把這些圖片按照大小(ASCII碼值從小到大)排列收好請大家給Lily幫忙,通過C語言解決

描述 Lily上課時使用字母數字圖片教小朋友們學習英語單詞,每次都需要把這些圖片按照大小(ASCII碼值從小到大)排列收好。請大家給Lily幫忙,通過C語言解決。  知識點 字串

求方程 的根,用三個函式分別求當b^2-4ac大於0、等於0、和小於0時的根,並輸出結果從主函式輸入a、b、c的值

解題思路: 一元二次方程 ax²+bx+c=0(a≠0)                  其求根依據判定式△的取值為三種( △=b²-4ac )     1. △>0,方程有兩個不相等的實數根;          x1=[-b+√(△)]/2a;   //( 

[HAL學習筆記] HAL庫原始檔stm32h7xx_hal.c學習筆記

[HAL學習筆記] HAL庫原始檔stm32h7xx_hal.c學習筆記,此檔案極其重要(2018-07-21 V1.0) 原文地址:forum.armfly.com/forum.php?mod=viewthread&tid=87760 說明: 1、在中斷裡面使用HAL_Dela

近期刷題的c語言總結

專業軟體工程, 現全職 iOS 開發工程師, 業餘 Android/遊戲開發愛好者 專注於C/C++, 移動應用開發,特別是移動遊戲的開發。Lisp語言的死忠粉:),熱衷於計算機底層原理。 連結我: 我的新浪部落格 Q:1020935219 微訊號:C_W_hu

初學C語言感想

      作為一名菜鳥級C語言學習者,接觸這個語言也差不多一個月了,個人有些感想。       首先我感覺很不可思議(因為之前根本沒接觸過)的是它是一種能以簡易的方式編譯、處理低階儲存器、產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。非常適合入門學計算機的

C#、JAVA操作Hadoop(HDFS、Map/Reduce)真實過程概述元件、原始碼下載無法解決:Response status code does not indicate success: 500

一、Hadoop環境配置概述       三臺虛擬機器,作業系統為:Ubuntu 16.04。       Hadoop版本:2.7.2       NameNode:192.168.72.132       DataNode:192.168.72.135,192.168.72.136