Unity数字华荣道游戏

一、游戏前的准备:

先了解unity基本操作及MVC模式

MVC模式由以下三个核心组件组成:

  1. 模型(Model)

    • 模型是应用程序的数据层,负责管理应用程序的数据、状态和业务逻辑。
    • 它通常表示应用程序中的实际对象或数据结构,例如用户信息、订单、产品等。
    • 模型组件独立于用户界面,使其可重用,并且可以轻松进行单元测试。
    • 当数据变化时,模型会通知视图和控制器,以便及时更新用户界面。
  2. 视图(View)

    • 视图是用户界面的表示层,负责显示模型中的数据以及向用户呈现信息。
    • 视图通常是用户看到和与之交互的部分,如图形界面、网页或命令行界面。
    • 视图将模型的数据呈现给用户,并接受用户的输入。
    • 视图不应包含业务逻辑,而仅仅负责显示数据和向控制器报告用户操作。
  3. 控制器(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块,贴到方块上,形成拼图游戏。

拼图华容道是一款基于Unity引擎的游戏,它是一种经典的益智拼图游戏,旨在训练玩家的空间想象力和逻辑思维能力。 游戏中,玩家需要将乱序的拼图块移动并排列成完整的图片。通过拖动拼图块,玩家可以调整其位置,直到所有拼图块组成正确的形状和图案。 拼图华容道游戏难度可以根据玩家的能力和偏好进行调整。初级模式通常包括较少的拼图块,使得拼图较为容易完成,适合初学者。而高级模式则包含更多拼图块,增加了挑战性,适合那些寻求更高难度的玩家。 在Unity引擎的支持下,拼图华容道可以提供丰富的游戏体验。通过Unity的图形渲染技术,游戏画面可以呈现出精美的图案和流畅的动画。同时,Unity的物理引擎也可以实现拼图块的自动对齐和碰撞检测,为玩家提供更加真实的操作感。 除了基本的拼图功能之外,拼图华容道还可以添加一些额外的游戏元素,如计时器和分数系统。通过计时器,玩家可以挑战自己在规定时间内完成拼图的速度。而分数系统可以记录玩家每次拼图的成绩,创造一种竞争和挑战的氛围。 总之,Unity拼图华容道是一款经典的益智游戏,通过其强大的图形渲染和物理引擎,为玩家提供了丰富的游戏体验。无论是初学者还是高级玩家,都可以在这款游戏中挑战自己的空间想象力和逻辑思维能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值