2016-09-19 4 views
0

Я довольно новичок в классах на Python. При кодировании игры с линкором я столкнулся с проблемой выбора случайных координат x, y для местоположения кораблей компьютера и координат атаки компьютера. Я путаюсь, создавать ли случайные числа в качестве локальной переменной в одной из функций или как атрибут класса или атрибут экземпляра.Генератор случайных чисел Battleship Python

Первоначально я думал создать атрибут экземпляра (ниже), но я получил rand_x не определен. Я попытался создать функцию «Броненосец», которая генерировала случайные числа, но каждый раз, когда она была вызвана, она возвращала одну и ту же пару координат. Это единственный способ сделать это для создания локальной переменной для случайных #s? Поскольку я буду использовать случайный генератор более одного раза, было бы неплохо не повторять этот код.

Благодарим за ваше терпение.

EDIT: Я включил больше кода со случайной функцией и заменил size на случайную функцию с self.size.

Например, линкор (4,2,0,0) может дать мне hitlist из [[2,1], [2,1]]. Я хотел бы случайных № внутри hitlist.

import random 
hitlist=[]; #a global variable 

class Battleship(object): 
    """ Ship object container. A game where the user tries to destroy the enemy's ships User tries to guess computer's position x and y """ 
    def __init__(self, size, numberships,position_x,position_y): 
     self.position_x=position_x 
     self.position_y=position_y 
     self.numberships=numberships 
     self.size = size 

    def plotships(self,r): 
     """input is integer coordinates for ships and output is an array of arrays with battleship locations CREATES THE HITLIST DONT REPEAT""" 
     print('plotships function running') 
     for i in range(self.numberships): 
      hitlist.append(r) #random number from function randomness 
      print(hitlist) 
     return hitlist 

    def randomness(self): 
     rand_x=random.choice(range(self.size)) 
     rand_y=random.choice(range(self.size)) 
     randcoord=[rand_x,rand_y] 
     return randcoord 

#Game Interface 
size=int(input('Gameboard size')) 
numberships=int(input('Waiting for Number of enemy ships')) 
b=Battleship(size,numberships,0,0) 
random=b.randomness() #create a random x y coordinate 
b.plotships(random) #create a hitlist 
+0

Убедитесь, что вы импортировали ' random'. Попробуйте использовать 'random.randint (0, self.size - (wtv - ваш диапазон x)' и 'random.randint (0, self.size - (wtv - ваш диапазон y)' –

+0

Вам необходимо [изменить] ваш вопрос заключается в том, чтобы включить [mcve]. Поскольку он стоит единственным способом, мы можем сказать, что не так, это угадать, что почти наверняка будет ошибкой. –

+2

@ Imtiaz Raqib Это% 100, переусердящее эту проблему, но вы могли бы использовать более безопасный вызов генератора случайных чисел (IE: 'os.urandom'). Не хотите, чтобы враг предсказывал местоположение вашего флота Admiral @ st4rgut. –

ответ

2

Я думаю, это потому, что вы звоните random.choice с size, а не self.size.

т.е.

rand_x = random.choice(range(self.size)) 

Кроме того, где вы определения self.rand? Наверняка у вас возникают проблемы с конструктором, пытающимся его распечатать?

EDIT - В ответ на комментарии ниже:

Если вы хотите hitlist заселяться с self.numberships парами независимых пар случайных чисел, то напишите метод plotships как:

def plotships(self): 
    """input is integer coordinates for ships and output is an array of arrays with battleship locations CREATES THE HITLIST DONT REPEAT""" 
    print('plotships function running') 
    for i in range(self.numberships): 
     hitlist.append(randomness()) #random number from function randomness 
     print(hitlist) 
    return hitlist 
+0

Than ks для указания этого. Я удалил оставшийся код self.rand. Когда я использую себя.размер Я думаю, что он все еще относится к тому же экземпляру и распечатывает ту же пару случайных чисел. – st4rgut

+0

действительно является основной причиной проблемы. спасибо – st4rgut

+0

Я сейчас не понимаю вашу проблему. Должен ли hitlist иметь разные и независимые пары случайных чисел? – Aidenhjj

0

Чтобы получить случайное число, возможно, вы можете импортировать случайную библиотеку.

Вы можете использовать его для инициализации ваших (X, Y) координат в экземпляре вашего класса.

import random 

Battleship(size, numberships, random.randint(0, WIDTH), random.randint(0, HEIGHT)) 

Я предполагаю, что у вас есть ширина экрана и высота. Надеюсь, поможет.