Réaliser un Tic Tac Toe avec Unity – Code source disponible en téléchargement

Dans cette vidéo, je vous propose de réaliser de A à Z un classique, le jeu du morpion, le Tic Tac Toe, vous contre l’ordinateur.

Ce jeu n’est pas forcément facile à coder, c’est pourquoi je vous propose dans cette vidéo de développer ce jeu pas à pas, étape par étape.

La gestion de l’interface est facile à mettre en oeuvre dans Unity grâce à l’ UI. Nous utiliserons un système aléatoire afin de faire jouer l’ordinateur.

Je vous propose si cela vous intéresse ? d’implanter l’ algorithme MiniMax afin d’augmenter la difficulté.

Pour cela like la vidéo (100 likes et je me met sur ce tuto). 

L’algorithme minimax est un algorithme qui s’applique à la théorie des jeux pour les jeux à deux joueurs à somme nulle (et à information complète) consistant à minimiser la perte maximum (c’est-à-dire dans le pire des cas). Pour une vaste famille de jeux, le théorème du minimax de von Neumann assure l’existence d’un tel algorithme, même si dans la pratique il n’est souvent guère aisé de le trouver. Le jeu de hex est un exemple où l’existence d’un tel algorithme est établie et montre que le premier joueur peut toujours gagner, sans pour autant que cette stratégie soit connue.

Il amène l’ordinateur à passer en revue toutes les possibilités pour un nombre limité de coups et à leur assigner une valeur qui prend en compte les bénéfices pour le joueur et pour son adversaire. Le meilleur choix est alors celui qui minimise les pertes du joueur tout en supposant que l’adversaire cherche au contraire à les maximiser (le jeu est à somme nulle).

Il existe différents algorithmes basés sur MinMax permettant d’optimiser la recherche du meilleur coup en limitant le nombre de nœuds visités dans l’arbre de jeu, le plus connu est l’élagage alpha-bêta. En pratique, l’arbre est souvent trop vaste pour pouvoir être intégralement exploré (comme pour le jeu d’échecs ou de go). Seule une fraction de l’arbre est alors explorée

Télécharger le code source TicTacToe

GameManager.cs

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

public class GameManager : MonoBehaviour {

    public string[] matrix = new string[9];
    public List<int> choice = new List<int>();
    public GameObject GameOver;

    private void Start()
    {
        int turn = Random.Range(0, 2);

        if(turn==0)
        {
            ComputerPlay();
        }

    }

    public void ComputerPlay () {

        MajChoice();

        int nr = choice[Random.Range(0, choice.Count)];
        GameObject.Find(nr.ToString()).transform.FindChild("Text").GetComponent<Text>().text="O";
        matrix[nr] = "O";
        GameObject.Find(nr.ToString()).GetComponent<Button>().interactable = false;
               
        if(verification("O"))
        {
            ShowPanel("O");
        }
        else
        {
            MajChoice();
        }
    }

    void MajChoice()
    {
        choice.Clear();

        for (int i=0; i< matrix.Length; i++)
        {
            if(matrix[i]=="")
            {
                choice.Add(i);
            }
        }

        if(choice.Count==0)
        {
            GameOver.SetActive(true);
            GameOver.transform.FindChild("Panel").transform.FindChild("Text").GetComponent<Text>().text = "Match Nul";
            return;
        }
    }
    
    public bool verification(string player)
    {
        if(matrix[0]==player && matrix[1]==player && matrix[2]==player ||
            matrix[3] == player && matrix[4] == player && matrix[5] == player ||
            matrix[6] == player && matrix[7] == player && matrix[8] == player ||

            matrix[0] == player && matrix[4] == player && matrix[8] == player ||
            matrix[2] == player && matrix[4] == player && matrix[6] == player ||

            matrix[0] == player && matrix[3] == player && matrix[6] == player ||
            matrix[1] == player && matrix[4] == player && matrix[7] == player ||
            matrix[2] == player && matrix[5] == player && matrix[8] == player )
        {
            return true;
        }
        else
        {
            return false;
        }
    }
   
    public void ShowPanel(string winner)
    {
        GameOver.SetActive(true);
        GameOver.transform.FindChild("Panel").transform.FindChild("Text").GetComponent<Text>().text = winner + " à gagné";
    }   
}

ButtonScript.cs

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

public class ButtonScript : MonoBehaviour {

    GameManager gmScript;

    private void Start()
    {
        gmScript = GameObject.Find("Canvas").GetComponent<GameManager>();
    }
    public void Select () {

        transform.Find("Text").GetComponent<Text>().text = "X";
        GetComponent<Button>().interactable = false;
        int index = int.Parse(gameObject.name);

       gmScript.matrix[index] = "X";

        if (gmScript.verification("X"))
        {
            gmScript.ShowPanel("X");
        }
        else
        {
            gmScript.ComputerPlay();
        }
    }
}

GameOverScript.cs

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

public class GameOverScript : MonoBehaviour {
    
        void Update () {
        if(Input.GetButtonDown("Fire1"))
        {
            SceneManager.LoadScene(SceneManager.GetActiveScene().name);
        }
    }
}

Seconde Partie – Intelligence Artificielle de l’ordinateur

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.