IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity中做力扣算法题(Day6 黑板异或游戏) -> 正文阅读

[游戏开发]Unity中做力扣算法题(Day6 黑板异或游戏)

基础tips之前博文有。

题目:

思路:

这其实是个博弈论的问题,谁先手谁后手,数组为偶数个还是奇数个都是决定胜负的关键,但我们的目标还是那句话,只需要达到将算法过程变成更好理解的方式,也就是说假设你是Alice并且先手,然后当你擦掉数字之后,另一个人选的时候,异或运算得出的结果是0,看到0的这个人就欣喜的胜利了,也就是winner,抓住这点,我们就可以开始做了。

“原力与你同在”。

效果图:

Alice获胜:

Bob获胜:

?全部擦掉后Alice获胜:

源代码:

XorGame类

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class XorGame : MonoBehaviour
{
    public string Text;//文本
    public int index;//射线检测到的gameobject的名字
    public GameObject Bob;//Bob行动人
    public GameObject Alice;//Alice行动人

    public void Start()
    {
        NumsManager.instance.CreateRandomValue();//单例引用创建随机数方法
        NumsManager.instance.CaculateXorAllValue();//单例引用所有数字异或运算方法
        NumsManager.MoveNum = 0;
    }
    public void Update()
    {
        DestroyNum();
        //根据列表中的数改变文本
        for (int i = 0; i < NumsManager.Xor.Count; i++)
        {
            switch (i)
            {
                case 0:
                    ChangeText(0, "0");
                    break;
                case 1:                  
                    ChangeText(1, "1");                                    
                    break;
                case 2:
                    ChangeText(2, "2");
                    break;
                case 3:
                    ChangeText(3, "3");
                    break;
                case 4:
                    ChangeText(4, "4");
                    break;
                case 5:
                    ChangeText(5, "5");
                    break;
                case 6:
                    ChangeText(6, "6");
                    break;
                case 7:
                    ChangeText(7, "7");
                    break;
                case 8:
                    ChangeText(8, "8");
                    break;
                case 9:
                    ChangeText(9, "9");
                    break;
            }
        }
        //判断Alice还是Bob行动回合,并且默认为Alice先手(可修改)
        if (NumsManager.MoveNum == 0|| NumsManager.MoveNum==2|| NumsManager.MoveNum == 4|| NumsManager.MoveNum == 6|| NumsManager.MoveNum == 8|| NumsManager.MoveNum == 10)
        {
            Alice.gameObject.SetActive(true);
            Bob.gameObject.SetActive(false);
        }
        else if(NumsManager.MoveNum == 1 || NumsManager.MoveNum == 3|| NumsManager.MoveNum == 5|| NumsManager.MoveNum == 7|| NumsManager.MoveNum == 9)
        {
            Alice.gameObject.SetActive(false);
            Bob.gameObject.SetActive(true);

        }
    }
    /// <summary>
    /// 改变文本
    /// </summary>
    /// <param name="index"></param>
    /// <param name="name"></param>
    void ChangeText(int index,string name)
    {
        Text = NumsManager.Xor[index].ToString();       
        GameObject.Find(name).GetComponent<TextMesh>().text = Text;      
               
    }
    /// <summary>
    /// Alice擦掉数字(射线检测)
    /// </summary>
    void DestroyNum()
    {
        
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        
        if (Physics.Raycast(ray,out hit))
        {
            index = Convert.ToInt32(hit.collider.name);
            if (Input.GetMouseButtonDown(0)&& hit.collider.name!=null)
            {
                NumsManager.MoveNum++;
                Destroy(hit.transform.gameObject);
                NumsManager.Xor.RemoveAt(index);
                NumsManager.instance.CaculateXorAllValue();               
            }
        }
    }
    
    
}

?NumsManager类(单例模式)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class NumsManager : MonoBehaviour
{
    public static NumsManager instance;
    public static int num;//随机数
    public static int MoveNum;
    public static List<int> Xor = new List<int>();
    public int Value;//当前所有数字异或的结果(整型)
    public Text Sum;//当前所有数字异或的结果(unity文本)
    public GameObject BobWin;//Bob获胜预制体
    public GameObject AliceWin;//Alice获胜预制体
    //单例模式
    NumsManager()
    {
        instance = this;
    }
    public void Awake()
    {
        Xor = new List<int>(10);//列表存储随机数
        
    }
    public void Update()
    {      
        Sum.text = Value.ToString();//当前所有数字异或的结果(字符型)
        WinOrLose();
        //如果只剩一个数字,按位异或运算得到它本身
        if (Xor.Count == 1)
        {
            Value = Xor[0];
        }
        //如果无数字剩余,按位异或运算结果为 0
        if (Xor.Count == 0)
        {
            Value = 0;
        }
    }

    /// <summary>
    /// 创建随机数
    /// </summary>
    public void CreateRandomValue()
    {
        for (int i = 0; i < 10; i++)
        {
            num = Random.Range(0, 9);
            Xor.Add(num);
        }
        
    }
   
    /// <summary>
    /// 异或运算
    /// </summary>
    /// <param name="XorA"></param>
    /// <param name="XorB"></param>
    public void CaculateXorValue(int XorA, int XorB)
    {
        Value = XorA ^ XorB;
    }
    /// <summary>
    /// 所有数字异或运算
    /// </summary>
    public void CaculateXorAllValue()
    {
        CaculateXorValue(Xor[0], Xor[1]);
        for (int i = 0; i < Xor.Count; i++)
        {           
            CaculateXorValue(Value, Xor[i+2]);
        }       
    }
    /// <summary>
    /// 判断谁胜利
    /// </summary>
    public void WinOrLose()
    {
        if ((MoveNum == 0 && Value == 0) || (MoveNum == 2 && Value == 0) || (MoveNum == 4 && Value == 0) || (MoveNum == 6 && Value == 0) || (MoveNum == 8 && Value == 0) || (MoveNum == 10 && Value == 0))
        {
            AliceWin.gameObject.SetActive(true);//Alice获胜
        }
        else if ((MoveNum == 1 && Value == 0) || (MoveNum == 3 && Value == 0) || (MoveNum == 5 && Value == 0) || (MoveNum == 7 && Value == 0) || (MoveNum == 9 && Value == 0))
        {
            BobWin.gameObject.SetActive(true);//Bob获胜
        }
    }
}

还有一个处理开始按钮监听的类,太过简单了就不贴了,就是SceneManager.LoadScene这个方法解决游戏开始功能。

项目部分截图:

由于是粗制,项目还有些Bug待修改,但是博主最近忙毕设,就没空改了,感兴趣的大佬或者萌新可以下方留言,看到了我就会回复,回复的不是很迅速还请见谅。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-01-12 00:22:24  更:2022-01-12 00:24:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 18:44:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码