汇智学堂-python小游戏(井字游戏之十一)

2.13精简代码
我们在审查我们代码时,发现重复的代码特别多,我们通过定义函数的方法,重构一下我们的代码。下面是我们要做的事情。
1、将重复代码分类。
2、利用循环、函数等精简我们的代码。

精简画棋盘的实现代码如下:

lines=[100,300,500,700]
for i in lines:
canvas.create_line(100,i,700,i)
canvas.create_line(i,100,i,700)

精简落下棋子的代码如下:

for i in range(0,3):
for j in range(0,3):
if event.x>100+i200 and event.x<100+(i+1)200 and event.y<100+(j+1)200
and event.y>100+j
200:
if position[i][j]==0:
canvas.create_oval(100+i
200,100+j
200,100+(i+1)*200,
100+(j+1)*200, fill =colorx )
if colorx==“red”:
position[i][j]=1
else:
position[i][j]=2
else:
tkinter.messagebox.showinfo(‘提示’,“已有棋子了!”)
if redorgreen==1:
redorgreen=0
else:
redorgreen=1
return

精简判断输赢的代码如下:

if (position[0][0]==position[0][1]==position[0][2]==1)
or (position[1][0]==position[1][1]==position[1][2]==1)
or (position[2][0]==position[2][1]==position[2][2]==1)
or (position[0][0]==position[1][0]==position[2][0]==1)
or (position[0][1]==position[1][1]==position[2][1]==1)
or (position[0][2]==position[1][2]==position[2][2]==1)
or (position[0][0]==position[1][1]==position[2][2]==1)
or (position[0][2]==position[1][1]==position[2][0]==1):
tkinter.messagebox.showinfo(‘提示’,“红方获胜”)
overornot=1
if (position[0][0]==position[0][1]==position[0][2]==2)
or (position[1][0]==position[1][1]==position[1][2]==2)
or (position[2][0]==position[2][1]==position[2][2]==2)
or (position[0][0]==position[1][0]==position[2][0]==2)
or (position[0][1]==position[1][1]==position[2][1]==2)
or (position[0][2]==position[1][2]==position[2][2]==2)
or (position[0][0]==position[1][1]==position[2][2]==2)
or (position[0][2]==position[1][1]==position[2][0]==2):
tkinter.messagebox.showinfo(‘提示’,“绿方获胜”)
overornot=1

提示:“\”,解决一行代码太长,分行书写的问题。
我们分析一下棋盘,以便我们理解循环。见下图2-19
汇智学堂-python小游戏(井字游戏之十一)
图2-19

我们应用循环,从分析横坐标、纵坐标的变化规律开始:
横坐标:
100+0200
100+1
200
100+2200
100+3
200
纵坐标:
100+0200
100+1
200
100+2200
100+3
200

我们考虑用循环来实现该功能:
For i in (0,3)
For j in (0,3)
(100+i200, 100+j200)

将代码整合起来,整合后完整代码如下:

#-- coding:GBK --

#-- coding:GBK --

from tkinter import *
import time
import tkinter.messagebox #messagebox

tk = Tk()
tk.title(“雷雷的井字游戏”)
tk.resizable(0, 0)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, width=800, height=800, bd=0, highlightthickness=0)
canvas.pack()
tk.update()
redorgreen=0
colorx=“green”
overornot=0
position = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

#画棋盘
lines=[100,300,500,700]
for i in lines:
canvas.create_line(100,i,700,i)
canvas.create_line(i,100,i,700)
def action(event):
global redorgreen
global colorx
global overornot
if overornot1:
tkinter.messagebox.showinfo(‘提示’,“游戏已结束!”)
return
if event.x<=100 or event.x>=700 or event.y<=100 or event.y>=700:
tkinter.messagebox.showinfo(‘提示’,“请选择正确的落子位置!”)
return
if redorgreen
0:
redorgreen=1
colorx=“red”
else :
redorgreen=0
colorx=“green”
a=100
for i in range(0,3):
for j in range(0,3):
if event.x>100+i200 and event.x<100+(i+1)200 and event.y<100+(j+1)200
and event.y>100+j
200:
if position[i][j]==0:
canvas.create_oval(100+i
200,100+j
200,100+(i+1)*200,
100+(j+1)*200, fill =colorx )
if colorx==“red”:
position[i][j]=1
else:
position[i][j]=2
else:
tkinter.messagebox.showinfo(‘提示’,“已有棋子了!”)
if redorgreen==1:
redorgreen=0
else:
redorgreen=1
return

if (position[0][0]==position[0][1]==position[0][2]==1) \
    or (position[1][0]==position[1][1]==position[1][2]==1) \
    or (position[2][0]==position[2][1]==position[2][2]==1) \
    or (position[0][0]==position[1][0]==position[2][0]==1) \
    or (position[0][1]==position[1][1]==position[2][1]==1) \
    or (position[0][2]==position[1][2]==position[2][2]==1) \
    or (position[0][0]==position[1][1]==position[2][2]==1) \
    or (position[0][2]==position[1][1]==position[2][0]==1):        
    tkinter.messagebox.showinfo('提示',"红方获胜")
    overornot=1

if (position[0][0]==position[0][1]==position[0][2]==2) \
    or (position[1][0]==position[1][1]==position[1][2]==2) \
    or (position[2][0]==position[2][1]==position[2][2]==2) \
    or (position[0][0]==position[1][0]==position[2][0]==2) \
    or (position[0][1]==position[1][1]==position[2][1]==2) \
    or (position[0][2]==position[1][2]==position[2][2]==2) \
    or (position[0][0]==position[1][1]==position[2][2]==2) \
    or (position[0][2]==position[1][1]==position[2][0]==2):        
    tkinter.messagebox.showinfo('提示',"绿方获胜")
    overornot=1

canvas.bind(’’, action)
while 1:
#tk.update_idletasks()
tk.update()
time.sleep(0.01)

运行这段代码,游戏功能正确。见图2-20
汇智学堂-python小游戏(井字游戏之十一)
图2-20