Chào mừng bạn đến với Codereview!
Bạn đã bỏ lỡ một cơ hội oo.
Bạn có một class Player
nhưng bạn vẫn đang "bật dữ liệu nội bộ". Bạn làm điều này:
def get_player_input[choices, text='']:
...
đó không phải là một phương pháp trên Player
. Và sau đó, bạn làm điều này:
if player.is_human:
row = int[get_player_input[options, "Enter row number[1-3]: "]] - 1
colmn = int[get_player_input[options, "Enter column number[1-3]: "]] - 1
else:
row, colmn = randint[0, 2], randint[0, 2]
Hành động viết if player.is_human: ... else: ...
này là "chuyển đổi dữ liệu nội bộ". Đó là "dữ liệu nội bộ" vì bạn không nhận được nó từ bên ngoài lớp. Đó là "chuyển đổi" vì bạn đang đưa ra một lựa chọn độc quyền.
Bật dữ liệu nội bộ là "mùi mã" cho thấy bạn có thể cần một lớp mới. Trong trường hợp này, tôi nghĩ bạn làm:
from abc import ABC, abstractmethod
class Player[ABC]:
@abstractmethod
def get_next_move[self, board: Board] -> Position:
...
class PlayerIO[Player]:
def get_next_move[self, board: Board] -> Position:
""" Read next move from io streams """
pass
class PlayerRandom[Player]:
def get_next_move[self, board: Board] -> Position:
""" Randomly generate next move """
pass
Tôi sẽ đề xuất rằng hàm tạo IO lấy các luồng đầu vào và đầu ra, và xử lý hiển thị bảng và nhắc nhở cho một bước đi mới.
Tôi cũng sẽ đề nghị bạn viết một lớp Textio thuộc loại nào đó và đưa ra các phương thức như "Lời nhắc cho đầu vào" và "Đọc một chuỗi" và "Đọc một số nguyên". Tập hợp các hoạt động cơ bản này có thể là các khối xây dựng cho lớp PlayerIO
của bạn và sẽ có thể tạo một đối tượng giả để kiểm tra đơn vị.
Thêm khu vực chơi và nhãn có văn bản "Tic Tac Toe" ..
Làm cho GUI chức năng .. | |
Thực hiện logic để phát hiện chiến thắng .. | |
Phát hiện vẽ .. | |
Nhãn tình trạng .. | |
Hiển thị lượt của ai .. | |
Tạo nút phát lại .. | |
Tệp này chứa văn bản unicode hai chiều có thể được giải thích hoặc biên dịch khác với những gì xuất hiện dưới đây. Để xem xét, hãy mở tệp trong một trình soạn thảo cho thấy các ký tự Unicode ẩn. Tìm hiểu thêm về các ký tự unicode hai chiều | |
Nhập Tkinter dưới dạng TK | |
Nhập Tkinter.MessageBox | |
root = tk.tk [] | |
#tk.title ['tic tac toe game'] | |
#game board để giữ dữ liệu | |
game_board = ["-", "-", "-", | |
"-", "-", "-", | |
"-", "-", "-"] | |
# biết nếu trò chơi kết thúc | |
game_still_on = true | |
người chiến thắng = không có | |
# người chơi hiện tại | |
current_player = "x" | |
# Chơi game | |
def play_game []: | |
# Hiển thị bảng trò chơi | |
display_game_board [] | |
Trong khi game_still_on: | |
# Xử lý một lượt | |
tay cầm_turn [current_player] | |
# Kiểm tra xem trò chơi có kết thúc không | |
Check_if_game_over [] | |
# Lật sang người chơi khác | |
flip_player [] | |
# In người chiến thắng hoặc cà vạt | |
Nếu người chiến thắng == "x" hoặc người chiến thắng == "o": | |
In ["Xin chúc mừng" + người chiến thắng + "You Won!"] | |
Nếu người chiến thắng == "x" hoặc người chiến thắng == "o": | |
In ["Xin chúc mừng" + người chiến thắng + "You Won!"] | |
flip_player [] | |
# In người chiến thắng hoặc cà vạt | |
Nếu người chiến thắng == "x" hoặc người chiến thắng == "o": | |
In ["Xin chúc mừng" + người chiến thắng + "You Won!"] | |
Elif Winner == Không có: | |
in ["Draw Draw."] | |
DEF DEALT_GAME_BOARD []: | |
in ["\ n"] | |
PRIN | |
in["---------"] | |
in [game_board [3] + "|" + game_board [4] + "|" + game_board [5] + "4 | 5 | 6"] | |
In [Game_board [6] + "|" + Game_board [7] + "|" + Game_board [8] + "7 | 8 | 9"] | |
def tay cầm_turn [người chơi]: | |
# điểm đầu vào từ người chơi | |
In [người chơi + "của lượt."] | |
# biết nếu trò chơi kết thúc | |
game_still_on = true | |
người chiến thắng = không có | |
# người chơi hiện tại | |
current_player = "x" | |
# Chơi game | |
def play_game []: | |
# Hiển thị bảng trò chơi | |
display_game_board [] | |
Trong khi game_still_on: | |
# Xử lý một lượt | |
tay cầm_turn [current_player] | |
# Kiểm tra xem trò chơi có kết thúc không | |
Check_if_game_over [] | |
# Lật sang người chơi khác | |
flip_player [] | |
# In người chiến thắng hoặc cà vạt | |
Nếu người chiến thắng == "x" hoặc người chiến thắng == "o": | |
In ["Xin chúc mừng" + người chiến thắng + "You Won!"] | |
khác: | |
Elif Winner == Không có: | |
in ["Draw Draw."] | |
Game_Still_on toàn cầu | |
DEF DEALT_GAME_BOARD []: | |
in ["\ n"] | |
PRIN | |
in["---------"] | |
game_still_on = Sai | |
in [game_board [3] + "|" + game_board [4] + "|" + game_board [5] + "4 | 5 | 6"] | |
In [Game_board [6] + "|" + Game_board [7] + "|" + Game_board [8] + "7 | 8 | 9"] | |
def tay cầm_turn [người chơi]: | |
# điểm đầu vào từ người chơi | |
In [người chơi + "của lượt."] | |
spot = input ["Chọn một điểm từ 1-9:"] | |
hợp lệ = sai | |
khác: | |
trả lại không | |
Trong khi không hợp lệ: | |
Game_Still_on toàn cầu | |
trong khi điểm không ở ["1", "2", "3", "4", "5", "6", "7", "8", "9"]: | |
spot = input ["hey! Chọn một điểm từ 1-9:"] | |
spot = int [điểm] - 1 | |
Nếu game_board [spot] == "-": | |
game_still_on = Sai | |
hợp lệ = true | |
khác: | |
def tay cầm_turn [người chơi]: | |
# điểm đầu vào từ người chơi | |
In [người chơi + "của lượt."] | |
spot = input ["Chọn một điểm từ 1-9:"] | |
trả lại game_board [2] | |
khác: | |
trả lại không | |
hợp lệ = sai | |
Game_Still_on toàn cầu | |
Trong khi không hợp lệ: | |
trong khi điểm không ở ["1", "2", "3", "4", "5", "6", "7", "8", "9"]: | |
spot = input ["hey! Chọn một điểm từ 1-9:"] | |
game_still_on = Sai | |
# Trả lại người chiến thắng | |
Nếu chéo_1: | |
trả lại game_board [0] | |
elif chéo_2: | |
trả lại game_board [2] | |
khác: | |
trả lại không | |
#Kiểm tra cà vạt | |
Def Check_for_tie []: | |
Game_Still_on toàn cầu | |
Nếu "-" Không có trong game_board: | |
game_still_on = Sai | |
trả về đúng | |
khác: | |
trả lại không | |
#Kiểm tra cà vạt | |
Def Check_for_tie []: | |
Game_Still_on toàn cầu | |
Nếu "-" Không có trong game_board: | |
game_still_on = Sai | |
trả về đúng | |
trả lại sai | |
# Lật người chơi hiện tại | |
def flip_player []: | |
Toàn cầu current_player |