我正在構建一個十五個拼圖程式,目前在終端中運行
我有兩個腳本,第一個如下...
主檔案
from Tablero import Tablero
from pynput import keyboard
# from pynput import mouse
t = Tablero()
def main():
print(t)
# registra los eventos del teclado hasta que la tecla es soltada
with keyboard.Listener(
on_press=on_press,
on_release=on_release) as listener:
listener.join()
def on_press(key):
t.refresh()
def on_release(key):
print("soltado")
if key == keyboard.Key.esc:
# Stop listener
return False
elif key == keyboard.Key.up:
t.tablero, t.esp_vacio = t.mover_arriba(t.tablero, t.esp_vacio)
elif key == keyboard.Key.right:
print("derecha")
elif key == keyboard.Key.down:
print("abajo")
elif key == keyboard.Key.left:
print("izquierda")
t.refresh()
if __name__ == "__main__":
main()
第二個...
Tablero.py
from copy import deepcopy
from os import system
MAX_FIL = 4
MAX_COL = 4
class Tablero:
""" Modela el tablero del juego """
def __init__(self):
# un arreglo 2D para representar el tablero
self.solucion = [[" 1", " 2", " 3", " 4"],
[" 5", " 6", " 7", " 8"],
[" 9", "10", "11", "12"],
["13", "14", "15", "__"]]
# función deepcopy para hacer una copia del tablero solucion original
# de manera que siempre este disponible como tal
self.tablero= deepcopy(self.solucion)
self.esp_vacio = {MAX_FIL - 1, MAX_COL - 1}
def __repr__(self):
for i in range(MAX_FIL):
for j in range(MAX_COL):
print(self.tablero[i][j], end=" ")
print()
# la función __repr__ DEBE regresar algo siempre
return ""
def refresh(self):
system("clear")
print(self)
# funcion para programar el movimiento de espacio vacío (esp_vacio) del tablero
def mover(self, tablero, esp_vacio, x, y):
# verificar si el moviento es valido
if(esp_vacio[0] x < 0 or esp_vacio[0] x > 3 or esp_vacio[1] y < 0 or esp_vacio[1] y > 3):
return tablero, esp_vacio
# intercambio de posición entre el espacio vacio y el espacio ocupado
tablero[esp_vacio[0]][esp_vacio[1]], tablero[esp_vacio[0] x][esp_vacio[1] y]\
= tablero[esp_vacio[0] x][esp_vacio[1] y], tablero[esp_vacio[0]][esp_vacio[1]]
# actualiza el espacioo vacio en el tablero
esp_vacio[0] = x
esp_vacio[1] = y
return tablero, esp_vacio
def mover_arriba(self, tablero, esp_vacio):
return self.mover(tablero, esp_vacio, -1, 0)
def mover_derecha(self, tablero, esp_vacio):
return self.mover(tablero, esp_vacio, 0, 1)
def mover_abajo(self, tablero, esp_vacio):
return self.mover(tablero, esp_vacio, 1, 0)
def mover_izquierda(self, tablero, esp_vacio):
return self.mover(tablero, esp_vacio, 0, -1)
當我運行 main.py 時,它會按原樣列印陣列,但是當我按下向上箭頭鍵時,程式崩潰并拋出:TypeError: 'set' object is not subscriptable
我很困惑,錯誤停止出現的唯一方法是洗掉 main.py 腳本中的第 34 行
t.tablero, t.esp_vacio = t.mover_arriba(t.tablero, t.esp_vacio)
非常感謝您的幫助!
uj5u.com熱心網友回復:
定義esp_vacio串列有幫助嗎?因為集合物件沒有索引
self.esp_vacio = [MAX_FIL - 1, MAX_COL - 1]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/350286.html
上一篇:如何在不使用例外的情況下解決ValueErrordtype
下一篇:從資料框中洗掉所有非唯一行
