python代码的注释只有一种方式那就是使用井字符号_从一个按钮点击得到一个井字塔克托移动(在Python和Tkinter)...
我正试图用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)...相关推荐
- python代码的注释只有一种方式、那就是使用_尔雅学习通APP2020年细胞的奥秘答案查题公众号...
[填空题]饱和水蒸气通过间壁加热空气,间壁温度接近于 的温度. [判断题]Python代码的注释只有一种方式,那就是使用 # . A. 正确 B. 错误 [单选题]胚胎最易受病毒感染而造成胎儿发育畸形 ...
- python代码的注释只有一种方式、那就是使用_[多选] 《建立世贸组织协定》附件4包括的诸边贸易协议有()....
Python代码的注释只有一种方式,那就是使用#符号 [填空题]Some young people like pop music, while still others like music. 以能源 ...
- python代码的注释贿一种方式、那就是使用井符号号_Python 代码的注释只有一种方式,那就是使用 # 符号。 (2.0分)_学小易找答案...
[判断题]Python 变量名区分大小写,所以 student 和 Student 不是同一个变量. (2.0分) [判断题]在 Python 中可以使用 for 作为变量名. (2.0分) [填空题 ...
- python代码的注释只有一种方式、那就是使用_Python代码的注释只有一种方式,那就是使用#符号。...
在中国期刊全文数据库CNKI中将"信息检索"扩展成"计算机信息检索"后,代码的注可以增加检索结果. 释只式使随笔是具有文学性的散文. 韵母可以分成韵头(介音). ...
- python使用什么作为转义字符-详解用Python处理HTML转义字符的5种方式
写爬虫是一个发送请求,提取数据,清洗数据,存储数据的过程.在这个过程中,不同的数据源返回的数据格式各不相同,有 JSON 格式,有 XML 文档,不过大部分还是 HTML 文档,HTML 经常会混杂有 ...
- Python爬虫解析网页的4种方式 值得收藏
用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情. 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存中, ...
- Python调用API接口的几种方式
本文主要介绍python中调用API的几种方式,下面是python中会用到的库. 1.urllib2 import urllib2, urllib github_url = 'https://api. ...
- 用Python读取CSV文件的5种方式
典型的数据集stocks.csv: 一个股票的数据集,其实就是常见的表格数据.有股票代码,价格,日期,时间,价格变动和成交量.这个数据集其实就是一个表格数据,有自己的头部和身体. 第一招:简单的读取 ...
- Python实现微信支付(三种方式)
Python实现微信支付(三种方式) 微信.支付宝二维码聚合SDK下载 点我下载 关注公众号"轻松学编程"了解更多. 如果需要python SDk源码,可以加我微信[1257309 ...
最新文章
- linux yum命令详解
- 刚出道的黑客搞瘫美国!他们一边搞钱一边捐款给慈善组织,还说俄国人不打俄国人...
- Python 库升级问题-module ‘requests.exceptions‘ has no attribute ‘ReadTimeout‘原因及解决办法
- PrintWriter中的write与println方法居然就是这些区别
- =空值返回空值_@ParameterizedTest在@CvsSource中具有空值
- android xml对象,对象转成xml(并且序列化xml)在android中
- Vue2.0+ElementUI+PageHelper实现的表格分页
- 算法题存档20190206
- 学习web标准、用户体验改善、Ajaxamp;Asp.Net
- Delphi 与 DirectX 之 DelphiX(47): TDIB.DoContrast();
- 中小企业数智化转型,这个百万级客户市场差点被遗忘
- vmware workstation安装windows server 2019
- 安装Vue +webpack ,以及出现的问题d的解决
- php敏感代码屏蔽,PHP敏感词汇屏蔽或替换
- N沟道与P沟道增强型MOS管电压、原理、导通条件!
- 室外无线AP覆盖解决方案
- google手机连接Wifi后总会提示无法连接互联网问题的解决
- 信息安全密码学实验一:古典密码算法的设计与实现
- 百度地图集成,经纬度返回 4.9e-324
- How to debug HTTP requests when developing and testing Web applications and clients