一、游戏前的准备:
先了解unity基本操作及MVC模式
MVC模式由以下三个核心组件组成:
-
模型(Model):
- 模型是应用程序的数据层,负责管理应用程序的数据、状态和业务逻辑。
- 它通常表示应用程序中的实际对象或数据结构,例如用户信息、订单、产品等。
- 模型组件独立于用户界面,使其可重用,并且可以轻松进行单元测试。
- 当数据变化时,模型会通知视图和控制器,以便及时更新用户界面。
-
视图(View):
- 视图是用户界面的表示层,负责显示模型中的数据以及向用户呈现信息。
- 视图通常是用户看到和与之交互的部分,如图形界面、网页或命令行界面。
- 视图将模型的数据呈现给用户,并接受用户的输入。
- 视图不应包含业务逻辑,而仅仅负责显示数据和向控制器报告用户操作。
-
控制器(Controller):
- 控制器充当模型和视图之间的协调者,负责接收用户输入、处理用户操作以及更新模型和视图。
- 它捕获用户的交互,将其转化为操作,并决定如何响应这些操作。
- 控制器根据模型的状态更新视图,也可以接收来自视图的通知以更新模型。
- 控制器通常包含应用程序的业务逻辑,并确保模型和视图保持分离
二、游戏规则
玩家需在已经打乱的数字板上移动方块,使数字方块有序排列。
三、代码实现
3.1代码逻辑介绍
定义一个4*4的数组,数组对应位置的数值表示数字板上对应位置方块上的数字,如果该数字为0代表该方块是个空块。
首先是移动的逻辑,在空的方块四周的数字方块才能移动,定义move(row,col)函数,(row,col)是点击的方块位置,如果该方块上下左右中有空块,则将该方块移到空块处,即两块的数字交换。
然后是初始化的逻辑,两层for循环让数组对应位置有对应的正确数字,然后需要打乱,这里注意不能随意打乱,即不能把块拆下来打乱再加上去,因为可能会导致无解,那么我们可以通过上面移动的逻辑移动打乱,那么我们就需要得到函数的输入参数row,col,即点击的位置,点击的位置在空块的上下左右才有效,即我们在{-1,0,1}三个数上随机产生一个随机数,然后让当前空块的Emptyrow+随机数得到要点击的行号,对列号也是如此,循环1000次打乱,注意行号、列号要有限制,范围在[0,3]。
最后是判断是否成功的逻辑,如果从左往右从上往下数数,依次是0到15则成功。
3.2完整代码
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
public class HuaRongDao : MonoBehaviour
{
private int[,] grid = new int[4, 4];
private int emptyRow = 3;
private int emptyCol = 3;
void Start(){
InitializeGrid();
}
private void OnGUI()
{
GUI.Box(new Rect(210,25,400,400), "");
if (!CheckWinCondition()) {
for (int row = 0; row < 4; row++)
{
for (int col = 0; col < 4; col++)
{
int piece = grid[row, col];
if (piece == 0)
{
// Empty slot
GUI.Button(new Rect(255 + col * 70, 50 + row * 70, 70, 70), "");
}
else
{
// Non-empty slot
if (GUI.Button(new Rect(255 + col * 70, 50 + row * 70, 70, 70), piece.ToString()))
{
// Handle click on non-empty slot
MovePiece(row, col);
}
}
}
}
}
else{
GUI.Box(new Rect(260, 50, 200, 200), "\n\n\n\n\nCongratulations!\n You won.");
}
}
private void InitializeGrid()
{
for (int row = 0; row < 4; row++)
{
for (int col = 0; col < 4; col++)
{
grid[row, col] = row * 4 + col + 1;
}
}
grid[3, 3] = 0;
int[] step = { -1, 0,1 };
System.Random rng = new System.Random();
int i = 0;
while (i < 1000) {
int randomNumber1 = rng.Next(0, 3);
int randomNumber2 = rng.Next(0, 3);
int newRow = emptyRow + step[randomNumber1];
int newCol = emptyCol + step[randomNumber2];
if (newRow >= 0 && newRow <= 3 && newCol >= 0 && newCol <= 3)
{
MovePiece(newRow, newCol);
}
i++;
}
}
private void MovePiece(int row, int col)
{
// Check if the clicked piece can be moved to the empty slot
if ((row == emptyRow && Mathf.Abs(col - emptyCol) == 1) || (col == emptyCol && Mathf.Abs(row - emptyRow) == 1))
{
// Swap the clicked piece and the empty slot
grid[emptyRow, emptyCol] = grid[row, col];
grid[row, col] = 0;
// Update the empty slot coordinates
emptyRow = row;
emptyCol = col;
}
}
private bool CheckWinCondition()
{
int expectedValue = 1;
for (int row = 0; row < 4; row++)
{
for (int col = 0; col < 4; col++)
{
if (grid[row, col] != expectedValue)
{
return false; // 拼图块的值不在正确的顺序
}
expectedValue++;
if (expectedValue == 16)
{
// 已经检查完所有拼图块
return true;
}
}
}
return true; // 所有拼图块都在正确的顺序
}
}
3.3实现效果
b站视频:https://t.bilibili.com/850457684150845507?share_source=pc_native
四、扩展
可以将图片分为16块,贴到方块上,形成拼图游戏。