Я делаю игру в ним, где игрок удаляет любое нет. камней из одного ряда в три ряда. Выигрывает тот, кто выберет последний камень. Чтобы проиграть, введите a, b, c ... l, чтобы убрать камни, но при создании кода он становится излишне длинным. Поэтому я хочу сократить свой код на 30 строк. Ниже приведен исходный код, который работает:
# Nim Game
# Game Variables
row1 = ['a', 'b', 'c']
row2 = ['d', 'e', 'f', 'g']
row3 = ['h', 'i', 'j', 'k', 'l']
x = ['0', '0', '0']
y = ['0', '0', '0', '0']
z = ['0', '0', '0', '0', '0']
def board(x, y, z):
print(x[0] + " " + x[1] + " " + x[2])
print(y[0] + " " + y[1] + " " + y[2] + " " + y[3])
print(z[0] + " " + z[1] + " " + z[2] + " " + z[3] + " " + z[4])
def valid_move(a, b, c, d): # Check for validity of moves
flag = False
if set(a).issubset(set(b)) or set(a).issubset(set(c)) or set(a).issubset(set(d)):
flag = True
return flag
def rules(): # Respond to input from players.
if valid_move(move, row1, row2, row3) and not any(item in move for item in already_played):
if 'a' in move:
x[0] = " "
already_played.append('a')
if 'b' in move:
x[1] = " "
already_played.append('b')
if 'c' in move:
x[2] = " "
already_played.append('c')
if 'd' in move:
y[0] = " "
already_played.append('d')
if 'e' in move:
y[1] = " "
already_played.append('e')
if 'f' in move:
y[2] = " "
already_played.append('f')
if 'g' in move:
y[3] = " "
already_played.append('g')
if 'h' in move:
z[0] = " "
already_played.append('h')
if 'i' in move:
z[1] = " "
already_played.append('i')
if 'j' in move:
z[2] = " "
already_played.append('j')
if 'k' in move:
z[3] = " "
already_played.append('k')
if 'l' in move:
z[4] = " "
already_played.append('l')
else:
print("Invalid move")
already_played.sort()
print('Already played: ' + str(already_played))
already_played = []
while x != [' ', ' ', ' '] or y != [' ', ' ', ' ', ' '] or z != [' ', ' ', ' ', ' ', ' ']:
board(x, y, z)
move = list(input().lower())
rules()
print("Game over!")
Теперь я хочу сократить код функции rules (), создав словарь [a, b, c ...] со значениями [x [0], x [1], x [2] ...]. А теперь используем циклы for для перебора ключей и значений. Но проблема возникает, когда я устанавливаю значение (которое является элементом списков x, y, z) на «» (что заставляет этот элемент исчезать на доске (x, y, z)), это не работает. Это не делает value = "" в board (). Вот код, который я пробовал, но он не работает:
# Nim Game
# Game Variables
row1 = ['a', 'b', 'c']
row2 = ['d', 'e', 'f', 'g']
row3 = ['h', 'i', 'j', 'k', 'l']
x = ['0', '0', '0']
y = ['0', '0', '0', '0']
z = ['0', '0', '0', '0', '0']
def board(x, y, z):
print(x[0] + " " + x[1] + " " + x[2])
print(y[0] + " " + y[1] + " " + y[2] + " " + y[3])
print(z[0] + " " + z[1] + " " + z[2] + " " + z[3] + " " + z[4])
def valid_move(a, b, c, d): # Check for validity of moves
flag = False
if set(a).issubset(set(b)) or set(a).issubset(set(c)) or set(a).issubset(set(d)):
flag = True
return flag
def rules(): # Respond to input from users.
rulebook = {'a': 'x[0]', 'b': 'x[1]', 'c': 'x[2]', 'd': 'y[0]', 'e': 'y[1]', 'f': 'y[2]', 'g': 'y[3]', 'h': 'z[0]',
'i': 'z[1]', 'j': 'z[2]', 'k': 'z[3]', 'l': 'z[4]'}
if valid_move(move, row1, row2, row3) and not any(item in move for item in already_played):
for key, value in rulebook.items():
if key in move:
value = " "
already_played.append(key)
else:
print("Invalid move")
already_played.sort()
print('Already played: ' + str(already_played))
already_played = []
while x != [' ', ' ', ' '] or y != [' ', ' ', ' ', ' '] or z != [' ', ' ', ' ', ' ', ' ']:
board(x, y, z)
move = list(input().lower())
rules()
print("Game Over!")
Пожалуйста, посмотрите, где ошибка. И подскажи, как это исправить. Если есть другой способ сократить код, это будет оценено.