我正试图用Tkinter编写一个带有简单GUI的Tic-Tac-Toe程序。目前的结果如下:import numpy as np

import matplotlib.pyplot as plt

import Tkinter as tk

class Game:

def __init__(self, player1, player2, with_GUI=False):

self.player1 = player1

self.player2 = player2

self.current_player = player1

self.board = Board()

self.with_GUI = with_GUI

if self.with_GUI:

master = tk.Tk()

self.GUI = GUI(master)

self.board.GUI = self.GUI

self.player1.GUI = self.GUI

self.player2.GUI = self.GUI

def play(self):

self.board.render()

while not self.board.over():

self.play_turn()

self.declare_outcome()

def play_turn(self):

move = self.current_player.get_move()

mark = self.current_player.mark

self.board.place_mark(move, mark)

self.switch_players()

self.board.render()

def switch_players(self):

if self.current_player == self.player1:

self.current_player = self.player2

else:

self.current_player = self.player1

def declare_outcome(self):

if self.board.winner() == 1:

print "Player 1 wins!"

elif self.board.winner() == 0:

print "Player 2 wins!"

else:

print "Cat's game."

class Board:

def __init__(self, grid=np.ones((3,3))*np.nan, GUI=None):

self.grid = grid

self.GUI = GUI

def winner(self):

rows = [self.grid[i,:] for i in range(3)]

cols = [self.grid[:,j] for j in range(3)]

diag = [np.array([self.grid[i,i] for i in range(3)])]

cross_diag = [np.array([self.grid[2-i,i] for i in range(3)])]

lanes = np.concatenate((rows, cols, diag, cross_diag)) # A "lane" is defined as a row, column, diagonal, or cross-diagonal

any_lane = lambda x: any([np.array_equal(lane, x) for lane in lanes]) # Returns true if any lane is equal to the input argument "x"

if any_lane(np.ones(3)):

return 1

elif any_lane(np.zeros(3)):

return 0

def over(self):

return (not np.any(np.isnan(self.grid))) or (self.winner() is not None)

def place_mark(self, pos, mark):

num = self.mark2num(mark)

self.grid[tuple(pos)] = num

def mark2num(self, mark):

if mark == "X":

return 1

elif mark == "O":

return 0

else:

print "The player's mark must be either 'X' or 'O'."

def render(self):

if self.GUI is None:

print self.grid

else:

pass

class HumanPlayer:

def __init__(self, mark, GUI=None):

self.mark = mark

self.GUI = GUI

def get_move(self, board=Board()):

if self.GUI is None:

move_string = input("Where would you like to move? (row, column) ")

move = tuple(move_string)

if not self.empty(move, board):

print "That square is already occupied.\n"

return self.get_move(board)

else:

return tuple(move_string)

else:

# return GUI.make_move()

pass

def empty(self, move, board):

return np.isnan(board.grid[move])

class GUI:

def __init__(self, master):

frame = tk.Frame(master)

frame.pack()

self.buttons = [[None for _ in range(3)] for _ in range(3)]

for i in range(3):

for j in range(3):

self.buttons[i][j] = tk.Button(frame, height=3, width=3, text="", command=lambda i=i, j=j: self.make_move(self.buttons[i][j]))

self.buttons[i][j].grid(row=i, column=j)

def make_move(self, button):

if button["text"] == "":

button.configure(text="X")

info = button.grid_info()

move = (info["row"], info["column"])

print move

return move

player1 = HumanPlayer(mark="X")

player2 = HumanPlayer(mark="O")

game = Game(player1, player2, with_GUI=True)

game.play()

这个程序在没有GUI的情况下工作:如果我在倒数第二行将with_GUI设置为False,它将使用一个非常简单的命令行界面,其中板由一个3x3 Numpy数组表示,其中“X”标记用1,“O”由0表示,空正方形由NaN表示。在

使用with_GUI=True,我得到一个未标记的按钮数组,当单击时,这些按钮将获得标签“X”,并将坐标打印到命令行(见下文)。在

但是,我正在努力寻找如何从GUI类中的make_move函数返回到HumanPlayer类中的get_move函数中。make_move需要一个tk.Button的实例作为输入,如何使最近单击的Button可用于该类?在

python代码的注释只有一种方式那就是使用井字符号_从一个按钮点击得到一个井字塔克托移动(在Python和Tkinter)...相关推荐

  1. python代码的注释只有一种方式、那就是使用_尔雅学习通APP2020年细胞的奥秘答案查题公众号...

    [填空题]饱和水蒸气通过间壁加热空气,间壁温度接近于 的温度. [判断题]Python代码的注释只有一种方式,那就是使用 # . A. 正确 B. 错误 [单选题]胚胎最易受病毒感染而造成胎儿发育畸形 ...

  2. python代码的注释只有一种方式、那就是使用_[多选] 《建立世贸组织协定》附件4包括的诸边贸易协议有()....

    Python代码的注释只有一种方式,那就是使用#符号 [填空题]Some young people like pop music, while still others like music. 以能源 ...

  3. python代码的注释贿一种方式、那就是使用井符号号_Python 代码的注释只有一种方式,那就是使用 # 符号。 (2.0分)_学小易找答案...

    [判断题]Python 变量名区分大小写,所以 student 和 Student 不是同一个变量. (2.0分) [判断题]在 Python 中可以使用 for 作为变量名. (2.0分) [填空题 ...

  4. python代码的注释只有一种方式、那就是使用_Python代码的注释只有一种方式,那就是使用#符号。...

    在中国期刊全文数据库CNKI中将"信息检索"扩展成"计算机信息检索"后,代码的注可以增加检索结果. 释只式使随笔是具有文学性的散文. 韵母可以分成韵头(介音). ...

  5. python使用什么作为转义字符-详解用Python处理HTML转义字符的5种方式

    写爬虫是一个发送请求,提取数据,清洗数据,存储数据的过程.在这个过程中,不同的数据源返回的数据格式各不相同,有 JSON 格式,有 XML 文档,不过大部分还是 HTML 文档,HTML 经常会混杂有 ...

  6. Python爬虫解析网页的4种方式 值得收藏

    用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情. 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存中, ...

  7. Python调用API接口的几种方式

    本文主要介绍python中调用API的几种方式,下面是python中会用到的库. 1.urllib2 import urllib2, urllib github_url = 'https://api. ...

  8. 用Python读取CSV文件的5种方式

    典型的数据集stocks.csv: 一个股票的数据集,其实就是常见的表格数据.有股票代码,价格,日期,时间,价格变动和成交量.这个数据集其实就是一个表格数据,有自己的头部和身体. 第一招:简单的读取 ...

  9. Python实现微信支付(三种方式)

    Python实现微信支付(三种方式) 微信.支付宝二维码聚合SDK下载 点我下载 关注公众号"轻松学编程"了解更多. 如果需要python SDk源码,可以加我微信[1257309 ...

最新文章

  1. DCN-s4600 跨vlan访问
  2. 添加类iOS cocos2d 2游戏开发实战(第3版)
  3. Xcode(7.0以上版本)真机调试
  4. 拆解声网Q4财报:除了“元宇宙”,我们还应该关注什么?
  5. 聊聊前段插件之Datatables
  6. P2152 [SDOI2009]SuperGCD
  7. 都 2021 年了,Serverless 能取代微服务吗?
  8. 算法在岗3年小结:模型策略篇
  9. 我与计算机作文450字,第一次上网作文450字(通用5篇)
  10. acegis连接使用方法_arcgis工具使用方法
  11. 测试驱动开发(TDD)在海外组的实践总结
  12. 制作效果远超CHM的帮助文档制作软件,速看!
  13. 基于MC1496乘法器的AM信号调制
  14. 京东18年管培生—技术方向笔试有感
  15. 24种常见的逻辑关系谬误
  16. 资源调度有什么技术难点?
  17. 数据仓库之-历史数据存储方案
  18. 2020年杭州社保个人最低交多少
  19. (一)离散型智能制造
  20. SAP中MRP控制者的应用理解

热门文章

  1. 股票和期货的108个区别(股票和期货的108个区别pdf)
  2. 本田雅阁 2022款混动 2.0L E-CVT 锐酷版这款车怎么样?
  3. C语言教学:下载安装Code::Blocks,设定C程式编译器
  4. 一维码和二维码的生成与解析
  5. 太阳能电池光伏系统模型
  6. 阿里云后台部署全过程-5-域名、备案
  7. python赋值运算符_Python运算符之赋值运算符
  8. 《MySQL 入门教程》第 02 篇 MySQL 安装
  9. 2023全网最新UEFI固件引导 windows 11 和 fedora 38 双系统安装
  10. 操作无法完成,因为其中的文件夹或文件已在另一程序中打开 --> 彻底解决方案