使用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 相关文章推荐
DJANGO-ALLAUTH社交用户系统的安装配置
Nov 18 Python
Python字符串处理函数简明总结
Apr 13 Python
Python psutil模块简单使用实例
Apr 28 Python
Python编程对列表中字典元素进行排序的方法详解
May 26 Python
python 输出上个月的月末日期实例
Apr 11 Python
Python Pandas中根据列的值选取多行数据
Jul 08 Python
Python3 批量扫描端口的例子
Jul 25 Python
Django restframework 框架认证、权限、限流用法示例
Dec 21 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
Feb 06 Python
python isinstance函数用法详解
Feb 13 Python
Python应用实现处理excel数据过程解析
Jun 19 Python
python实现学生信息管理系统(面向对象)
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
thinkPHP模型初始化实例分析
2015/12/03 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
2015/12/22 PHP
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
2008/12/25 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
jQuery css() 方法动态修改CSS属性
2016/09/25 Javascript
vue实现验证码输入框组件
2017/12/14 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
基于JS开发微信网页录音功能的实例代码
2019/04/30 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
Python实现的单向循环链表功能示例
2017/11/10 Python
在Mac上删除自己安装的Python方法
2018/10/29 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
Python批量删除mysql中千万级大量数据的脚本分享
2020/12/03 Python
如何利用python 读取配置文件
2021/01/06 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
PHP开发工程师面试问题集锦
2012/11/01 面试题
介绍一下内联、左联、右联
2013/12/31 面试题
个人近期表现材料
2014/02/11 职场文书
五一劳动节活动记录
2014/03/23 职场文书
函授生自我鉴定
2014/03/25 职场文书
土地转让协议书范本
2014/04/15 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
2014年党员学习“三严三实”思想汇报
2014/09/15 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
python入门之算法学习
2021/04/22 Python
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS
python 中的@运算符使用
2021/05/26 Python