使用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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。