FemtoXO / src /xo_interface.py
abdelkader-dev's picture
Upload 16 files
b287045 verified
Raw
History Blame Contribute Delete
3.62 kB
"""
play.py - تشغيل نموذج XO المُدرّب للعب ضده.
الاستخدام: python play.py
يتطلب: xo_model/ , xo_tokenizer/ (يتم إنشاؤها بعد train.py)
"""
import torch
from model import load_model # دالة تحميل النموذج
from tokenizer import load_tokenizer # دالة تحميل الـ tokenizer
def display_board(board_str):
"""عرض اللوحة بشكل جميل."""
b = list(board_str)
print("\n")
for i in range(0, 9, 3):
print(" " + " | ".join(b[i:i+3]))
if i < 6:
print("---+---+---")
print()
def check_win(board, player):
"""التحقق من فوز لاعب معين (X أو O)."""
wins = [
(0,1,2), (3,4,5), (6,7,8),
(0,3,6), (1,4,7), (2,5,8),
(0,4,8), (2,4,6)
]
return any(all(board[i] == player for i in combo) for combo in wins)
def model_move(board_str, model, tokenizer):
"""
إعطاء النموذج لوحة وإرجاع رقم الخانة (0-8) التي سيختارها.
"""
inputs = tokenizer(board_str, return_tensors="pt")
with torch.no_grad():
logits = model(**inputs).logits.squeeze()
# إخفاء الخانات الممتلئة
for i, cell in enumerate(board_str):
if cell != '.':
logits[i] = -float('inf')
return torch.argmax(logits).item()
def main():
# تحميل النموذج والـ tokenizer
model = load_model("./xo_model")
tokenizer = load_tokenizer("./xo_tokenizer")
model.eval()
print("\n🎮 مرحباً بك في لعبة XO ضد نموذج Transformer!")
print("أنت (O) | النموذج (X) | النموذج يبدأ\n")
print("ترقيم الخانات:")
print(" 0 | 1 | 2 ")
print("---+---+---")
print(" 3 | 4 | 5 ")
print("---+---+---")
print(" 6 | 7 | 8 \n")
board = '.' * 9
turn = 'X' # النموذج يبدأ
while True:
display_board(board)
if turn == 'X':
print("🤖 النموذج يفكر...")
move = model_move(board, model, tokenizer)
print(f"النموذج اختار الخانة {move}")
else:
# دور اللاعب
while True:
try:
move = int(input("📍 دورك - أدخل رقم الخانة (0-8): "))
if move not in range(9):
print("❌ خارج النطاق! أدخل رقم من 0 إلى 8.")
continue
if board[move] != '.':
print("❌ الخانة مشغولة، اختر خانة فارغة.")
continue
break
except ValueError:
print("❌ أدخل رقماً صحيحاً.")
# تنفيذ الحركة
board_list = list(board)
board_list[move] = turn
board = ''.join(board_list)
# التحقق من نهاية اللعبة
if check_win(board, turn):
display_board(board)
winner = "النموذج" if turn == 'X' else "أنت"
print(f"🏆 {winner} فاز!")
break
if '.' not in board:
display_board(board)
print("🤝 تعادل!")
break
# تبديل الدور
turn = 'O' if turn == 'X' else 'X'
print("\n👋 شكراً للعبك!")
if __name__ == "__main__":
main()