2017-01-28 2 views
1

Я пишу программу, которая будет по существу игрой tic-tac-toe. Он использует простой текстовый чертеж настольной игры, используя строки и + плюсы. В начале программы, у меня есть 9 пробелов в крестики-нолики борту определяется следующим образом:Python: Случайно выберите место на доске tic-tac-toe

valuea1 = " " 
valuea2 = " " 
valuea3 = " " 
valueb1 = " " 

И так далее через valuec3 ... Пустые пространства созданы, чтобы позволить замещение X или Моя функция платы О. выглядит следующим образом:

def board(): 
    """ prints the tic-tac-toe board""" 
    print(" +---A------B------C--+") 
    print(" |  |  |  |") 
    print("1| " + valuea1 +" | " + valueb1 +" | " + valuec1 + " |") 
    print(" |  |  |  |") 
    print(" ----------------------") 
    print(" |  |  |  |") 
    print("2| " + valuea2 +" | " + valueb2 +" | " + valuec2 + " |") 
    print(" |  |  |  |") 
    print(" ----------------------") 
    print(" |  |  |  |") 
    print("3| " + valuea3 +" | " + valueb3 +" | " + valuec3 + " |") 
    print(" |  |  |  |") 
    print(" +--------------------+") 
    return 

Позже в программе, на основе, если заявление, символ «компьютерный игрок», который будет использоваться (либо X или O) хранится в переменной:

computer_mark ## is either "X" or "O" based on player choice 

Теперь вот моя основная проблема и вопрос

randomlist = ("valuea1", "valuec1", "valuea3", "valuec3") 
random_result = random.choice(randomlist) 
## (REPLACE WITH CODE) 
## takes the value stored in random_result, somehow treats the value as a variable, 
## assigns that given variable the string value that is stored in computer_mark 

Я стараюсь, чтобы случайно выбрать 1 из 4 точек на борту, и изменить это место с значением " " строки к значению строки, хранящейся в computer_mark.

Есть ли способ закодировать Python для выбора случайной переменной и присвоить ей значение, которое хранится в другой переменной?

EDIT Я питон и общее программирование noob. Я читал только две недели, поэтому извиняюсь, если мои методы кодирования несколько неумны.

+3

I предложит изучить использование [lists] (https://docs.python.org/3.5/tutorial/datastructures.html) вместо того, чтобы иметь переменную для каждой опции и случайным образом назначать одну из них. –

ответ

1

Очень плохая идея, чтобы попытаться изменить эти переменные по имени (если вы действительно этого хотите, см. Ниже для более старого ответа). Это, как вы могли бы улучшить свой код, используя список, а не кучу переменных:

import random 

board = [' '] * 9 

def set_random(board,computer_mark): 
    board[random.randint(0, 8)] = computer_mark 

def print_board(board): 
    lines = [' +--%s--+' % ('-'*5).join(['A','B','C'])] 
    for i in range(3): 
     lines.append('%d| %s |' % (i,' | '.join(board[3*i:(3*i+3)]))) 
     if i < 2: 
      lines.append(' ' + '-'*19) 
    lines.append(' +%s+' % ('-'*17)) 
    print('\n |  |  |  |\n'.join(lines)) 

print_board(board) 

random.seed(0) 
set_random(board,'X') 

print_board(board) 

Выход:

+--A-----B-----C--+ 
|  |  |  | 
0|  |  |  | 
|  |  |  | 
------------------- 
|  |  |  | 
1|  |  |  | 
|  |  |  | 
------------------- 
|  |  |  | 
2|  |  |  | 
|  |  |  | 
+-----------------+ 
+--A-----B-----C--+ 
|  |  |  | 
0|  |  |  | 
|  |  |  | 
------------------- 
|  |  |  | 
1|  |  |  | 
|  |  |  | 
------------------- 
|  |  |  | 
2| X |  |  | 
|  |  |  | 
+-----------------+ 

Чтобы лучше понять, какой список индексов переходит в какое поле полезно визуализировать индексы на доске:

>>> print_board(list(map(str,range(9)))) 
+--A-----B-----C--+ 
|  |  |  | 
0| 0 | 1 | 2 | 
|  |  |  | 
------------------- 
|  |  |  | 
1| 3 | 4 | 5 | 
|  |  |  | 
------------------- 
|  |  |  | 
2| 6 | 7 | 8 | 
|  |  |  | 
+-----------------+ 

Вы можете получить доступ к текущему пространству имен (как Словаре) используя функцию locals(). Таким образом, вы могли бы сделать следующее: - Это, однако, очень плохая идея. См. выше для - лучший способ решить общую проблему представления и управления доской.

locals()[random_result] = computer_mark 

Edit на основе обновленного вопроса полный пример:

import random 

valuea1 = valuea2 = valuea3 = valueb1 = valueb2 = valueb3 = valuec1 = valuec2 = valuec3 = " " 

def board(): 
    """ prints the tic-tac-toe board""" 
    print(" +---A------B------C--+") 
    print(" |  |  |  |") 
    print("1| " + valuea1 +" | " + valueb1 +" | " + valuec1 + " |") 
    print(" |  |  |  |") 
    print(" ----------------------") 
    print(" |  |  |  |") 
    print("2| " + valuea2 +" | " + valueb2 +" | " + valuec2 + " |") 
    print(" |  |  |  |") 
    print(" ----------------------") 
    print(" |  |  |  |") 
    print("3| " + valuea3 +" | " + valueb3 +" | " + valuec3 + " |") 
    print(" |  |  |  |") 
    print(" +--------------------+") 
    return 

random.seed(0) #to make this example reproducible 
computer_mark = "X" 

randomlist = ("valuea1", "valuec1", "valuea3", "valuec3") 
random_result = random.choice(randomlist) 
locals()[random_result] = computer_mark 

board() 

Если я выполнить приведенный выше код я получаю следующий результат:

+---A------B------C--+ 
|  |  |  | 
1|  |  |  | 
|  |  |  | 
---------------------- 
|  |  |  | 
2|  |  |  | 
|  |  |  | 
---------------------- 
|  |  |  | 
3|  |  | X | 
|  |  |  | 
+--------------------+ 
+0

Я постараюсь наиболее точно изучить списки. Проблема в том, что я попробовал locals(), и я все равно получаю тот же результат. Моя доска остается, в частности, мои значения платы остаются пустыми. – IrvinLesh

+0

Что вы подразумеваете под «тем же результатом»? –

+0

Я обновил свой OP, чтобы показать, как выглядит моя «доска». Извините, если я запутаю вещи. Я довольно новичок в этом. – IrvinLesh

2

Вы должны определенно изучить возможность использования a list или вложенный список:

import random 

board = [[' ', ' ', ' '], 
     [' ', ' ', ' '], 
     [' ', ' ', ' ']] 

Тогда вы можете получить доступ случайного поля (основной список содержит 3 списков каждый из которых содержит 3 вещей:

random_field = random.randint(0, 2), random.randint(0, 2) 
board[random_field[0]][random_field[1]] = 'x' 
print(board) 
# [[' ', ' ', ' '], [' ', ' ', 'x'], [' ', ' ', ' ']] # just one example 

Или, если вы хотите, случайный выбор из нескольких возможностей:

random_field = random.choice([(0, 0), (1, 1), (2, 2)]) 
board[random_field[0]][random_field[1]] = 'x' 
print(board) 
# [[' ', ' ', ' '], [' ', 'x', ' '], [' ', ' ', ' ']] # sets only one of the diagonals 
+0

Действительно, хотя я бы подумал об использовании одного 9-элементного одномерного массива и только показывая его как сетку, когда вы идете на ее отображение. –

+0

Большое спасибо. Я только кодировал около 2 недель и еще не попал в списки. Но я мог бы начать исследовать его и опробовать, так как я нахожусь в этом вопросе. Я буду использовать пример ура и другие образцы ответов, чтобы помочь мне учиться. – IrvinLesh

+0

@IrvinLesh ok, в этом случае я не должен был использовать вложенные списки в примере, я предположил, что вы знали о 'lists', потому что вы использовали' tuple' в '(« valuea1 »,« valuec1 »,« valuea3 », «valuec3») ':) – MSeifert

Смежные вопросы