Download src/xo_interface.py from abdelkader-dev/FemtoXO: direct link, hf CLI and curl.
- Browser
- Download file 3.62 kB
-
https://huggingface.co/abdelkader-dev/FemtoXO/resolve/main/src/xo_interface.py
- Command line
-
hf download hf://abdelkader-dev/FemtoXO/src/xo_interface.py
-
curl -L -o xo_interface.py https://huggingface.co/abdelkader-dev/FemtoXO/resolve/main/src/xo_interface.py
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() |