python tic tac toe 的代码,但需要添加一个可见的记分牌,显示玩家 X 和 O 获胜的次数以及平手次数
python code for tic tac toe, but need to add a visible scoreboard that shows how many times player X and O wins, and how many ties
我需要帮助弄清楚如何在记分牌上清楚地显示玩家 X 获胜的次数、玩家 O 获胜的次数以及平局或平局的次数。这是我正在使用的代码,我只是不知道如何添加记分牌。
我添加了一个 # 说明我的记分牌要去哪里,然后我开始了它,但我认为它不正确并且需要有关整个记分牌的帮助。
from tkinter import *
#screen dimensions
winsize = 500
gridwidth = 2
symbol = winsize/12
symsize = 0.5
#colors of players
player_x = 'black'
player_o = 'gray'
#screen colors
screencolor = 'red'
gridcolor = 'black'
bg_color = 'white'
player_one = 1
sizeof_cell = winsize / 3
screen_title = 0
turn_x = 1
turn_o = 2
gameover = 3
score_x = 0
score_o = 0
zero = 0
X = 1
O = 2
class Game(Tk):
def __init__(self):
Tk.__init__(self)
self.canvas = Canvas(
height=winsize, width=winsize,
bg=bg_color)
self.canvas.pack()
self.bind('<x>', self.exit)
self.canvas.bind('<Button-1>', self.mouse)
self.gamestate = screen_title
self.title_screen()
self.board = [
[zero, zero, zero],
[zero, zero, zero],
[zero, zero, zero]]
#ADD HIGH SCORE
def display_score(score):
score = 0
if score(grid):
score += 1
#creating title screen
def title_screen(self):
self.canvas.delete('all')
self.canvas.create_rectangle(
0, 0,
winsize, winsize,
fill='black',
outline='black')
self.canvas.create_rectangle(
int(winsize/15), int(winsize/15),
int(winsize*14/15), int(winsize*14/15),
width=int(winsize/20),
outline='black')
self.canvas.create_rectangle(
int(winsize/10), int(winsize/10),
int(winsize*9/10), int(winsize*9/10),
fill='black',
outline='black')
#adding names, R number, intructions
self.canvas.create_text(
winsize/2,
winsize/3,
text='TIC TAC TOE', fill='white',
font=('Calibri', int(-winsize/10), 'bold'))
self.canvas.create_text(
winsize/2,
winsize/2,
text='Game By: Yanely Ramos (R11529473)', fill='white',
font=('Arial', int(-winsize/25)))
self.canvas.create_text(
winsize/2,
winsize/1.8,
text='& Maria Tan de Castro (R11512696)', fill='white',
font=('Arial', int(-winsize/25)))
self.canvas.create_text(
winsize/2,
winsize/1.3,
text='Directions: Players take turn putting marks on empty' + '\n' + 'squares first player to get 3 in a row is a winner.' + "\n" + 'If all 9 squares are full and there is no winner, it is a draw.', fill='white',
font=('Times New Roman', int(-winsize/35)))
self.canvas.create_text(
int(winsize/2),
int(winsize/2.5),
text='[Click here to play]', fill='white',
font=('Arial', int(-winsize/25)))
#clicking of the game using the mouse
def mouse(self, event):
x = self.pixel_grid(event.x)
y = self.pixel_grid(event.y)
if self.gamestate == screen_title:
self.new_gameboard()
self.gamestate = player_one
elif (self.gamestate == turn_x and
self.board[y][x] == zero):
self.next_shift(X, x, y)
if self.winner(X):
self.gamestate = gameover
self.gameover_title('X WINS')
elif self.game_draw():
self.gamestate = gameover
self.gameover_title('DRAW')
else:
self.gamestate = turn_o
elif (self.gamestate == turn_o and
self.board[y][x] == zero):
self.next_shift(O, x, y)
if self.winner(O):
self.gamestate = gameover
self.gameover_title('O WINS')
elif self.game_draw():
self.gamestate = gameover
self.gameover_title('DRAW')
else:
self.gamestate = turn_x
elif self.gamestate == gameover:
self.new_gameboard()
self.gamestate = player_one
#starting new game
def new_gameboard(self):
self.canvas.delete('all')
self.board = [
[zero, zero, zero],
[zero, zero, zero],
[zero, zero, zero]]
for n in range(1, 3):
self.canvas.create_line(
sizeof_cell*n, 0,
sizeof_cell*n, winsize,
width=gridwidth, fill=gridcolor)
self.canvas.create_line(
0, sizeof_cell*n,
winsize, sizeof_cell*n,
width=gridwidth, fill=gridcolor)
#what pops up when the game ends
def gameover_title(self, outcome):
self.canvas.delete('all')
if outcome == 'X WINS':
wintext = 'X wins'
wincolor = player_x
elif outcome == 'O WINS':
wintext = 'O wins'
wincolor = player_o
elif outcome == 'DRAW':
wintext = 'Draw'
wincolor = screencolor
self.canvas.create_rectangle(
0, 0,
winsize, winsize,
fill=wincolor, outline='')
self.canvas.create_text(
int(winsize/2), int(winsize/2),
text=wintext, fill='white',
font=('Calibri', int(-winsize/6), 'bold'))
self.canvas.create_text(
int(winsize/2), int(winsize/1.65),
text='[click to play again]', fill='white',
font=('Arial', int(-winsize/25)))
#next players turn
def next_shift(self, player, grid_x, grid_y):
if player == X:
self.drawx(grid_x, grid_y)
self.board[grid_y][grid_x] = X
elif player == O:
self.drawo(grid_x, grid_y)
self.board[grid_y][grid_x] = O
#creating X player
def drawx(self, grid_x, grid_y):
x = self.grid_pixel(grid_x)
y = self.grid_pixel(grid_y)
delta = sizeof_cell/1.5*symsize
self.canvas.create_line(
x-delta, y-delta,
x+delta, y+delta,
width=symbol, fill='red')
self.canvas.create_line(
x+delta, y-delta,
x-delta, y+delta,
width=symbol, fill='red')
#creating O player
def drawo(self, grid_x, grid_y):
x = self.grid_pixel(grid_x)
y = self.grid_pixel(grid_y)
delta = sizeof_cell/1.5*symsize
self.canvas.create_oval(
x-delta, y-delta,
x+delta, y+delta,
width=symbol, outline='black')
#how to win
def winner(self, symbol):
for y in range(3):
if self.board[y] == [symbol, symbol, symbol]:
return True
for x in range(3):
if self.board[0][x] == self.board[1][x] == self.board[2][x] == symbol:
return True
if self.board[0][0] == self.board[1][1] == self.board[2][2] == symbol:
return True
elif self.board[0][2] == self.board[1][1] == self.board[2][0] == symbol:
return True
return False
#if 9 squares fill up, go to draw screen
def game_draw(self):
for row in self.board:
if zero in row:
return False
return True
def grid_pixel(self, grid_coord):
pixel_coord = grid_coord * sizeof_cell + sizeof_cell / 2
return pixel_coord
def pixel_grid(self, pixel_coord):
if pixel_coord >= winsize:
pixel_coord = winsize - 1
grid_coord = int(pixel_coord / sizeof_cell)
return grid_coord
def exit(self, event):
self.destroy()
def main():
root = Game()
root.mainloop()
root.title('TIC TAC TOE')
您可以在 mouse
方法中保存玩家统计数据,并在需要时显示它们。
试试下面的例子
在 Game
初始化方法中添加 self.stats = {'X': 0, 'O': 0, 'DRAW': 0}
。
在 mouse
方法中:
当self.winner(X)
增加X
时(self.stats['X']+=1)
当self.winner(O)
增加O
当self.game_draw()
递增DRAW
在 gameover_title
中添加一个简单的文本,在屏幕上显示统计信息:
self.canvas.create_text(
int(winsize/2), int(winsize-20),
text='X: {X} O: {O} DRAW: {DRAW}'.format(**self.stats),
fill='white',
font=('Arial', int(-winsize/25)))
我需要帮助弄清楚如何在记分牌上清楚地显示玩家 X 获胜的次数、玩家 O 获胜的次数以及平局或平局的次数。这是我正在使用的代码,我只是不知道如何添加记分牌。
我添加了一个 # 说明我的记分牌要去哪里,然后我开始了它,但我认为它不正确并且需要有关整个记分牌的帮助。
from tkinter import *
#screen dimensions
winsize = 500
gridwidth = 2
symbol = winsize/12
symsize = 0.5
#colors of players
player_x = 'black'
player_o = 'gray'
#screen colors
screencolor = 'red'
gridcolor = 'black'
bg_color = 'white'
player_one = 1
sizeof_cell = winsize / 3
screen_title = 0
turn_x = 1
turn_o = 2
gameover = 3
score_x = 0
score_o = 0
zero = 0
X = 1
O = 2
class Game(Tk):
def __init__(self):
Tk.__init__(self)
self.canvas = Canvas(
height=winsize, width=winsize,
bg=bg_color)
self.canvas.pack()
self.bind('<x>', self.exit)
self.canvas.bind('<Button-1>', self.mouse)
self.gamestate = screen_title
self.title_screen()
self.board = [
[zero, zero, zero],
[zero, zero, zero],
[zero, zero, zero]]
#ADD HIGH SCORE
def display_score(score):
score = 0
if score(grid):
score += 1
#creating title screen
def title_screen(self):
self.canvas.delete('all')
self.canvas.create_rectangle(
0, 0,
winsize, winsize,
fill='black',
outline='black')
self.canvas.create_rectangle(
int(winsize/15), int(winsize/15),
int(winsize*14/15), int(winsize*14/15),
width=int(winsize/20),
outline='black')
self.canvas.create_rectangle(
int(winsize/10), int(winsize/10),
int(winsize*9/10), int(winsize*9/10),
fill='black',
outline='black')
#adding names, R number, intructions
self.canvas.create_text(
winsize/2,
winsize/3,
text='TIC TAC TOE', fill='white',
font=('Calibri', int(-winsize/10), 'bold'))
self.canvas.create_text(
winsize/2,
winsize/2,
text='Game By: Yanely Ramos (R11529473)', fill='white',
font=('Arial', int(-winsize/25)))
self.canvas.create_text(
winsize/2,
winsize/1.8,
text='& Maria Tan de Castro (R11512696)', fill='white',
font=('Arial', int(-winsize/25)))
self.canvas.create_text(
winsize/2,
winsize/1.3,
text='Directions: Players take turn putting marks on empty' + '\n' + 'squares first player to get 3 in a row is a winner.' + "\n" + 'If all 9 squares are full and there is no winner, it is a draw.', fill='white',
font=('Times New Roman', int(-winsize/35)))
self.canvas.create_text(
int(winsize/2),
int(winsize/2.5),
text='[Click here to play]', fill='white',
font=('Arial', int(-winsize/25)))
#clicking of the game using the mouse
def mouse(self, event):
x = self.pixel_grid(event.x)
y = self.pixel_grid(event.y)
if self.gamestate == screen_title:
self.new_gameboard()
self.gamestate = player_one
elif (self.gamestate == turn_x and
self.board[y][x] == zero):
self.next_shift(X, x, y)
if self.winner(X):
self.gamestate = gameover
self.gameover_title('X WINS')
elif self.game_draw():
self.gamestate = gameover
self.gameover_title('DRAW')
else:
self.gamestate = turn_o
elif (self.gamestate == turn_o and
self.board[y][x] == zero):
self.next_shift(O, x, y)
if self.winner(O):
self.gamestate = gameover
self.gameover_title('O WINS')
elif self.game_draw():
self.gamestate = gameover
self.gameover_title('DRAW')
else:
self.gamestate = turn_x
elif self.gamestate == gameover:
self.new_gameboard()
self.gamestate = player_one
#starting new game
def new_gameboard(self):
self.canvas.delete('all')
self.board = [
[zero, zero, zero],
[zero, zero, zero],
[zero, zero, zero]]
for n in range(1, 3):
self.canvas.create_line(
sizeof_cell*n, 0,
sizeof_cell*n, winsize,
width=gridwidth, fill=gridcolor)
self.canvas.create_line(
0, sizeof_cell*n,
winsize, sizeof_cell*n,
width=gridwidth, fill=gridcolor)
#what pops up when the game ends
def gameover_title(self, outcome):
self.canvas.delete('all')
if outcome == 'X WINS':
wintext = 'X wins'
wincolor = player_x
elif outcome == 'O WINS':
wintext = 'O wins'
wincolor = player_o
elif outcome == 'DRAW':
wintext = 'Draw'
wincolor = screencolor
self.canvas.create_rectangle(
0, 0,
winsize, winsize,
fill=wincolor, outline='')
self.canvas.create_text(
int(winsize/2), int(winsize/2),
text=wintext, fill='white',
font=('Calibri', int(-winsize/6), 'bold'))
self.canvas.create_text(
int(winsize/2), int(winsize/1.65),
text='[click to play again]', fill='white',
font=('Arial', int(-winsize/25)))
#next players turn
def next_shift(self, player, grid_x, grid_y):
if player == X:
self.drawx(grid_x, grid_y)
self.board[grid_y][grid_x] = X
elif player == O:
self.drawo(grid_x, grid_y)
self.board[grid_y][grid_x] = O
#creating X player
def drawx(self, grid_x, grid_y):
x = self.grid_pixel(grid_x)
y = self.grid_pixel(grid_y)
delta = sizeof_cell/1.5*symsize
self.canvas.create_line(
x-delta, y-delta,
x+delta, y+delta,
width=symbol, fill='red')
self.canvas.create_line(
x+delta, y-delta,
x-delta, y+delta,
width=symbol, fill='red')
#creating O player
def drawo(self, grid_x, grid_y):
x = self.grid_pixel(grid_x)
y = self.grid_pixel(grid_y)
delta = sizeof_cell/1.5*symsize
self.canvas.create_oval(
x-delta, y-delta,
x+delta, y+delta,
width=symbol, outline='black')
#how to win
def winner(self, symbol):
for y in range(3):
if self.board[y] == [symbol, symbol, symbol]:
return True
for x in range(3):
if self.board[0][x] == self.board[1][x] == self.board[2][x] == symbol:
return True
if self.board[0][0] == self.board[1][1] == self.board[2][2] == symbol:
return True
elif self.board[0][2] == self.board[1][1] == self.board[2][0] == symbol:
return True
return False
#if 9 squares fill up, go to draw screen
def game_draw(self):
for row in self.board:
if zero in row:
return False
return True
def grid_pixel(self, grid_coord):
pixel_coord = grid_coord * sizeof_cell + sizeof_cell / 2
return pixel_coord
def pixel_grid(self, pixel_coord):
if pixel_coord >= winsize:
pixel_coord = winsize - 1
grid_coord = int(pixel_coord / sizeof_cell)
return grid_coord
def exit(self, event):
self.destroy()
def main():
root = Game()
root.mainloop()
root.title('TIC TAC TOE')
您可以在 mouse
方法中保存玩家统计数据,并在需要时显示它们。
试试下面的例子
在 Game
初始化方法中添加 self.stats = {'X': 0, 'O': 0, 'DRAW': 0}
。
在 mouse
方法中:
当self.winner(X)
增加X
时(self.stats['X']+=1)
当self.winner(O)
增加O
当self.game_draw()
递增DRAW
在 gameover_title
中添加一个简单的文本,在屏幕上显示统计信息:
self.canvas.create_text(
int(winsize/2), int(winsize-20),
text='X: {X} O: {O} DRAW: {DRAW}'.format(**self.stats),
fill='white',
font=('Arial', int(-winsize/25)))