Untitled

 avatar
unknown
python
a month ago
10 kB
2
Indexable
import tkinter as tk
from tkinter import messagebox
import random
#Galip Abay-200303075
#Burak Kırbaş-200303026
class TicTacToe:
    def __init__(self, root, mode, scoreboard):
        self.root = root
        self.root.title("Tic Tac Toe")
        self.mode = mode
        self.current_player = "X"
        self.board = [[None for _ in range(3)] for _ in range(3)]
        self.buttons = [[None for _ in range(3)] for _ in range(3)]
        self.scoreboard = scoreboard
        self.create_scoreboard()
        self.create_board()

    def create_scoreboard(self):
        """Skor tahtasını oluşturmak için kullanılanb fanksiyon."""
        self.score_label = tk.Label(self.root,
                                    text=f"Oyuncu 1 (X): {self.scoreboard['X']} | Oyuncu 2/Yapay Zeka (O): {self.scoreboard['O']} | Beraberlik: {self.scoreboard['draw']}",
                                    font=("Comic Sans MS", 16, "bold"), bg="#222244", fg="cyan")
        self.score_label.grid(row=0, column=0, columnspan=3, sticky="ew")

    def update_scoreboard(self):
        """Skor tabelasını güncellemek için kullanılan kod."""
        self.score_label.config(
            text=f"Oyuncu 1 (X): {self.scoreboard['X']} | Oyuncu 2/Yapay Zeka (O): {self.scoreboard['O']} | Beraberlik: {self.scoreboard['draw']}")

    def create_board(self):
        """Oyunun tahtasını oluşturmak için kullanılan fonksiyon.3x3'lük bir oyun tahtası oluşturmak için for döngüsü kullanıyoruz."""
        for row in range(3):
            for col in range(3):
                button = tk.Button(self.root, text=" ", font=("Courier", 28, "bold"), height=2, width=5,
                                   bg="#1A1A40", fg="white", activebackground="#4040A1",
                                   command=lambda r=row, c=col: self.make_move(r, c))
                button.grid(row=row + 1, column=col, sticky="nsew")
                self.buttons[row][col] = button

        for i in range(3):
            self.root.grid_rowconfigure(i + 1, weight=1)
            self.root.grid_columnconfigure(i, weight=1)

    def make_move(self, row, col):
        """Oyuncunun hamlesini gerçekleştiren fonksiyon."""
        if self.board[row][col] is None:
            self.board[row][col] = self.current_player
            self.buttons[row][col].config(text=self.current_player,
                                          fg="cyan" if self.current_player == "X" else "orange")
            if self.check_winner():
                winner = "Oyuncu 1 (X)" if self.current_player == "X" else (
                    "Yapay Zeka (O)" if self.mode == "PVE" else "Oyuncu 2 (O)")
                messagebox.showinfo("Oyun Sona erdi", f"{winner} kazandı!")
                self.scoreboard[self.current_player] += 1
                self.update_scoreboard()
                self.highlight_winner()
                return
            elif self.is_draw():
                messagebox.showinfo("Oyun Sona erdi!", "Beraberlik!")
                self.scoreboard['draw'] += 1
                self.update_scoreboard()
                self.reset_game()
                return

            if self.mode == "PVE" and self.current_player == "X":
                self.current_player = "O"
                self.ai_move()
            else:
                self.current_player = "O" if self.current_player == "X" else "X"

    def ai_move(self):
        """Yapay zeka hamlesini gerçekleştiren fonksiyon."""
        best_score = float('-inf')
        best_move = None

        # Tüm boş hücreleri deneyerek en iyi hamleyi bul
        for r in range(3):
            for c in range(3):
                if self.board[r][c] is None:
                    self.board[r][c] = "O"
                    score = self.minimax(self.board, 0, False)
                    self.board[r][c] = None
                    if score > best_score:
                        best_score = score
                        best_move = (r, c)

        if best_move:
            r, c = best_move
            self.board[r][c] = "O"
            self.buttons[r][c].config(text="O", fg="orange")

            if self.check_winner():
                messagebox.showinfo("Oyun Sona erdi", "Yapay Zeka (O) kazandı!")
                self.scoreboard["O"] += 1
                self.update_scoreboard()
                self.highlight_winner()
                return
            elif self.is_draw():
                messagebox.showinfo("Oyun Sona erdi!", "Beraberlik!")
                self.scoreboard['draw'] += 1
                self.update_scoreboard()
                self.reset_game()
                return

            self.current_player = "X"

    def minimax(self, board, depth, is_maximizing):
        """Minimax algoritmasını çalıştıran fanksiyon."""
        # O = yapay zeka, X = insan
        winner = self.evaluate_board(board)
        if winner is not None:
            return winner

        if is_maximizing:
            best_score = float('-inf')
            for r in range(3):
                for c in range(3):
                    if board[r][c] is None:
                        board[r][c] = "O"
                        score = self.minimax(board, depth + 1, False)
                        board[r][c] = None
                        best_score = max(best_score, score)
            return best_score
        else:
            best_score = float('inf')
            for r in range(3):
                for c in range(3):
                    if board[r][c] is None:
                        board[r][c] = "X"
                        score = self.minimax(board, depth + 1, True)
                        board[r][c] = None
                        best_score = min(best_score, score)
            return best_score

    def evaluate_board(self, board):
        """Tahtadaki durumu değerlendiren fonksiyon:
        O kazanırsa +1
        X kazanırsa -1
        berabere veya devam ediyorsa 0 veriliyor."""
        # Satır kontrolü
        for i in range(3):
            if board[i][0] == board[i][1] == board[i][2] and board[i][0] is not None:
                return 1 if board[i][0] == "O" else -1

        # Sütun kontrolü
        for i in range(3):
            if board[0][i] == board[1][i] == board[2][i] and board[0][i] is not None:
                return 1 if board[0][i] == "O" else -1

        # Çapraz kontrol
        if board[0][0] == board[1][1] == board[2][2] and board[0][0] is not None:
            return 1 if board[0][0] == "O" else -1
        if board[0][2] == board[1][1] == board[2][0] and board[0][2] is not None:
            return 1 if board[0][2] == "O" else -1

        # Berabere mi?
        if all(board[r][c] is not None for r in range(3) for c in range(3)):
            return 0  # Berabere

        return None

    def check_winner(self):
        """Kazanma durumunu kontrol eden fonkiyon."""
        for i in range(3):
            # Satır kontrolü
            if self.board[i][0] == self.board[i][1] == self.board[i][2] and self.board[i][0] is not None:
                self.winning_line = [(i, 0), (i, 1), (i, 2)]
                return True
            # Sütun kontrolü
            if self.board[0][i] == self.board[1][i] == self.board[2][i] and self.board[0][i] is not None:
                self.winning_line = [(0, i), (1, i), (2, i)]
                return True
        # Çapraz kontrol
        if self.board[0][0] == self.board[1][1] == self.board[2][2] and self.board[0][0] is not None:
            self.winning_line = [(0, 0), (1, 1), (2, 2)]
            return True
        if self.board[0][2] == self.board[1][1] == self.board[2][0] and self.board[0][2] is not None:
            self.winning_line = [(0, 2), (1, 1), (2, 0)]
            return True
        return False

    def highlight_winner(self):
        """Kazanma durumnda kazananın hamlesni vurgulayan fonksiyon(Görsel amaçlı)."""
        for r, c in self.winning_line:
            self.buttons[r][c].config(
                bg="cyan" if self.current_player == "X" else "orange")
        self.root.after(2000, self.reset_game)

    def is_draw(self):
        """Beraberlik durumunu kontrol eden fonkiyon."""
        for row in self.board:
            if None in row:
                return False
        return True

    def reset_game(self):
        """Oyunu sıfırlama fonksiyonu."""
        self.current_player = "X"
        self.board = [[None for _ in range(3)] for _ in range(3)]
        for row in range(3):
            for col in range(3):
                self.buttons[row][col].config(text=" ", bg="#1A1A40")


class MainMenu:
    def __init__(self, root):
        self.root = root
        self.root.title("Tic Tac Toe - Ana Menü")
        self.root.configure(bg="#101020")
        # Beraberlik skoru da ekleniyor
        self.scoreboard = {"X": 0, "O": 0, "draw": 0}
        self.create_menu()

    def create_menu(self):
        """Ana menü oluşturnak için kullanılan fonksiyon.."""
        tk.Label(self.root, text="Tic Tac Toe", font=(
            "Courier", 36, "bold"), bg="#101020", fg="cyan").pack(pady=20)
        tk.Button(self.root, text="Oyuncu vs Oyuncu", font=("Courier", 20), bg="#333366", fg="white",
                  command=self.start_pvp).pack(pady=10)
        tk.Button(self.root, text="Oyuncu vs Yapay Zeka", font=("Courier", 20), bg="#4040A1", fg="white",
                  command=self.start_pve).pack(pady=10)
        tk.Button(self.root, text="Çıkış", font=("Courier", 20), bg="#993333", fg="white",
                  command=self.root.quit).pack(pady=10)

    def start_pvp(self):
        """PvP modunu başlatan fonksiyon."""
        self.root.destroy()
        root = tk.Tk()
        TicTacToe(root, mode="PVP", scoreboard=self.scoreboard)
        root.mainloop()

    def start_pve(self):
        """PvE modunu başlatan fonksiyon"""
        self.root.destroy()
        root = tk.Tk()
        TicTacToe(root, mode="PVE", scoreboard=self.scoreboard)
        root.mainloop()


if __name__ == "__main__":
    root = tk.Tk()
    menu = MainMenu(root)
    root.mainloop()
Leave a Comment