简单的扫雷代码,适合初学者

using UnityEngine;
using System.Collections;

public class Grid
{
    public int x;                   // 记录x坐标
    public int y;                // 记录y坐标
    public bool hasBoom;        // 是否有雷
    public int boomNumber;        // 周边雷数
    public bool opend = false;  // 是否打开
}

public class Boom : MonoBehaviour
{
    public int row = 10;    // 行数
    public int column = 10; // 列数
    private int size = 50;    // 格子大小
    private Grid[,] map;    // 格子数组
    private float minTime;  // 最佳时间
    private bool over = false; // 游戏是否结束

    void CreateMap ()
    {
        map = new Grid[row, column];    // 创建初始化数组
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                map [i, j] = new Grid ();// 实例化格子
                map [i, j].x = i;       // 记录坐标
                map [i, j].y = j;

            }
        }
    }

    void ComputerNumber () // 遍历数组,查找每个格子周围雷的个数
    {
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                map [i, j].boomNumber = CountBoom (i, j);
            }
        }
    }

    int CountBoom (int x, int y)  // 计算每个方格的周围雷数(九宫格形状,除去中心位置的)
    {
        int count = 0;
        for (int i = -1; i <= 1; i++) {
            for (int j = -1; j <= 1; j++) {
                if (!(i == 0 && j == 0)) {
                    int n = x + i;
                    int m = y + j;
                    if (n >= 0 && n < row && m >= 0 && m < column) { // 如果是雷,计数加1
                        if (map [n, m].hasBoom) {
                            count++;
                        }
                    }
                }
            }
        }
        return count;
    }

    void Open (int x, int y)  // 打开雷数为0的格子
    {
        map [x, y].opend = true;
        if (map [x, y].boomNumber == 0) {
            for (int i = -1; i <= 1; i++) {
                for (int j = -1; j <= 1; j++) {
                    if (!(i == 0 && j == 0)) {
                        int n = x + i;
                        int m = y + j;
                        if (n >= 0 && n < row && m >= 0 && m < column && map [n, m].opend == false) {
                            Open (n, m);
                            audio.Play ();  // 播放打开格子的音效
                        }
                    }
                }
            }
        }
    }

    void boomcount (int boomCount)  // 为地图中添加的雷数
    {
        for (int i = 0; i < boomCount; i++) {
            map [Random.Range (0, row), Random.Range (0, column)].hasBoom = true;
        }
    }

    void Start ()
    {
        CreateMap ();  // 初始化地图
    }

    void Update ()
    {
        int sum = 0;
        if (!over)
        for (int i = 0; i < 10; i++) {  // 遍历数组,计算已经打开的格子和雷数相加是否等于100
            for (int j = 0; j < 10; j++) {
                if (map [i, j].opend) {
                    sum = sum + 1;
                }
                if (map [i, j].hasBoom) {
                    sum = sum + 1;
                }
                if (sum == 100) {
                    over = true;
                    if ( Time.realtimeSinceStartup < PlayerPrefs.GetFloat("keepTime")  ) {
                    PlayerPrefs.SetFloat("keepTime",Time.realtimeSinceStartup);
                    minTime = PlayerPrefs.GetFloat("keepTime");
                    } else if (PlayerPrefs.GetFloat("keepTime") == 0) {
                        PlayerPrefs.SetFloat("keepTime",Time.realtimeSinceStartup);
                    }
                    Debug.Log ("You Win!!");
                    Debug.Log ("你用了" +  Time.realtimeSinceStartup.ToString ("0.00") + "秒!");
                }

            }
        }
    }

    void OnGUI ()
    {
        GUI.Button(new Rect(600,150,100,50),"最好成绩 " + PlayerPrefs.GetFloat("keepTime").ToString("0.00"));

        if (GUI.Button (new Rect (600, 0, 100, 50), "容易")) {

            boomcount (4);
            ComputerNumber (); // 遍历每个格子的雷数属性
        }

        if (GUI.Button (new Rect (600, 50, 100, 50), "简单")) {
            boomcount (6);
            ComputerNumber ();       

        }
        if (GUI.Button (new Rect (600, 100, 100, 50), "困难")) {
            boomcount (10);
            ComputerNumber ();        

        }

        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                // 显示出坐标和雷数
                string tip = map [i, j].x + "," + map [i, j].y + "\n";
                tip += map [i, j].boomNumber;

                // 有雷的显示为红色,没有雷的显示为黄色
                if (map [i, j].hasBoom) {
                    GUI.backgroundColor = Color.red;

                } else {
                    GUI.backgroundColor = Color.yellow;
                }

                if (map [i, j].opend) {
                    GUI.Box (new Rect (j * size, i * size, size, size), tip);
                } else if (GUI.Button (new Rect (j * size, i * size, size, size), tip)) {

                    if (map [i, j].hasBoom) {
                        // 当鼠标悬停在按钮上的时候,字体蓝色高亮
                        GUI.skin.button.hover.textColor = Color.blue;
                        print ("Over!");

                    } else {
                        Open (i, j);
                    }
                }
            }
        }

    }

}

时间: 2024-10-19 11:54:24

简单的扫雷代码,适合初学者的相关文章

[C#] Timer + Graphics To Get Simple Animation (简单的源码例子,适合初学者)

>_<" 这是一个非常简单的利用C#的窗口工程创立的程序,用来做一个简单的动画,涉及Timer和Graphics,适合初学者,高手略过~ PS:请忽略菜单栏的东西~背景改成了白色! 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 us

java Socket多线程聊天程序(适合初学者)

一个非常简单的java聊天程序,有客户端和服务器端,目前只有群聊功能,其他的所有功能都可以在这个基础上添加,现在我分享出来主要是为了保持一个最简单的java聊天程序便于初学者学习,界面也非常的简洁,只有两个文件,主要是用了socket,java多线程,知识点不是很多,很适合初学者 下面是服务器端代码 package tk.socket; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.Act

Andoid的Button+Intent(适合初学者)

自己刚学Android的时候在这上面花了不少时间,资料没少找.学习别人的"关键代码",自己写起来不是缺这就是缺那的.希望后来的同学在这上面少浪费些时间. 其实很简单,就是用一个Android的Intent实现Button的页面跳转,单击图1的Button,进入图2 图1 图2 首先建立一个Android Application project,主类名为MainActivity不改,sdk没问题的话系统会自动生成onCreate函数,MainActivity继承Activity,出现红灯

一些适合初学者的C/C++语言开发环境(IDE)

对于很多初学C语言的人来说,第一个开发环境应该都是VC6.0(没办法的事,很多高校都用VC6),在以前VC6确实是比较适合用来进行C/C++的学习. 但现在VC6已经不适合当前的环境了,更不适合新手.我之前使用过VC6(网上流行的版本)一段时间,发现它有几个问题. 1.古老,很多新特性不支持,界面难看,网上的多数版本都不是完整的VC6 2.不兼容win10,win7系统,要下载补丁才能正常运行. 3.有时候代码没错,一样不能编译通过. 因此我个人不推荐新人使用VC6作为学习编程语言的开发环境,现

推荐几本适合初学者的Java书籍

学习java哪本书比较好?作为Java初学者,我想这是问的最多的问题了老,下面整理一些学习java的好书推荐给大家,希望对大家学习java有所帮助. Java入门好书推荐:<Head First Java> <Head First Java>是本完整的面向对象(object-oriented,OO)程序设计和Java的学习指导.此书是根据学习理论所设计的,让你可以从学习程序语言的基础开始一直到包括线程.网络与分布式程序等项目.最重要的,你会学会如何像个面向对象开发者一样去思考.但如

Javascript 实现简单计算器实例代码

Javascript 实现简单计算器实例代码 这篇文章主要介绍了Javascript 实现简单计算器实例代码的相关资料,需要的朋友可以参考下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

简单的jQuery代码

用户名: 密 码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>简单的jQuery代码</title> <!--引入jQuery脚本--> <script src="scripts/jquery-3.1.1.js" type="text/javascri

JS实现简单的运行代码 &amp; 侧边广告

/* JS实现简单的运行代码功能 */<!doctype html> <html> <head> <meta charset="utf-8" /> <script> window.onload = function() { var oTxt = document.getElementById('codeText'); var oBtn = document.getElementById('btn'); oBtn.onclick

HTML QQ聊天代码 简单的一行代码

简单的一行代码: <a href="tencent://message/?uin=173007740&Site=&Menu=yes">和173007740用户聊天</a> 和173007740用户聊天 1.如果用户没有登录QQ,则会弹出QQ登录窗口,登录之后,再点击链接,就可以聊天了 2.如果没有对方QQ,需要加对方QQ为好友,才可以进行聊天 3.如果已有对方QQ,可直接进行聊天