使用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 相关文章推荐
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
Dec 04 Python
python使用wxPython打开并播放wav文件的方法
Apr 24 Python
Python函数可变参数定义及其参数传递方式实例详解
May 25 Python
Python入门之三角函数atan2()函数详解
Nov 08 Python
PyQt5每天必学之滑块控件QSlider
Apr 20 Python
python+selenium 定位到元素,无法点击的解决方法
Jan 30 Python
Python分支语句与循环语句应用实例分析
May 07 Python
Python list运算操作代码实例解析
Jan 20 Python
python 追踪except信息方式
Apr 25 Python
python中pathlib模块的基本用法与总结
Aug 17 Python
学生如何注册Pycharm专业版以及pycharm的安装
Sep 24 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
Jun 05 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 Echo字符串的连接格式
2016/03/07 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
2019/03/25 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
2012/02/03 Javascript
jquery动态添加删除一行数据示例
2014/06/12 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
2015/03/03 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
vue.js实现请求数据的方法示例
2017/02/07 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
使用javascript函数编写简单银行取钱存钱流程
2018/05/26 Javascript
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
jquery实现两个div中的元素相互拖动的方法分析
2020/04/05 jQuery
python基础教程之Hello World!
2014/08/29 Python
Python中List.count()方法的使用教程
2015/05/20 Python
python实现文件快照加密保护的方法
2015/06/30 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
旅游管理专业学生求职信
2013/09/28 职场文书
大学生求职信范文
2014/05/24 职场文书
日语专业毕业生自荐书
2014/06/18 职场文书
艾滋病宣传标语
2014/06/25 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
晋江市人民政府党组群众路线教育实践活动整改方案
2014/10/25 职场文书
2014年租房协议书范本
2014/10/30 职场文书
Python道路车道线检测的实现
2021/06/27 Python