forked from USPCodeLabSanca/onboarding_tic-tac-toe_bot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgame.py
120 lines (98 loc) · 4.1 KB
/
game.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import telegram as t
import telegram.ext as tex
import logging
from tictactoe import TicTacToe
IKB = t.InlineKeyboardButton
IKM = t.InlineKeyboardMarkup
# Função inicial do jogo
def start(update: t.Update, context: tex.CallbackContext):
context.user_data['tictactoe'] = TicTacToe()
# Zera o número de rounds jogados
context.user_data['rounds'] = 0
# Cria o teclado
context.user_data['keyboard'] = [
[IKB(' ', callback_data='0,0'), IKB(' ', callback_data='0,1'), IKB(' ', callback_data='0,2')],
[IKB(' ', callback_data='1,0'), IKB(' ', callback_data='1,1'), IKB(' ', callback_data='1,2')],
[IKB(' ', callback_data='2,0'), IKB(' ', callback_data='2,1'), IKB(' ', callback_data='2,2')]
]
keyboard = context.user_data['keyboard']
rounds = context.user_data['rounds']
tictactoe = context.user_data['tictactoe']
# Define a vez de quem vai jogar
if rounds % 2 == 0:
simbolo = '❌'
simbolo_ascii = 'x'
else:
simbolo = '⭕️'
simbolo_ascii = 'o'
tictactoe.set_symbol(simbolo_ascii, simbolo)
# Atualiza o context contendo o símbolo do round atual
context.user_data['simbolo'] = simbolo
context.user_data['simbolo_ascii'] = simbolo_ascii
# Mostra a mensagem inicial
update.message.reply_text("O jogo vai começar!")
# Mostra o teclado do jogo com o símbolo de quem começará a jogar
update.message.reply_text(f"Selecione uma posição (seu símbolo é {simbolo})", reply_markup=IKM(keyboard))
return 'ROUND'
# Loop do jogo
def round(update: t.Update, context: tex.CallbackContext):
#Aumenta o contador de rounds
context.user_data['rounds'] = context.user_data['rounds'] + 1
rounds = context.user_data['rounds']
keyboard = context.user_data['keyboard']
simbolo = context.user_data['simbolo']
simbolo_ascii = context.user_data['simbolo_ascii']
tictactoe = context.user_data['tictactoe']
# Aguarda a resposta
update.callback_query.answer()
# Recebe as coordenadas do botão pressionado
data = update.callback_query.data
x, y = [ int(s) for s in data.split(',') ]
# Caso o botão já tenha sido selecionado, mostrar mensagem de erro
try:
result = tictactoe.update_game(x, y, simbolo_ascii)
keyboard[x][y] = IKB(simbolo, callback_data=data) #(x,y)
except Exception as e:
update.callback_query.message.edit_text(str(e) + f"\nSelecione uma posição (seu símbolo é {simbolo})")
update.callback_query.message.edit_reply_markup(IKM(keyboard))
context.user_data['rounds'] = context.user_data['rounds'] - 1
return 'ROUND'
# Define a "vez" de quem vai jogar
if rounds % 2 == 0:
simbolo = '❌'
simbolo_ascii = 'x'
else:
simbolo = '⭕️'
simbolo_ascii = 'o'
# Atualiza o context contendo o símbolo do round atual
context.user_data['simbolo'] = simbolo
context.user_data['simbolo_ascii'] = simbolo_ascii
# Atualiza a mensagem contendo o símbolo (de quem é a vez)
update.callback_query.message.edit_text(f"Selecione uma posição (seu símbolo é {simbolo})")
# Mostra o teclado do jogo
update.callback_query.message.edit_reply_markup(IKM(keyboard))
if result != None:
update.callback_query.message.reply_text(result)
return tex.ConversationHandler.END
return 'ROUND'
def main():
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s")
updater = tex.Updater(token='1611542237:AAGPMlkeNxp3geL0urxsSsBncnOBROjctsg')
dp = updater.dispatcher
# Handler do jogo
game_handler = tex.ConversationHandler(
entry_points=[tex.CommandHandler('start', start)],
states={
'ROUND': [tex.CallbackQueryHandler(round)]
},
fallbacks=[tex.CommandHandler('start', start)]
)
dp.add_handler(game_handler)
updater.start_polling()
logging.info("=== Bot running! ===")
updater.idle()
logging.info("=== Bot shutting down! ===")
if __name__ == "__main__":
main()