using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MainMenuPanel : MonoBehaviour
{
public Button btnPlay; // 开始按钮
public Slider sldDifficulty; // 难度滑动条
private void Awake()
{
// 监听滑动条滑动事件
sldDifficulty.onValueChanged.AddListener(OnSliderChange);
// 开始按钮点击事件
btnPlay.onClick.AddListener(OnPlayGame);
}
void Start()
{
// 启动的时候保存难度值
SudokuGameManager.Instance.difficulty = (int)sldDifficulty.value;
}
public void OnSliderChange(float value)
{
// 滑动条变化的时候保存难度值
SudokuGameManager.Instance.difficulty = (int)sldDifficulty.value;
}
public void OnPlayGame()
{
// 调用游戏管理器中的方法来开始一局新的数独游戏
SudokuGameManager.Instance.OnPlayNewGame();
}
}
主要功能在该脚本中
在创建正确答案,扣除里面的数字并,把两个比较
重开游戏
算法用到了递归
using System.Collections.Generic;
using UnityEngine;
public class SudokuBoard : MonoBehaviour
{
// 正确答案
int[,] gridNumber = new int[SudokuGameManager.girdLength, SudokuGameManager.girdLength];
// 谜题
int[,] puzzleNumber = new int[SudokuGameManager.girdLength, SudokuGameManager.girdLength];
// 谜题备份,用于重开本局游戏
int[,] puzzleBak = new int[SudokuGameManager.girdLength, SudokuGameManager.girdLength];
public SudokuGrid grid;// 网格体
public void Init()
{
// 创建一个有解的数独
CreateGrid();
// 根据已经创建的答案 来创建 谜题
CreatePuzzle();
// 根据谜题来初始化按钮
InitButtons();
}
// 清理所有资源
public void Clear()
{
// 清理谜题和答案数据
gridNumber = new int[SudokuGameManager.girdLength, SudokuGameManager.girdLength];
puzzleNumber = new int[SudokuGameManager.girdLength, SudokuGameManager.girdLength];
puzzleBak = new int[SudokuGameManager.girdLength, SudokuGameManager.girdLength];
}
// 销毁某个物体下面的所有子物体
void ClearChildren(Transform trans)
{
for (int i = 0; i < trans.childCount; i++)
{
Destroy(trans.GetChild(i).gameObject);
}
}
// 某列是否包含某个数据
bool ColumnContainsValue(int col, int value)
{
for (int i = 0; i < SudokuGameManager.girdLength; i++)
{
if (gridNumber[i, col] == value)
{
return true;
}
}
return false;
}
// 某一行是否包含某个数字
bool RowContainsValue(int row, int value)
{
for (int i = 0; i < SudokuGameManager.girdLength; i++)
{
if (gridNumber[row, i] == value)
{
return true;
}
}
return false;
}
// 某一个子网格是否包含某个数字
bool SquareContainsValue(int row, int col, int value)
{
// 遍历子单元格(3X3)
for (int i = 0; i < SudokuGameManager.subGirdLength; i++)
{
for (int j = 0; j < SudokuGameManager.subGirdLength; j++)
{
// 通过计算坐标 确定是属于哪个子网格
if (gridNumber[(row / SudokuGameManager.subGirdLength) * SudokuGameManager.cellLength + i, (col / SudokuGameManager.subGirdLength) * SudokuGameManager.cellLength + j] == value)
{
return true;
}
}
}
return false;
}
// 检查某个数是否已经存在于 横 列以及某个3X3的网格里
bool CheckAll(int row, int col, int value)
{
if (ColumnContainsValue(col, value)) // 列是否已经包含该数字
{
return false;
}
if (RowContainsValue(row, value)) // 行是否已经包含该数字
{
return false;
}
if (SquareContainsValue(row, col, value)) // 当前子九宫是否包含该数字
{
return false;
}
return true;
}
// 网格数字是否有效
bool IsValid()
{
for (int i = 0; i < SudokuGameManager.girdLength; i++)
{
for (int j = 0; j < SudokuGameManager.girdLength; j++)
{