unity数独游戏

news2025/4/8 2:24:14

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++)
            {
                if (gridNumber[i, j] == 0)
                {
                    return false;
                }
            }
        }

        return true;
    }

    // 创建一个有效的数独网格
    void CreateGrid()
    {
        List<int> rowList = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        List<int> colList = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        
        // 先在00位置随机一个数据
        int value = rowList[Random.Range(0, rowList.Count)];
        gridNumber[0, 0] = value;
        rowList.Remove(value);
        colList.Remove(value);

        // 将其他8个数字随机到第一行中
        for (int i = 1; i < SudokuGameManager.girdLength; i++)
        {
            value = rowList[Random.Range(0, rowList.Count)];
            gridNumber[i, 0] = value;
            rowList.Remove(value);
        }
        
        // 将其他几个数字随机到第一列中
        for (int i = 1; i < SudokuGameManager.girdLength; i++)
        {
            value = colList[Random.Range(0, colList.Count)];
            // 需要判断是否会和第一个子网格有重复
            if (i < 3)
            {
                while (SquareContainsValue(0, 0, value))
                {
                    value = colList[Random.Range(0, colList.Count)]; // reroll
                }
            }

            gridNumber[0, i] = value;
            colList.Remove(value);
        }

        // 再随机对最后一个子网格添加三个合法的数字
        for (int i = 6; i < 9; i++)
        {
            value = Random.Range(1, 10);
            while (SquareContainsValue(0, 8, value) || SquareContainsValue(8, 0, value) ||
                   SquareContainsValue(8, 8, value))
            {
                value = Random.Range(1, 10);
            }

            gridNumber[i, i] = value;
        }
        
        // 先随机生成一个数独的底子,然后对它求解,解出的答案就是完整数独
         SolveSudoku();
    }

    // 对数独求解
    bool SolveSudoku()
    {
        int row = 0;
        int col = 0;
        
        // 如果已经生成完毕 就返回结果
        if (IsValid())
        {
            return true;
        }
        
        // 找到还没有生成数字的位置
        for (int i = 0; i < SudokuGameManager.girdLength; i++)
        {
            for (int j = 0; j < SudokuGameManager.girdLength; j++)
            {
                if (gridNumber[i, j] == 0)
                {
                    row = i;
                    col = j;
                    break;
                }
            }
        }
        
        // 循环 找到合适的数字,满足所有的规则
        for (int i = 1; i <= SudokuGameManager.girdLength; i++)
        {
            if (CheckAll(row, col, i))
            {
                gridNumber[row, col] = i;
                
                // 递归找解 这里很重要,因为是对自身的递归,如果随机的数字正好全部都满足就结束了
                if (SolveSudoku())
                {
                    return true;
                }
                else //如果某次递归找不到解 就会将该位置之 
                {
                    gridNumber[row, col] = 0;
                }
            }
        }

        return false;
    }

    void CreatePuzzle()
    {
        // 根据事先完成的答案 创建谜题
        // 先将答案复制一份出来
        System.Array.Copy(gridNumber, puzzleNumber, gridNumber.Length);

       //移除数字,制造难度
        for (int i = 0; i < SudokuGameManager.Instance.difficulty; i++)
        {
            int row = Random.Range(0, SudokuGameManager.girdLength);
            int col = Random.Range(0, SudokuGameManager.girdLength);
        
            // 循环随机,直到随到一个没有处理过的位置
            while (puzzleNumber[row, col] == 0)
            {
                row = Random.Range(0, SudokuGameManager.girdLength);
                col = Random.Range(0, SudokuGameManager.girdLength);
            }
        
            puzzleNumber[row, col] = 0;
        }

        // 确保最少要出现8个不同的数字 才能保证唯一解
        List<int> onBoard = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        RandomizeList(onBoard);

        for (int i = 0; i < SudokuGameManager.girdLength; i++)
        {
            for (int j = 0; j < SudokuGameManager.girdLength; j++)
            {
                for (int k = 0; k < onBoard.Count - 1; k++)
                {
                    if (onBoard[k] == puzzleNumber[i, j])
                    {
                        onBoard.RemoveAt(k);
                    }
                }
            }
        }

        // 如果剩余的数量大于1 说明没有8个不同的数字 那么就还原几个数字回来
        while (onBoard.Count - 1 > 1)
        {
            int row = Random.Range(0, SudokuGameManager.girdLength);
            int col = Random.Range(0, SudokuGameManager.girdLength);

            if (gridNumber[row, col] == onBoard[0])
            {
                puzzleNumber[row, col] = gridNumber[row, col];
                onBoard.RemoveAt(0);
            }
        }
        
        // 将谜题备份用于重开本局游戏
        System.Array.Copy(puzzleNumber, puzzleBak, gridNumber.Length);
    }

    // 初始化可填写的按钮布局
    void InitButtons()
    {
        for (int i = 0; i < SudokuGameManager.girdLength; i++)
        {
            for (int j = 0; j < SudokuGameManager.girdLength; j++)
            {
                var cell = grid.GetCellByPosition(i,j);
                if (cell != null)
                {
                    cell.InitValues(puzzleNumber[i,j]);
                }
                
            }
        }
    }
    
    //重开本局游戏
    public void RestartGame()
    {
        System.Array.Copy(puzzleBak, puzzleNumber, gridNumber.Length);
        InitButtons();
    }
    
    // 打乱一个List
    void RandomizeList(List<int> l)
    {
        for (var i = 0; i < l.Count - 1; i++)
        {
            // 随机交换两个位置
            int rand = Random.Range(i, l.Count);
            (l[i], l[rand]) = (l[rand], l[i]);
        }
    }
    
    // 将玩家输入更新到谜题中
    public void UpdatePuzzle(int row, int col, int value)
    {
        puzzleNumber[row, col] = value;
    }

    /// <summary>
    /// 判定游戏是否完成
    /// </summary>
    /// <returns></returns>
    public bool CheckComplete()
    {
        // 检查填入的内容和谜底内容是否吻合
        for (int i = 0; i < SudokuGameManager.girdLength; i++)
        {
            for (int j = 0; j < SudokuGameManager.girdLength; j++)
            {
                if (puzzleNumber[i, j] != gridNumber[i, j])
                {
                    return false;
                }
            }
        }
        return true;
    }
    
}

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

public class SudokuCell : MonoBehaviour
{
    public Vector2Int coordinate; // 在大网格里坐标
    public SudokuSubGrid subGrid;
    int value = 0; // 当前格子的值
    public TextMeshProUGUI txtNumber;// 数字控件
    public Button btnNum;// 按钮控件

    void Awake()
    {
        btnNum = GetComponent<Button>();
        txtNumber = GetComponentInChildren<TextMeshProUGUI>();
        btnNum.onClick.AddListener(ButtonClicked);
    }


    // 给网格设置数字
    public void InitValues(int value)
    {
        // 初始化的时候,不为0表示该位置是系统提供的数字,否则就是玩家应该输入的数字
        if (value != 0)
        {
            txtNumber.text = value.ToString();
            txtNumber.color = new Color32(119, 110, 101, 255);
            btnNum.enabled = false;
        }
        else
        {
            btnNum.enabled = true;
            txtNumber.text = " ";
            txtNumber.color = new Color32(0, 102, 187, 255);
        }
    }

    // 设置行列坐标
    public void SetCoordinate(int row, int col)
    {
        coordinate = new Vector2Int(row, col);
        name = row.ToString() + col.ToString();
    }

    // 设置其归属的子网格
    public void SetSubGridParent(SudokuSubGrid sub)
    {
        subGrid = sub;
    }

    /// <summary>
    /// 按钮事件
    /// 将当前的数字输入和指定的Cell进行绑定
    /// </summary>
    public void ButtonClicked()
    {
        SudokuGameManager.Instance.ActivateInputButton(this);
    }

    /// <summary>
    /// 更新单元格内的数字
    /// </summary>
    /// <param name="newValue"></param>
    public void UpdateValue(int newValue)
    {
        value = newValue;

        if (value != 0)
        {
            txtNumber.text = value.ToString();
        }
        else
        {
            txtNumber.text = "";
        }
    }
}

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

/// <summary>
/// 数独游戏的管理器
/// </summary>
public class SudokuGameManager : MonoBehaviour
{
    public static int girdLength = 9;// 网格的宽高
    public static int subGirdLength = 3;// 子网格的宽高
    // 子网格中 Cell的宽高
    public static int cellLength = SudokuGameManager.girdLength / SudokuGameManager.subGirdLength;
    
    public SudokuCell SudokuCell_Prefab; // 单元格的预制体
    
    // get; private set; 的写法是一种语法糖,表示这个值别的类可以读取和使用,但只有自己才能设置它
    public static SudokuGameManager Instance { get; private set; }
    
    public MainMenuPanel mainMenu;// 主界面相关逻辑
    public SudokuPlayPanel sudokuPlay; // 数独的游戏界面
    
    // 按照9X9的格子来算,一共是81个有效数字,如果已知的数字越多,那么未知的数字就越好推导
    // 所以难度的表达方式就是,设定一个数字,在数独创建完成之后,隐藏掉这些数字来增加难度
    public int difficulty = 20; // 默认的难度值
    
    public Image ipButtonsPanel; // 游戏输入按钮

    public List<Button>btnNums = new List<Button>(); // 数字输入

    // 记录上一次点击的格子 以便数字进行输入
    SudokuCell lastCell;
    
    private void Awake()
    {
        //单例模式
        Instance = this;
        for (int i = 0; i < btnNums.Count; i++)
        {
                       
            // 需要将i的地址传递出来 
            int index = i;
            // 为当前遍历到的按钮添加点击监听器
            // 当按钮被点击时,调用OnNumBtnClicked方法,并将index(即按钮的索引)作为参数传递
            btnNums[i].onClick.AddListener(delegate(){ OnNumBtnClicked(index);});
        }
    }

    private void Start()
    {
        // 程序启动的时候,默认显示开始界面
        OnBackToMenu();
    }
    
    // 返回到开始菜单
    public void OnBackToMenu()
    {
        // 程序启动的时候,默认显示开始界面
        mainMenu.gameObject.SetActive(true);
        sudokuPlay.gameObject.SetActive(false);
        
        // 执行游戏清理
        sudokuPlay.Clear();
    }
    
    // 开始游戏
    public void OnPlayNewGame()
    {
        // 隐藏开始界面 显示游戏界面
        mainMenu.gameObject.SetActive(false);
        sudokuPlay.gameObject.SetActive(true);
        
        // 隐藏数字输入面板
        ipButtonsPanel.gameObject.SetActive(false);
        
        // 执行游戏初始化
        sudokuPlay.Init();
    }
    
    /// <summary>
    /// 将当前的数字输入和指定的Cell进行绑定
    /// </summary>
    /// <param name="cell"></param>
    public void ActivateInputButton(SudokuCell cell)
    {
        ipButtonsPanel.gameObject.SetActive(true);
        lastCell = cell;
    }
    
    /// <summary>
    /// 点击了某个数字按钮
    /// </summary>
    /// <param name="num"></param>
    public void OnNumBtnClicked(int num)
    {
        // 更新上一次选中的格子的数值为当前被点击的数字按钮的值
        lastCell.UpdateValue(num);
        // 在数独游戏的逻辑板上更新相应的格子数值,使用lastCell的坐标和被点击的数字
        sudokuPlay.board.UpdatePuzzle(lastCell.coordinate.x, lastCell.coordinate.y, num);
        // 隐藏数字输入面板
        ipButtonsPanel.gameObject.SetActive(false);
    }
    
}

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 数独的大网格
/// </summary>
public class SudokuGrid : MonoBehaviour
{
    // 所有的子网格 需要处理成二维数组
    public SudokuSubGrid[,] subGrids { get; private set; }// 子网格
    public SudokuCell[] cells;// 所有的单元格
    
    void Awake()
    {
        // 获取所有子网格体
        var grid = GetComponentsInChildren<SudokuSubGrid>();
        
        // 建立子网格的二维数组
        subGrids = new SudokuSubGrid[SudokuGameManager.subGirdLength, SudokuGameManager.subGirdLength];
        
        // 通过循环将二维数组分配到指定位置
        int index = 0;
        for (int i = 0; i < SudokuGameManager.subGirdLength; i++)
        {
            for (int j = 0; j < SudokuGameManager.subGirdLength; j++)
            {
                subGrids[i, j] = grid[index++];
                subGrids[i, j].SetCoordinate(i,j);// 设置坐标
                subGrids[i, j].InitCells();// 初始化网格
            }
        }
        cells = GetComponentsInChildren<SudokuCell>();
    }
    
    /// <summary>
    /// 根据坐标获取Cell
    /// </summary>
    /// <param name="row"></param>
    /// <param name="col"></param>
    /// <returns></returns>
    public SudokuCell GetCellByPosition(int row,int col)
    {
        foreach (var cell in cells)
        {
            if (cell.coordinate.x == row && cell.coordinate.y == col)
            {
                return cell;
            }
        }

        return null;
    }
    
    
}

using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.PlayerLoop;
using UnityEngine.Serialization;
using UnityEngine.UI;

public class SudokuPlayPanel : MonoBehaviour
{
    public Button btnBackToMenu;// 返回主界面按钮
    public Button btnBackToMenuInWinPanel;// 获胜面板上的返回主界面按钮
    public Button btnNewLevel;// 新建一个关卡
    public Button btnReplay; // 重新开始本次关卡
    public Button btnComplete; // 完成关卡
    public TextMeshProUGUI txtWrongTips; // 结果错误提示
    public Image imgWinPanel; // 获胜界面
    public TextMeshProUGUI txtTimer;// 计时器
    float levelStartTime = 0f; // 关卡开始的时间,用于计时器的计算

    public SudokuBoard board;// 游戏核心逻辑
    
    private void Awake()
    {
        // 返回主菜单
        btnBackToMenu.onClick.AddListener(OnBtnBackToMenuClicked);
        btnBackToMenuInWinPanel.onClick.AddListener(OnBtnBackToMenuClicked);
        
        // 新建关卡
        btnNewLevel.onClick.AddListener(OnBtnNewClicked);
        
        // 重新开始本关卡
        btnReplay.onClick.AddListener(OnbtnReplayClicked);
        
        // 完成关卡
        btnComplete.onClick.AddListener(OnbtnCompleteClicked);
    }
    
    private void Update()
    {
        // 计时器
        CountTimer();
    }
    
    /// <summary>
    /// 初始化游戏
    /// </summary>
    public void Init()
    {
        // 隐藏错误提示
        txtWrongTips.gameObject.SetActive(false);
        
        // 隐藏获胜面板
        imgWinPanel.gameObject.SetActive(false);
        
        // 记录当前的时间戳
        levelStartTime = Time.realtimeSinceStartup;
        
        // 核心逻辑初始化
        board.Init();
    }


    public void Clear()
    {
        levelStartTime = 0;// 清除计时器开始时间
        
        // 核心逻辑清理
        board.Clear();
    }
    
    /// <summary>
    /// 计时器逻辑
    /// </summary>
    void CountTimer()
    {
        float t = Time.realtimeSinceStartup - levelStartTime;
        int seconds = (int)(t % 60);
        t /= 60;
        int minutes = (int)(t % 60);

        txtTimer.text = string.Format("{0}:{1}", minutes.ToString("00"), seconds.ToString("00"));
    }
    
    /// <summary>
    /// 返回主菜单
    /// </summary>
    public void OnBtnBackToMenuClicked()
    {
        // 清理游戏
        Clear();
        
        // 返回主菜单
        SudokuGameManager.Instance.OnBackToMenu();
    }
    
    /// <summary>
    /// 开始新关卡
    /// </summary>
    public void OnBtnNewClicked()
    {
        // 先清理再初始化
        Clear();
        Init();
    }
    
    /// <summary>
    /// 重玩本关卡
    /// </summary>
    public void OnbtnReplayClicked()
    {
        // 调用核心逻辑的重玩本局
        board.RestartGame();
    }
    
    /// <summary>
    /// 完成游戏
    /// </summary>
    public void OnbtnCompleteClicked()
    {
        // 检查是否完成游戏
        if (board.CheckComplete())
        {
            imgWinPanel.gameObject.SetActive(true);
        }
        else
        {
            txtWrongTips.gameObject.SetActive(true);
            // 3秒后 错误提示消失
            StartCoroutine(HideWrongText());
        }
    }

    IEnumerator HideWrongText()
    {
        yield return new WaitForSeconds(3.0f);
        txtWrongTips.gameObject.SetActive(false);
    }
    
}

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

/// <summary>
/// 大网格下的小网格
/// </summary>
public class SudokuSubGrid : MonoBehaviour
{
    public Vector2Int coordinate; //子网格所属的坐标
    public SudokuCell[,] cells { get; private set; }
    
    // 创建所属的单元格
    private void Awake()
    {
        cells = new SudokuCell[SudokuGameManager.cellLength, SudokuGameManager.cellLength];
    }

    // 设置行列坐标
    public void SetCoordinate(int row, int col)
    {
        coordinate = new Vector2Int(row, col);
    }
    
    // 初始化网格
    public void InitCells()
    {
        for (int i = 0; i < SudokuGameManager.cellLength; i++)
        {
            for (int j = 0; j < SudokuGameManager.cellLength; j++)
            {
                cells[i,j] = Instantiate(SudokuGameManager.Instance.SudokuCell_Prefab,transform);
                cells[i,j].SetCoordinate(coordinate.x * SudokuGameManager.cellLength + i,coordinate.y * SudokuGameManager.cellLength +j);
                cells[i,j].SetSubGridParent(this);
                cells[i,j].InitValues(1);
            }
        }
        
        
       
        
       
       
    }
    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1825754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

省去烦恼!轻松实现一台电脑登录多个微信号的秘诀揭秘!

你知道如何在同一台电脑上登录多个微信号&#xff0c;并实现聚合聊天吗&#xff1f; 今天&#xff0c;我将分享一个多微管理神器——个微管理系统&#xff0c;帮助你解决这一问题&#xff01; 1、多号同时登录&#xff0c;聚合聊天 无论你有多少个微信号&#xff0c;都可以一…

畅想智能美颜工具的未来:美颜SDK技术详解

美颜SDK作为技术的核心&#xff0c;承载了美颜工具的实现和创新。本篇文章&#xff0c;小编将深入探讨美颜SDK技术的细节。 一、技术原理 美颜SDK是一种软件开发工具包&#xff0c;集成了一系列图像处理算法和技术&#xff0c;旨在实现对照片和视频中人物的实时美化。其主要技…

Hyper-V如何将文件复制到虚拟机?教您3个简单的方法!

需要将文件复制到虚拟机&#xff01; “大家好&#xff0c;有谁知道Hyper-V怎么将文件复制到虚拟机吗&#xff1f;我有一些文件&#xff0c;想要从主机中复制进虚拟机中&#xff0c;但是我不知道该怎么操作&#xff0c;有谁可以帮帮我吗&#xff1f;谢谢。” Hyper-V虚拟机可…

家庭海外仓:优势,挑战以及如何利用海外仓系统提升效率

家庭海外仓凭借其灵活&#xff0c;服务优良的特点&#xff0c;一直受到很多跨境电商企业的欢迎&#xff0c;不过&#xff0c;在当今的市场竞争之下&#xff0c;家庭海外仓也同样面临一些挑战&#xff0c;今天我们就来系统的分析一下家庭海外仓应该如何通过海外仓系统的引入来解…

Web期末复习指南(2w字总结)

前言&#xff1a;本文旨在梳理Web技术常包含的内容&#xff0c;阅读完整篇文章后会对整体有个系统的认知&#xff0c;从前端的HTML到后端的MySql&#xff0c;对于大概试题中可能会涉及的地方都有所分析&#xff0c;通篇提供了许多代码案例&#xff0c;供读者更好的理解。对于一…

Oracle阅读Java帮助文档

进入到Help Center 选择Java 查看Java SE [version]对应版本相关的内容 查看其它版本 查看Java11 javac等相关参数 目录查看java相关命令

能耗分析与远程抄表是什么?

一、引言 在21世纪的数字化时代&#xff0c;能耗分析和远程抄表已成为现代能源管理的重要组成部分。这两项技术不仅提高了能源效率&#xff0c;还为企业和个人提供了更精细的能源使用数据&#xff0c;从而实现更科学的节能减排。 二、能耗分析的深度洞察 能耗分析是通过收集…

一文带你搞清楚AI领域的高频术语!RAG、Agent、知识库、向量数据库、知识图谱、Prompt...都是在讲啥?

随着AI人工智能技术的不断发展&#xff0c;一些领域有关的概念和缩写总是出现在各种文章里&#xff0c;像是Prompt Engineering、Agent 智能体、知识库、向量数据库、RAG 以及知识图谱等等&#xff0c;但是这些技术和概念也的的确确在AI大模型的发展中扮演着至关重要的角色。这…

java:spring【AnnotationMetadata】的简单使用例子

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等待。。。 https://download.csdn.net/download/chenhz2284/89435385 # 项目代码 【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-start…

设计模式-装饰器模式Decorator(结构型)

装饰器模式(Decorator) 装饰器模式是一种结构模式&#xff0c;通过装饰器模式可以在不改变原有类结构的情况下向一个新对象添加新功能&#xff0c;是现有类的包装。 图解 角色 抽象组件&#xff1a;定义组件的抽象方法具体组件&#xff1a;实现组件的抽象方法抽象装饰器&…

设计模式-代理模式Proxy(结构型)

代理模式&#xff08;Proxy&#xff09; 代理模式是一种结构型模式&#xff0c;它可以通过一个类代理另一个类的功能。代理类持有被代理类的引用地址&#xff0c;负责将请求转发给代理类&#xff0c;并且可以在转发前后做一些处理 图解 角色 抽象主题&#xff08;Subject&…

计算机网络(9) TCP超时重传以及滑动窗口流量控制

一.确认机制与流量控制 引用&#xff1a;滑动窗口&#xff0c;TCP的流量控制机制 | 小菜学网络 确认机制 由于 IP 协议缺乏反馈机制&#xff0c;为保证可靠性&#xff0c;TCP 协议规定&#xff1a;当接收方收到一个数据后&#xff0c;必须回复 ACK 给发送方。这样发送方就能得…

Python学习打卡:day04

day4 笔记来源于&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了 目录 day428、while 循环的嵌套应用29、while 循环案例 — 九九乘法表补充知识示例&#xff1a;九九乘法表 30、for 循环基本语法while 和 for 循环对比f…

react 自定义Hook的实现

// 问题&#xff1a;当前组件耦合在一起的不方便复用 // 解决思路&#xff1a;自定义hook// 1。封装use打头的函数 // 2.在函数体内封装我们可复用的逻辑&#xff08;只要是可复用的都行&#xff09; // 3.要把组件中用到的状态&#xff08;变量&#xff09;或者回调return出去…

使用tkinter创建带有图标的菜单栏

使用tkinter创建带有图标的菜单栏 效果代码代码解析创建主窗口加载图标创建菜单栏添加文件菜单添加带图标的菜单项 Tkinter 的默认菜单外观较为简单&#xff0c;可以通过自定义和添加图标&#xff0c;让菜单显示更好看。 效果 代码 import tkinter as tk from tkinter import …

父亲节|“鞋”守一生,致敬那些年父亲的默默付出

父亲节&#xff0c;是一个感谢父亲的节日。普遍认为的日期是每年6月的第三个星期日&#xff0c;在这一天世界上有52个国家和地区在过父亲节。同时注重孝道也是我们中华民族的传统文化。 在岁月的长河中&#xff0c; 父亲如同那坚实的基石&#xff0c; 承载着家庭的重担&#…

N3 中文文本分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊# 前言 前言 前面学习了相关自然语言编码&#xff0c;这周进行相关实战 导入依赖库和设置设备 import torch import torch.nn as nn import torchvision fro…

栈的实现详解

目录 1. 栈1.1 栈的概念及结构1.2 栈的实现方式1.3 栈的应用场景 2. 栈的实现2.1 结构体2.2 初始化2.3 销毁2.4 入栈2.5 出栈2.6 获取栈顶元素2.7 判空2.8 获取个数 3. test主函数4. Stack.c文件5. Stack.h文件6. 运行展示 1. 栈 1.1 栈的概念及结构 栈&#xff1a;一种特殊的…

找不到dll文件如何修复,总结多种dll丢失的修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“缺少DLL文件”。那么&#xff0c;DLL到底是什么呢&#xff1f;为什么计算机会缺失DLL文件&#xff1f;缺失DLL文件会对电脑产生什么具体影响&#xff1f;本文将详细解析这些问题&#xff0…

UC Berkeley简介以及和Stanford的区别与联系

UC Berkeley Source: Google Map 中文版 UC Berkeley&#xff0c;全称University of California, Berkeley&#xff0c;是一所位于美国加利福尼亚州伯克利市的世界知名公立研究型大学。以下是关于UC Berkeley的详细介绍&#xff1a; 学术声誉和排名 学术声誉&#xff1a; U…