使用tkinter实现三子棋游戏
本文实例为大家分享了tkinter实现三子棋游戏的具体代码,供大家参考,具体内容如下
整体游戏很简单。下棋,判断胜利或者平局。没有加入电脑下棋的算法。
游戏界面:
代码:
importtkinterastk
fromtkinterimportmessagebox,Label,Button
fromTicTacToeModelimportTicTacToeModel
importrequests
fromPILimportImageTk,Image
fromioimportBytesIO
classTicTacToeGUI:
def__init__(self,root):
#Createthemodelinstance...
self.model=TicTacToeModel()
#Createa2Dlisttoholdanarrayofbuttons...
self.b=[]
forrowinrange(self.model.boardSize):
q=[]
forcolinrange(self.model.boardSize):
q.append(None)
self.b.append(q)
#Youcannowaddressblikea2Dmatrixe.g.b[0][0]
#CreatetheGUI.....
menubar=tk.Menu()
menubar.add_command(label='ResetGame',command=self.resetGUI)
menubar.add_command(label='ResetImage',command=self.resetImg)
menubar.add_command(label='Quit',command=root.destroy)
root.config(menu=menubar)
self.frame1=tk.Frame(root,width=400,height=300,bg="GREY",borderwidth=2)
self.frame2=tk.Frame(root,width=400,height=200,bg="WHITE",borderwidth=2)
self.createGUIAssets()
self.createframe2()
self.frame2.pack()
self.frame1.pack()
messagebox.showinfo("Hello","Humanplayertostart!")
defgetImg(self):
headers={
'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/88.0.4324.104Safari/537.36'
}
#img_src='https://api.ixiaowai.cn/api/api.php'
img_src='https://api.ixiaowai.cn/gqapi/gqapi.php'
response=requests.get(url=img_src,headers=headers)
#print(response)
image=Image.open(BytesIO(response.content))
x,y=image.size
y_s=200
x_s=int(x*y_s/y)
img=image.resize((x_s,y_s),Image.ANTIALIAS)
image=ImageTk.PhotoImage(img)
returnimage
defresetImg(self):
self.image=self.getImg()
self.Label.config(image=self.image)
defcreateframe2(self):
self.image=self.getImg()
self.Label=tk.Label(self.frame2,image=self.image)
self.Label.pack()
#image.show()
defcreateGUIAssets(self):
forxinrange(self.model.boardSize):
self.frame1.columnconfigure(x,pad=20)
self.frame1.grid_rowconfigure(x,pad=20)
forrowinrange(self.model.boardSize):
forcolinrange(self.model.boardSize):
self.b[row][col]=Button(self.frame1,text='',bg='WHITE',
relief='groove',borderwidth=20,
height=3,width=8,
command=lambdarow=row,col=col:self.takeTurn(row,col))
self.b[row][col].grid(row=row,column=col)
deftakeTurn(self,row,col):
ifnotself.model.playSpace(row,col):
return
else:
self.b[row][col].configure(bg="Green")
status=self.model.checkWinStatus()
ifstatus==1:#Playerwin
messagebox.showinfo("Result","Playerwins!!!!")
self.resetGUI()
elifstatus==0:#Draw
messagebox.showinfo("Result","Draw!!!!")
self.resetGUI()
elifstatus==-2:#Ongoing...
(r,c)=self.model.computerTurn()
self.b[r][c].configure(bg='red')
ifself.model.checkWinStatus()==-1:
messagebox.showinfo("Result","Computerwins!!!!")
self.resetGUI()
else:
#Shouldnotgethere...
pass
defresetGUI(self):
forrowinrange(self.model.boardSize):
forcolinrange(self.model.boardSize):
self.b[row][col].configure(bg='WHITE')
#Andresetthemodel...
self.model.resetBoard()
self.resetImg()
defmain():
win=tk.Tk()#Createawindow
win.title("noughts-and-crosses")#Setwindowtitle
win.geometry("400x580")#Setwindowsize
win.resizable(False,False)#Bothxandydimensions...
#CreatetheGUIasaFrame
#andattachittothewindow...
myApp=TicTacToeGUI(win)
#CalltheGUImainloop...
win.mainloop()
if__name__=="__main__":
main()
TicTacToeModel:
importnumpyasnp importrandom classTicTacToeModel: """Theboardisrepresentedas2Dnumpyarray. Aplayermarkstheirspacewitha1,the computerwitha-1""" def__init__(self): """Createtheboardasa2Dmatrix""" self.resetBoard() defresetBoard(self): self.boardSize=3 a=(self.boardSize,self.boardSize) self.board=np.zeros(a) defplaySpace(self,row,col): """Userplaysaspace ReturnTrueifspacecanbeplayed,Falseotherwise""" ifrow>self.boardSizeorrow<0\ orcol>self.boardSizeorcol<0: returnFalse else: #Checkifspaceisoccupied... ifself.board[row][col]!=0: returnFalse else: self.board[row][col]=1 returnTrue defcheckWinStatus(self): """Looksfor3inarow,columnordiagonal Return0ifdraw,1iftheplayerhaswon and-1ifthecomputerhaswon,and-2isthegameis ongoing""" #Checkthecolumns... forrowinrange(self.boardSize): sum=0 forcolinrange(self.boardSize): sum+=self.board[row][col] ifsum==3: return1 elifsum==-3: return-1 #Checktherows... forcolinrange(self.boardSize): sum=0 forrowinrange(self.boardSize): sum+=self.board[row][col] ifsum==3: return1 elifsum==-3: return-1 #Checkthediagonals... sum1=0 sum2=0 fordiaginrange(self.boardSize): sum1+=self.board[diag][diag] sum2+=self.board[diag][self.boardSize-1-diag] ifsum1==3orsum2==3: return1 elifsum1==-3orsum2==-3: return-1 #Checkforincompletegame... forrowinrange(self.boardSize): forcolinrange(self.boardSize): ifself.board[row][col]==0: return-2 #Ifwegethere,it'sadraw... return0 defcomputerTurn(self): """Thecomputerchoosesanunoccupied spaceatrandom.Returnsatuple (row,col)whenchosen""" #Topreventinfiniteloops.... ifself.checkWinStatus()!=-2: return(-1,-1) played=False whileplayed==False: row=random.randrange(self.boardSize) col=random.randrange(self.boardSize) ifself.board[row][col]==0: self.board[row][col]=-1 played=True return(row,col) defmain(): #Basiccheckthatthegameworks... #Youcanexpandthisifyoulike... game=TicTacToeModel() game.playSpace(0,0) (r,c)=game.computerTurn() print(game.board) print(game.checkWinStatus()) if__name__=="__main__": main()
更多关于python游戏的精彩文章请点击查看以下专题:
python俄罗斯方块游戏集合
python经典小游戏汇总
python微信跳一跳游戏集合
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。