Coder le jeu les tours de Hanoï en moins d’une heure ! avec Unity

YouTube player

Les Tours de Hanoï

Les Tours de Hanoï est un jeu de réflexion mathématique qui consiste à déplacer des disques de tailles différentes d’un piquet à un autre, tout en respectant certaines règles.

Le jeu se compose de trois piquets et d’un certain nombre de disques de tailles différentes empilés sur l’un des piquets, du plus grand en bas au plus petit en haut. L’objectif du jeu est de déplacer tous les disques vers un autre piquet, en utilisant le moins de mouvements possible et en respectant les règles suivantes :

  1. On ne peut déplacer qu’un seul disque à la fois.
  2. On ne peut placer un disque que sur un piquet vide ou sur un disque plus grand que lui-même.
  3. On ne peut pas poser un disque sur un disque plus petit que lui-même.

Les Tours de Hanoï est un jeu de réflexion qui nécessite de la patience et de la logique pour résoudre le puzzle, en trouvant le meilleur ordre de déplacement des disques pour atteindre l’objectif avec le nombre minimum de mouvements. Ce jeu est souvent utilisé comme exercice pour développer la pensée logique et la résolution de problèmes chez les enfants et les adultes.


Testez le jeu :


Voici les scripts du tutoriel :

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class MoveDisk : MonoBehaviour
{
    private Vector3 screenPoint, offset;
    private bool endDrag = false;
    private Vector3 startPosition;
    [SerializeField] GameManager gameManager;

    private void Start()
    {
        Physics.gravity = new Vector3(0f, -50f, 0f);
    }
    private void OnMouseDown()
    {
        if (!canMove()) return;
        startPosition = transform.position;
        endDrag = false;
        DiskIsKinematic(true);
        screenPoint = Camera.main.WorldToScreenPoint(transform.position);
        offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(
            Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
    }

    private void OnMouseDrag()
    {
        if (!canMove()) return;
        Vector3 curScreenPoint = new Vector3(
            Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
        Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint)+ offset;
        transform.position = new Vector3(curPosition.x, curPosition.y, transform.position.z);   
    }

    private void OnMouseUp()
    {
        endDrag = true;
        DiskIsKinematic(false);
    }

    private void DiskIsKinematic(bool enabled)
    {
        foreach (Transform item in transform.parent)
        {
            item.GetComponent<Rigidbody>().isKinematic = enabled;
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        if (!endDrag || !canMove()) return;

        Transform trPicket = other.transform;
        int currentNumber = int.Parse(gameObject.name);

        foreach (Transform item in trPicket)
        {
            if(currentNumber < int.Parse(item.gameObject.name))
            {
                transform.position = startPosition;
                return;
            }
        }

        transform.SetParent(other.transform);
        transform.localPosition = new Vector3(0, transform.localPosition.y, 0);
        gameManager.IsWinner();
    } 

    private bool canMove()
    {
        int currentNumber = int.Parse(gameObject.name);

        foreach (Transform item in transform.parent)
        {
            if(currentNumber < int.Parse(item.gameObject.name))
            {
                return false;
            }
        }
        return true;    
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    public int DiskLevel = 3;
    [SerializeField] List<GameObject> Disks;
    [SerializeField] List<Vector3> DiskPositions;
    [SerializeField] GameObject Picket3;
    [SerializeField] GameObject PanelWin;
    private void Awake()
    {
        foreach (Transform item in transform) 
        { 
            Disks.Add(item.gameObject);
            DiskPositions.Add(item.transform.position);
        }

        StartGame();
    }

    void StartGame()
    {
        int x = 0;
        for (int i = Disks.Count-1; i >=0 ; i--)
        {
            if(x < DiskLevel)
            {
                Disks[i].SetActive(true);
                Disks[i].transform.SetParent(transform, false);
                Disks[i].transform.position = DiskPositions[i];
            }
            else
            {
                Disks[i].SetActive(false);
            }
            x++;
        }
        PanelWin.SetActive(false);
    }

    public void IsWinner()
    {
        if(Picket3.transform.childCount == DiskLevel)
        {
           PanelWin.SetActive(true);
        }
    }

    public void NextLevel()
    {
        DiskLevel++;
        StartGame();
    }

    public void ExitGame()
    {
        Application.Quit();
    }
}
A propos de upln 274 Articles
En informatique le problème se situe souvent entre la chaise et le clavier !

Soyez le premier à commenter

Poster un Commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.