Во-первых, извините, это такой большой дамп кода. Я просто хотел убедиться, что вся информация присутствует.
Таким образом, в основном вся цель состоит в том, чтобы сделать рабочую версию линкора. Я достигну этого, сделав большую сетку кнопок для игровой площадки обоих игроков (где размещены их корабли). В настоящее время я просто пытаюсь настроить способ отключения одной сетки во время хода одного игрока (чтобы они не могли атаковать свои собственные корабли), а другой - для другого игрока. Однако я изо всех сил пытаюсь вызвать кнопки по их названию, используя функцию цикла, которая у меня есть ниже (с именем enableAndDisableFunc
)
Это все просто настроено для пользовательского интерфейса
from tkinter import *
from tkinter import messagebox
base = Tk()
# **********************************
# UI SETUP *************************
# **********************************
# Base ****************************
baseTitle = Frame(base)
baseTitle.config(background="orange", height=20)
baseTitle.pack(side=TOP, fill=X)
baseTop = Frame(base)
baseTop.config(background="blue")
baseTop.pack(side=TOP, fill="both")
baseBottom = Frame(base)
baseBottom.config(background="black", height=40)
baseBottom.pack(side=BOTTOM, fill="both")
# root ********************************
rootPL1 = Frame(baseTop)
rootPL1.config(background="red")
rootPL1.pack(side=LEFT)
emptySpace = Frame(baseTop)
emptySpace.config(background="grey", width=30)
emptySpace.pack(side=LEFT)
rootPL2 = Frame(baseTop)
rootPL2.config(background="red")
rootPL2.pack(side=LEFT)
# Sect(ion) *******************************************
SectPL1 = Frame(rootPL1)
SectPL1.config(background="green", height=30)
SectPL1.pack(side=TOP, fill=X)
SectGridPL1 = Frame(rootPL1)
SectGridPL1.config(background="blue", height=400, width=150)
SectGridPL1.pack(side=BOTTOM)
SectPL2 = Frame(rootPL2)
SectPL2.config(background="green", height=30)
SectPL2.pack(side=TOP, fill=X)
SectGridPL2 = Frame(rootPL2)
SectGridPL2.config(background="blue", height=400, width=150)
SectGridPL2.pack(side=BOTTOM)
# Pl(ayer) ***********************************
PL1ButGrid = Frame(SectGridPL1)
PL1ButGrid.grid(row=8, column=8)
PL1ShipHitCountTagLabel = Label(SectPL1, text="Ship Hit Count", anchor=E, padx=3)
PL1ShipHitCountTagLabel.pack(side=LEFT)
PL1ShipHitCount = 0
PL1ShipHitCountLabel = Label(SectPL1, text=str(PL1ShipHitCount), anchor=E, padx=3)
PL1ShipHitCountLabel.pack(side=LEFT)
# *********************************************
PL2ButGrid = Frame(SectGridPL2)
PL2ButGrid.grid(row=8, column=8)
PL2ShipHitCountTagLabel = Label(SectPL2, text="Ship Hit Count", anchor=E, padx=3)
PL2ShipHitCountTagLabel.pack(side=LEFT)
PL2ShipHitCount = 0
PL2ShipHitCountLabel = Label(SectPL2, text=str(PL2ShipHitCount), anchor=E, padx=3)
PL2ShipHitCountLabel.pack(side=LEFT)
# Switch Turn Button ********************************
SwitchButton = Button(baseBottom, width=20, height=2, text="Switch Turn to Other Player",
command=lambda: enableAndDisableFunc())
SwitchButton.pack(side=TOP)
# Title *********************************************
titleLabel = Label(baseTitle, text="Battleship!", font="Arial", fg="black", bg="orange", padx=10, pady=10)
titleLabel.pack(side=TOP)
Эта часть загружает класс, который создает все кнопки, из которых сделаны сетки игрока
# classes and methods
def colourChanger(self):
self.button.config(bg="red")
global PL2ShipHitCount
global PL1ShipHitCount
PL1ShipHitCount += 1
PL2ShipHitCount += 1
PL1ShipHitCountLabel.config(text=PL1ShipHitCount)
PL2ShipHitCountLabel.config(text=PL2ShipHitCount)
print("Working for cell " + str(self) + "!")
И, наконец, в этом разделе генерируются значения каждой кнопки (с использованием нескольких циклов для получения всех деталей о каждой строке, столбце, идентификаторе и метке)
grid1namelist = []
grid2namelist = []
class GameBoardButtons:
def __init__(self, name, buttonText, buttonRow, buttonColumn, buttonState, frame):
self.name = name
self.button = Button(frame, text=buttonText, fg="grey", state=buttonState, command=lambda: colourChanger(self))
self.button.grid(row=buttonRow, column=buttonColumn)
def enable(self):
self.button.config(state=NORMAL)
def disable(self):
self.button.config(state=DISABLED)
def buttonGen(givenFrame, iState):
for i in range(1, 65):
if 1 <= int(i) <= 8:
iText = "A" + str(i)
rowNum = 1
colNum = i
if 9 <= int(i) <= 16:
iText = "B" + str((i % 8) + 1)
rowNum = 2
colNum = (i % 8) + 1
if 17 <= int(i) <= 24:
iText = "C" + str((i % 8) + 1)
rowNum = 3
colNum = (i % 8) + 1
if 25 <= int(i) <= 32:
iText = "D" + str((i % 8) + 1)
rowNum = 4
colNum = ((i % 8) + 1)
if 33 <= int(i) <= 40:
iText = "E" + str((i % 8) + 1)
rowNum = 5
colNum = ((i % 8) + 1)
if 41 <= int(i) <= 48:
iText = "F" + str((i % 8) + 1)
rowNum = 6
colNum = ((i % 8) + 1)
if 49 <= int(i) <= 56:
iText = "G" + str((i % 8) + 1)
rowNum = 7
colNum = ((i % 8) + 1)
if 57 <= int(i) <= 64:
iText = "H" + str((i % 8) + 1)
rowNum = 8
colNum = ((i % 8) + 1)
if str(givenFrame) == ".!frame2.!frame.!frame2":
iFrameValue = str(1)
iName = "grid" + iFrameValue + "but" + iText
grid1namelist.append(iName)
else:
iFrameValue = str(2)
iName = "grid" + iFrameValue + "but" + iText
grid2namelist.append(iName)
iName = GameBoardButtons(iName, iText, rowNum, colNum, iState, givenFrame)
print(iName)
# Main setup for grids
buttonGen(SectGridPL1, iState=NORMAL)
buttonGen(SectGridPL2, iState=DISABLED)
def enableAndDisableFunc():
switchTurnPopUp(1)
switchTurnPopUp(2)
messagebox.showinfo("Turn Switcher", "It is now player " + str(2) + "'s turn")
def switchTurnPopUp(gridNum):
if gridNum == 1:
for i in grid1namelist:
i.button.enable()
if gridNum == 2:
for i in grid2namelist:
i.button.disable()
base.mainloop()
Как отключить (установить state=DISABLED
) один полный набор кнопок на одной сетке (всю сетку 1 или, другими словами, все возможности "grid1" + От "A" до "H" + (от "1" до "8" ). Это позволит игроку только выбирать координаты сетки на сетке своих оппонентов, используя функцию отключения tkinter.
Большое спасибо, извините за большой дамп кода и грязный порядок кода, всем и любой помощи очень признателен!