使用tkinter实现三子棋游戏


Posted in Python onFebruary 25, 2021

本文实例为大家分享了tkinter实现三子棋游戏的具体代码,供大家参考,具体内容如下

整体游戏很简单。下棋,判断胜利或者平局。没有加入电脑下棋的算法。

游戏界面:

使用tkinter实现三子棋游戏

代码:

import tkinter as tk
from tkinter import messagebox, Label, Button
from TicTacToeModel import TicTacToeModel
import requests
from PIL import ImageTk, Image
from io import BytesIO
 
 
class TicTacToeGUI:
 
 def __init__(self, root):
  # Create the model instance ...
  self.model = TicTacToeModel()
 
  # Create a 2D list to hold an array of buttons ...
  self.b = []
  for row in range(self.model.boardSize):
   q = []
   for col in range(self.model.boardSize):
    q.append(None)
   self.b.append(q)
  # You can now address b like a 2D matrix e.g. b[0][0]
 
  # Create the GUI .....
  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", "Human player to start!")
 
 def getImg(self):
  headers = {
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/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)
  return image
 
 def resetImg(self):
  self.image = self.getImg()
  self.Label.config(image=self.image)
 
 def createframe2(self):
  self.image = self.getImg()
  self.Label = tk.Label(self.frame2, image=self.image)
  self.Label.pack()
  # image.show()
 
 def createGUIAssets(self):
  for x in range(self.model.boardSize):
   self.frame1.columnconfigure(x, pad=20)
   self.frame1.grid_rowconfigure(x, pad=20)
 
  for row in range(self.model.boardSize):
   for col in range(self.model.boardSize):
    self.b[row][col] = Button(self.frame1, text='', bg='WHITE',
           relief='groove', borderwidth=20,
           height=3, width=8,
           command=lambda row=row, col=col: self.takeTurn(row, col))
    self.b[row][col].grid(row=row, column=col)
 
 def takeTurn(self, row, col):
  if not self.model.playSpace(row, col):
   return
  else:
   self.b[row][col].configure(bg="Green")
   status = self.model.checkWinStatus()
   if status == 1: # Player win
    messagebox.showinfo("Result", "Player wins!!!!")
    self.resetGUI()
   elif status == 0: # Draw
    messagebox.showinfo("Result", "Draw!!!!")
    self.resetGUI()
   elif status == -2: # On going ...
    (r, c) = self.model.computerTurn()
    self.b[r][c].configure(bg='red')
    if self.model.checkWinStatus() == -1:
     messagebox.showinfo("Result", "Computer wins!!!!")
     self.resetGUI()
   else:
    # Should not get here ...
    pass
 
 def resetGUI(self):
  for row in range(self.model.boardSize):
   for col in range(self.model.boardSize):
    self.b[row][col].configure(bg='WHITE')
  # And reset the model ...
  self.model.resetBoard()
  self.resetImg()
 
 
def main():
 win = tk.Tk() # Create a window
 win.title("noughts-and-crosses") # Set window title
 win.geometry("400x580") # Set window size
 win.resizable(False, False) # Both x and y dimensions ...
 
 # Create the GUI as a Frame
 # and attach it to the window ...
 myApp = TicTacToeGUI(win)
 
 # Call the GUI mainloop ...
 win.mainloop()
 
 
if __name__ == "__main__":
 main()

TicTacToeModel:

import numpy as np
import random
 
 
class TicTacToeModel:
 """ The board is represented as 2D numpy array.
  A player marks their space with a 1, the
  computer with a -1"""
 
 def __init__(self):
  """Create the board as a 2D matrix"""
  self.resetBoard()
 
 def resetBoard(self):
  self.boardSize = 3
  a = (self.boardSize, self.boardSize)
  self.board = np.zeros(a)
 
 def playSpace(self, row, col):
  """User plays a space
  Return True if space can be played, False otherwise"""
  if row > self.boardSize or row < 0 \
    or col > self.boardSize or col < 0:
   return False
  else:
   # Check if space is occupied ...
   if self.board[row][col] != 0:
    return False
   else:
    self.board[row][col] = 1
    return True
 
 def checkWinStatus(self):
  """ Looks for 3 in a row, column or diagonal
   Return 0 if draw, 1 if the player has won
   and -1 if the computer has won, and -2 is the game is
   ongoing"""
  # Check the columns ...
  for row in range(self.boardSize):
   sum = 0
   for col in range(self.boardSize):
    sum += self.board[row][col]
   if sum == 3:
    return 1
   elif sum == -3:
    return -1
  # Check the rows ...
  for col in range(self.boardSize):
   sum = 0
   for row in range(self.boardSize):
    sum += self.board[row][col]
   if sum == 3:
    return 1
   elif sum == -3:
    return -1
 
  # Check the diagonals ...
  sum1 = 0
  sum2 = 0
  for diag in range(self.boardSize):
   sum1 += self.board[diag][diag]
   sum2 += self.board[diag][self.boardSize - 1 - diag]
  if sum1 == 3 or sum2 == 3:
   return 1
  elif sum1 == -3 or sum2 == -3:
   return -1
 
  # Check for incomplete game ...
  for row in range(self.boardSize):
   for col in range(self.boardSize):
    if self.board[row][col] == 0:
     return -2
 
  # If we get here, it's a draw ...
  return 0
 
 def computerTurn(self):
  """ The computer chooses an unoccupied
   space at random. Returns a tuple
   (row, col) when chosen"""
  # To prevent infinite loops ....
  if self.checkWinStatus() != -2:
   return (-1, -1)
  played = False
 
  while played == False:
   row = random.randrange(self.boardSize)
   col = random.randrange(self.boardSize)
   if self.board[row][col] == 0:
    self.board[row][col] = -1
    played = True
 
  return (row, col)
 
 
def main():
 # Basic check that the game works ...
 # You can expand this if you like ...
 game = TicTacToeModel()
 
 game.playSpace(0, 0)
 (r, c) = game.computerTurn()
 print(game.board)
 print(game.checkWinStatus())
 
 
if __name__ == "__main__":
 main()

更多关于python游戏的精彩文章请点击查看以下专题:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python设计模式之单例模式实例
Apr 26 Python
跟老齐学Python之玩转字符串(1)
Sep 14 Python
详解python之简单主机批量管理工具
Jan 27 Python
通过cmd进入python的实例操作
Jun 26 Python
Python 实现输入任意多个数,并计算其平均值的例子
Jul 16 Python
django+echart数据动态显示的例子
Aug 12 Python
python pillow模块使用方法详解
Aug 30 Python
pytorch构建多模型实例
Jan 15 Python
python实现简单的购物程序代码实例
Mar 03 Python
pygame实现弹球游戏
Apr 14 Python
解决导入django_filters不成功问题No module named 'django_filter'
Jul 15 Python
Python 全局空间和局部空间
Apr 06 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
Feb 25 #Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
Feb 25 #Python
python实现简单文件读写函数
Feb 25 #Python
python pygame 愤怒的小鸟游戏示例代码
Feb 25 #Python
python网络爬虫实现发送短信验证码的方法
Feb 25 #Python
python openpyxl模块的使用详解
Feb 25 #Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
Feb 25 #Python
You might like
PHP时间戳使用实例代码
2008/06/07 PHP
PHP中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
phplot生成图片类用法详解
2015/01/06 PHP
php定时执行任务设置详解
2015/02/06 PHP
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
js实现圆盘记速表
2015/08/03 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
nodejs前端模板引擎swig入门详解
2018/05/15 NodeJs
详解如何使用webpack打包JS
2018/06/21 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
这应该是最详细的响应式系统讲解了
2019/07/22 Javascript
js this 绑定机制深入详解
2020/04/30 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
jquery实现淡入淡出轮播图效果
2020/12/13 jQuery
python插入排序算法实例分析
2015/07/03 Python
基于Django contrib Comments 评论模块(详解)
2017/12/08 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
通过python实现windows桌面截图代码实例
2020/01/17 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
Python 在局部变量域中执行代码
2020/08/07 Python
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
Aurora London官网:奢华、负担得起的皮革手袋
2020/08/01 全球购物
传播学专业毕业生自荐信
2013/11/04 职场文书
中学生爱国演讲稿
2013/12/31 职场文书
预备党员入党思想汇报
2014/01/04 职场文书
小学生个人先进事迹材料
2014/05/08 职场文书
公司收款委托书范本
2014/09/20 职场文书
2014年感恩节活动策划方案
2014/10/06 职场文书
贷款担保书
2015/01/20 职场文书
承诺函范文
2015/01/21 职场文书
jquery插件实现代码雨特效
2021/04/24 jQuery
微信告警的zabbix监控系统 监控整个NGINX集群
2022/04/18 Servers