我正试图用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. linux yum命令详解
  2. 刚出道的黑客搞瘫美国!他们一边搞钱一边捐款给慈善组织,还说俄国人不打俄国人...
  3. Python 库升级问题-module ‘requests.exceptions‘ has no attribute ‘ReadTimeout‘原因及解决办法
  4. PrintWriter中的write与println方法居然就是这些区别
  5. =空值返回空值_@ParameterizedTest在@CvsSource中具有空值
  6. android xml对象,对象转成xml(并且序列化xml)在android中
  7. Vue2.0+ElementUI+PageHelper实现的表格分页
  8. 算法题存档20190206
  9. 学习web标准、用户体验改善、Ajaxamp;Asp.Net
  10. Delphi 与 DirectX 之 DelphiX(47): TDIB.DoContrast();
  11. 中小企业数智化转型,这个百万级客户市场差点被遗忘
  12. vmware workstation安装windows server 2019
  13. 安装Vue +webpack ,以及出现的问题d的解决
  14. php敏感代码屏蔽,PHP敏感词汇屏蔽或替换
  15. N沟道与P沟道增强型MOS管电压、原理、导通条件!
  16. 室外无线AP覆盖解决方案
  17. google手机连接Wifi后总会提示无法连接互联网问题的解决
  18. 信息安全密码学实验一:古典密码算法的设计与实现
  19. 百度地图集成,经纬度返回 4.9e-324
  20. How to debug HTTP requests when developing and testing Web applications and clients

热门文章

  1. C++中浮点数的有效位数轻松计算
  2. 富士通服务器 css灯亮,富士通空调通信故障
  3. SQL server 一张表随另一张表变化,建立触发器
  4. Android 获取系统铃声
  5. IJCV论文与arXiv论文神似,arXiv,是占坑神器还是剽窃利器?
  6. Centos安装Certbot,免费https证书
  7. 幽默笑话-傻冒-猿粪啊
  8. 让Kubernetes落地的“三板斧”
  9. 使用IDEA创建Docker镜像,Docker容器,并发布项目
  10. 【首发】随身wifi编译/使用ffmpeg方法,包含openwrt和debian