def board_images(data=None, size=1040): if data is None: return 'NG' r = Reversi() r.insert(data) r.create_board_images() r.update_board_images() buf = BytesIO() r.board_images[size].save(buf, 'png') buf.seek(0, 0) return send_file(buf, mimetype='image/png')
def handle_text_message(event): text = event.message.text print(text) if isinstance(event.source, SourceUser): talk_type = 'user' talk_id = event.source.user_id profile = line_bot_api.get_profile(event.source.user_id) display_name = "{}さん".format(profile.display_name) elif isinstance(event.source, SourceGroup): talk_type = 'group' talk_id = event.source.group_id display_name = 'このグループ' elif isinstance(event.source, SourceRoom): talk_type = 'room' talk_id = event.source.room_id display_name = 'このルーム' if text == 'オセロ': message_stack = [] turn = random.randint(1, 2) reversi = Reversi(turn) data = select_from_table(talk_id) if data: r = Reversi() r.insert(data) # reversi.guideを参照したいために (時間の都合上) reversi.guide = r.guide if turn == 2: ai_p = reversi.best(reversi.ai_turn) reversi.put_piece(ai_p, reversi.ai_turn) y, x = divmod(ai_p, 8) ai_putmessage = TextSendMessage( text="{}{}".format(chr(97 + y), x + 1)) message_stack.append(ai_putmessage) putable = reversi.able_to_put() text = your_turn_format.format(display_name, (first_attack) if (turn == 1) else (second_attack)) turn_notice_message = TextSendMessage(text=text) message_stack.append(turn_notice_message) data = reversi.extract() insert_to_table(talk_id, data) print("/boards/{}/{}".format(data, 1040)) imagemap = make_reversi_imagemap(data, putable) message_stack.append(imagemap) try: line_bot_api.reply_message(event.reply_token, message_stack) except Exception as e: print(e.error.details) elif text == 'reload' or text == 'リロード': data = select_from_table(talk_id) reversi = Reversi() reversi.insert(data) putable = reversi.able_to_put() imagemap = make_reversi_imagemap(data, putable) line_bot_api.reply_message(event.reply_token, [imagemap]) elif input_format.match(text): message_stack = [] x, y = text x = ord(x) - 97 # str:[a-h] -> int:[0-7] y = int(y) - 1 # int:[0-7] p = y * 8 + x print(p, talk_id, display_name) data = select_from_table(talk_id) reversi = Reversi() reversi.insert(data) reversi.put_piece(p, reversi.turn) ai_p = reversi.best(reversi.ai_turn) print(ai_p, (reversi.board == 0).sum()) if ai_p == -1: if (reversi.board == 0).sum() != 0: message_stack.append(ai_passmessage) else: reversi.put_piece(ai_p, reversi.ai_turn) y, x = divmod(ai_p, 8) ai_putmessage = TextSendMessage( text="{}{}".format(chr(97 + x), y + 1)) message_stack.append(ai_putmessage) putable = reversi.able_to_put() data = reversi.extract() insert_to_table(talk_id, data) imagemap = make_reversi_imagemap(data, putable) message_stack.append(imagemap) while not reversi.able_to_put() and reversi.able_to_put( reversi.ai_turn): message_stack.append(your_passmessage) ai_p = reversi.best(reversi.ai_turn) reversi.put_piece(ai_p, reversi.ai_turn) y, x = divmod(ai_p, 8) ai_putmessage = TextSendMessage( text="{}{}".format(chr(97 + x), y + 1)) message_stack.append(ai_putmessage) putable = reversi.able_to_put() data = reversi.extract() insert_to_table(talk_id, data) imagemap = make_reversi_imagemap(data, putable) message_stack.append(imagemap) else: if not reversi.able_to_put(): score1 = (reversi.board == 1).sum() score2 = (reversi.board == 2).sum() turn = reversi.turn judge = False draw = False if score1 == score2: draw = True elif (score1 > score2 and turn == 1) or (score2 > score1 and turn == 2): judge = True else: judge = False if draw: finish_message = TextSendMessage( text=draw_format.format(score1, score2)) update_reversi_result(talk_id, 3) else: finish_message = TextSendMessage( text=finish_format.format(score1, score2, ( win_string) if judge else (lose_string))) update_reversi_result(talk_id, 1 if judge else 2) message_stack.append(finish_message) line_bot_api.reply_message(event.reply_token, message_stack) elif text == 'guide on' or text == 'guide off' or text == 'guide switch': data = select_from_table(talk_id) reversi = Reversi() reversi.insert(data) if 'on' in text: reversi.guide = True if 'off' in text: reversi.guide = False if 'switch' in text: reversi.guide = not reversi.guide data = reversi.extract() insert_to_table(talk_id, data) putable = reversi.able_to_put() imagemap = make_reversi_imagemap(data, putable) line_bot_api.reply_message(event.reply_token, [imagemap]) elif text == 'オセロ help' or text == 'オセロ ヘルプ': line_bot_api.reply_message(event.reply_token, [help_message]) elif text == '戦績確認': results = select_reversi_result(talk_id) if results: result_message = TextSendMessage( text="{}の戦績\nwin: {}\nlose: {}\ndraw: {}".format( display_name, *results)) else: result_message = TextSendMessage(text="記録がありません") line_bot_api.reply_message(event.reply_token, [result_message]) elif text == 'myid' or text == 'mid': line_bot_api.reply_message(event.reply_token, TextSendMessage(text=talk_id)) elif text == '@bye': if isinstance(event.source, SourceGroup): line_bot_api.leave_group(event.source.group_id) elif isinstance(event.source, SourceRoom): line_bot_api.leave_room(event.source.room_id) else: line_bot_api.reply_message(event.reply_token, TextSendMessage(text="?")) else: if isinstance(event.source, SourceUser): line_bot_api.reply_message( event.reply_token, TextSendMessage(text=event.message.text))