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 ...
最新文章
- DCN-s4600 跨vlan访问
- 添加类iOS cocos2d 2游戏开发实战(第3版)
- Xcode(7.0以上版本)真机调试
- 拆解声网Q4财报:除了“元宇宙”,我们还应该关注什么?
- 聊聊前段插件之Datatables
- P2152 [SDOI2009]SuperGCD
- 都 2021 年了,Serverless 能取代微服务吗?
- 算法在岗3年小结:模型策略篇
- 我与计算机作文450字,第一次上网作文450字(通用5篇)
- acegis连接使用方法_arcgis工具使用方法
- 测试驱动开发(TDD)在海外组的实践总结
- 制作效果远超CHM的帮助文档制作软件,速看!
- 基于MC1496乘法器的AM信号调制
- 京东18年管培生—技术方向笔试有感
- 24种常见的逻辑关系谬误
- 资源调度有什么技术难点?
- 数据仓库之-历史数据存储方案
- 2020年杭州社保个人最低交多少
- (一)离散型智能制造
- SAP中MRP控制者的应用理解
热门文章
- 股票和期货的108个区别(股票和期货的108个区别pdf)
- 本田雅阁 2022款混动 2.0L E-CVT 锐酷版这款车怎么样?
- C语言教学:下载安装Code::Blocks,设定C程式编译器
- 一维码和二维码的生成与解析
- 太阳能电池光伏系统模型
- 阿里云后台部署全过程-5-域名、备案
- python赋值运算符_Python运算符之赋值运算符
- 《MySQL 入门教程》第 02 篇 MySQL 安装
- 2023全网最新UEFI固件引导 windows 11 和 fedora 38 双系统安装
- 操作无法完成,因为其中的文件夹或文件已在另一程序中打开 --> 彻底解决方案