Bladeren bron

Загрузить файлы 'ОАиП/2024-25/36гр/Жданов'

u22zhdanov 1 week geleden
bovenliggende
commit
e43b265314

+ 264 - 0
ОАиП/2024-25/36гр/Жданов/0х.py

@@ -0,0 +1,264 @@
+import telebot
+import random
+import os
+
+TOKEN = "7030023448:AAFRdU_uwxpgT0K-mYy_UtohgkRnhpjE3IM"
+bot = telebot.TeleBot(TOKEN)
+
+DATABASE_FILE = "users.txt"
+
+EMPTY = "⬜"
+CROSS = "❌"
+CIRCLE = "⭕"
+
+def register_user(chat_id):
+    with open(DATABASE_FILE, "a") as f:
+        f.write(f"{chat_id},0,0\n")  
+    print(f"User {chat_id} registered.")
+
+
+def get_user_data(chat_id):
+    with open(DATABASE_FILE, "r") as f:
+        for line in f:
+            data = line.strip().split(",")
+            if int(data[0]) == chat_id:
+                return {
+                    "chat_id": int(data[0]),
+                    "win_bot": int(data[1]),
+                    "balance": int(data[2])
+                }
+    return None
+
+
+def update_user_data(chat_id, win_bot=None, balance=None):
+    lines = []
+    with open(DATABASE_FILE, "r") as f:
+        for line in f:
+            data = line.strip().split(",")
+            if int(data[0]) == chat_id:
+                if win_bot is not None:
+                    data[1] = str(win_bot)
+                if balance is not None:
+                    data[2] = str(balance)
+            lines.append(",".join(data) + "\n")
+
+    with open(DATABASE_FILE, "w") as f:
+        f.writelines(lines)
+    print(f"User {chat_id} data updated.")
+
+# --- Игровые функции ---
+def create_board():
+    return [EMPTY] * 9
+
+def print_board(board):
+    row1 = board[0:3]
+    row2 = board[3:6]
+    row3 = board[6:9]
+
+    return f'{row1[0]}{row1[1]}{row1[2]}\n{row2[0]}{row2[1]}{row2[2]}\n{row3[0]}{row3[1]}{row3[2]}'
+
+def check_winner(board, player):
+    # Проверка строк, столбцов и диагоналей
+    for i in range(0, 9, 3):
+        if board[i] == board[i+1] == board[i+2] == player:
+            return True
+    for i in range(3):
+        if board[i] == board[i+3] == board[i+6] == player:
+            return True
+    if board[0] == board[4] == board[8] == player:
+        return True
+    if board[2] == board[4] == board[6] == player:
+        return True
+    return False
+
+def is_board_full(board):
+    return EMPTY not in board
+
+def bot_move(board):
+    # 1. Проверка возможности выигрыша для бота
+    for i in range(9):
+        if board[i] == EMPTY:
+            temp_board = board[:]
+            temp_board[i] = CIRCLE
+            if check_winner(temp_board, CIRCLE):
+                return i
+
+    # 2. Проверка возможности выигрыша для игрока и блокировка
+    for i in range(9):
+        if board[i] == EMPTY:
+            temp_board = board[:]
+            temp_board[i] = CROSS
+            if check_winner(temp_board, CROSS):
+                return i
+
+    # 3. Выбор случайной пустой клетки (стратегически)
+    corners = [0, 2, 6, 8]
+    available_corners = [i for i in corners if board[i] == EMPTY]
+    if available_corners:
+        return random.choice(available_corners)
+
+    center = 4
+    if board[center] == EMPTY:
+        return center
+
+    edges = [1, 3, 5, 7]
+    available_edges = [i for i in edges if board[i] == EMPTY]
+    if available_edges:
+        return random.choice(available_edges)
+
+    return None  # Доска заполнена, и нет доступных ходов
+
+def create_board_markup(board):
+    markup = telebot.types.InlineKeyboardMarkup(row_width=3)
+    buttons = []
+    for i in range(9):
+        buttons.append(telebot.types.InlineKeyboardButton(board[i], callback_data=f"move_{i}"))
+    markup.add(*buttons)
+    return markup
+
+# --- Обработчики ---
+@bot.message_handler(commands=["start"])
+def start(message):
+    chat_id = message.chat.id
+    user_data = get_user_data(chat_id)
+
+    if user_data is None:
+        register_user(chat_id)
+        bot.send_message(chat_id, "Вы успешно зарегистрированы!")
+
+    markup = telebot.types.InlineKeyboardMarkup(row_width=2)
+    item_profile = telebot.types.InlineKeyboardButton("Профиль", callback_data="profile")
+    item_play = telebot.types.InlineKeyboardButton("Играть", callback_data="play")
+    markup.add(item_profile, item_play)
+
+    with open("zastavka.jpg", "rb") as photo:
+        bot.send_photo(chat_id, photo, caption="Выберите действие:", reply_markup=markup)
+
+# Обработчик inline кнопок
+@bot.callback_query_handler(func=lambda call: True)
+def callback_inline(call):
+    chat_id = call.message.chat.id
+    message_id = call.message.message_id
+
+    if call.data == "profile":
+        bot.delete_message(chat_id, message_id)
+        show_profile(chat_id)
+
+    elif call.data == "play":
+        bot.delete_message(chat_id, message_id)
+        start_game(chat_id)
+
+    elif call.data.startswith("move_"):
+        handle_move(call)
+
+    else:
+        pass
+
+def handle_move(call):
+    chat_id = call.message.chat.id
+    message_id = call.message.message_id
+    move = int(call.data.split("_")[1])
+
+    game_data = games.get(chat_id)
+    if not game_data:
+        bot.send_message(chat_id, "Игра не найдена.")
+        return
+
+    board = game_data["board"]
+
+    if board[move] != EMPTY:
+        bot.send_message(chat_id, "Эта клетка уже занята!")
+        return
+
+    # Ход человека
+    board[move] = CROSS
+    if check_winner(board, CROSS):
+        user_data = get_user_data(chat_id)
+        if user_data:
+            update_user_data(chat_id, win_bot=int(user_data["win_bot"]) + 1, balance=int(user_data["balance"]) + 10)
+            with open("pobeda.jpg", "rb") as photo:
+                bot.send_photo(chat_id, photo, caption="Вы выйграли!\n+10 монет")
+        bot.delete_message(chat_id, message_id)
+        del games[chat_id]
+        show_menu(chat_id)
+        return
+
+    if is_board_full(board):
+        with open("niza.jpg", "rb") as photo:
+            bot.send_photo(chat_id, photo, caption="Ничья!")
+        bot.delete_message(chat_id, message_id)
+        del games[chat_id]
+        show_menu(chat_id)
+        return
+
+    # Ход бота
+    bot_choice = bot_move(board)
+    if bot_choice is not None:
+        board[bot_choice] = CIRCLE
+    else:
+        with open("niza.jpg", "rb") as photo:
+            bot.send_photo(chat_id, photo, caption="Ничья!")
+        bot.delete_message(chat_id, message_id)
+        del games[chat_id]
+        show_menu(chat_id)
+        return
+
+    if check_winner(board, CIRCLE):
+        with open("lose.jpg", "rb") as photo:
+            bot.send_photo(chat_id, photo, caption="Вы проиграли!")
+        bot.delete_message(chat_id, message_id)
+        del games[chat_id]
+        show_menu(chat_id)
+        return
+
+    if is_board_full(board):
+        with open("niza.jpg", "rb") as photo:
+            bot.send_photo(chat_id, photo, caption="Ничья!")
+        bot.delete_message(chat_id, message_id)
+        del games[chat_id]
+        show_menu(chat_id)
+        return
+
+    game_data["board"] = board
+    games[chat_id] = game_data
+    bot.delete_message(chat_id, message_id)
+    send_board(chat_id, board)
+
+def show_profile(chat_id):
+    user_data = get_user_data(chat_id)
+
+    if user_data:
+        profile_info = (
+            f"Имя аккаунта: {chat_id}\n"
+            f"Побед с ботом: {user_data['win_bot']}\n"
+            f"Баланс: {user_data['balance']} серебра"
+        )
+
+        with open("profil.jpg", "rb") as photo:
+            bot.send_photo(chat_id, photo, caption=profile_info)
+    else:
+        bot.send_message(chat_id, "Произошла ошибка при получении данных профиля.")
+    show_menu(chat_id)
+
+def start_game(chat_id):
+    board = create_board()
+    game_data = {"board": board}
+    games[chat_id] = game_data
+    send_board(chat_id, board)
+
+def send_board(chat_id, board):
+    markup = create_board_markup(board)
+    bot.send_message(chat_id, print_board(board), reply_markup=markup)
+
+def show_menu(chat_id):
+    markup = telebot.types.InlineKeyboardMarkup(row_width=2)
+    item_profile = telebot.types.InlineKeyboardButton("Профиль", callback_data="profile")
+    item_play = telebot.types.InlineKeyboardButton("Играть", callback_data="play")
+    markup.add(item_profile, item_play)
+
+    with open("zastavka.jpg", "rb") as photo:
+        bot.send_photo(chat_id, photo, caption="Выберите действие:", reply_markup=markup)
+
+
+games = {}  
+bot.polling(none_stop=True)

BIN
ОАиП/2024-25/36гр/Жданов/botorpeople.jpg


BIN
ОАиП/2024-25/36гр/Жданов/lose.jpg


BIN
ОАиП/2024-25/36гр/Жданов/niza.jpg


BIN
ОАиП/2024-25/36гр/Жданов/pobeda.jpg


BIN
ОАиП/2024-25/36гр/Жданов/profil.jpg


+ 2 - 0
ОАиП/2024-25/36гр/Жданов/users.txt

@@ -0,0 +1,2 @@
+6474559307,1,29,9,1,85,2,0
+7816930247,2,15,7,0,60,2,0

BIN
ОАиП/2024-25/36гр/Жданов/zastavka.jpg