2013-11-14 3 views
0

В рамках упражнения в университете мы проходим через Python, как и на вводном языке программирования. Я уже знаю, как программировать разумный стандарт, поэтому мне сказали, что если я могу представить что-то хорошего качества, я могу пропустить немного класс.Создание 2-го массива классов в Python

В этой степени я взял версию C текстовой игры Star Trek (http://www.dunnington.u-net.com/public/startrek/startrek.c) и переписал ее на Python, которая прошла достаточно хорошо, когда я привык к конкретным требованиям Python.

Моя проблема - это то, что кажется общим в Stackoverflow, который является созданием и использованием многомерного многомерного массива. После долгих поисков я получил возможность создавать многомерные списки целых чисел или строк и т. Д., Но когда дело доходит до многомерного массива (или списка списков, если быть точным) классов, все ад разрывается.

Вот мой класс:

class quadrant: 
    klingonCount = 0 
    baseHere = 0 
    starCount = 0 

И вот одна из многих попыток создать список списков классов:

quadrants = [quadrant] * 9 
for y1 in range(1,9): 
    quadrants[y1] = [quadrant] * 9 

Это была скопирована из http://docs.python.org/2/faq/programming#how-do-i-create-a-multidimensional-list

Как только поскольку я заменил класс на 0, печать массива показала, что весь массив ссылался на один класс, а не на несколько разных, как я надеялся.

Проблема заключается в том, что массив содержит только значения, введенные во время последней итерации цикла, а не отдельные.

Я не на 100% знаком с использованием классов, поэтому может быть, что я просто пытаюсь ссылаться на один класс много раз, и мне действительно нужно много классов. Я? Помогите!

Я использую Python 2.7, который является рекомендуемым языком.

Ради ссылки, это код, который пытается заполнить многомерный список:

for x in range(1,9): 
    for y in range(1,9): 

     j = randint(1,99) 
     if (j < 5): 
      numBases += 1 
      baseHere = 1 

     temp = getKlingons(difficulty) 

     klingonsHere += temp 

     quadrants[x][y].baseHere = baseHere 
     quadrants[x][y].klingonCount = temp 
     s = randint(1,9) 
     quadrants[x][y].starCount = s 
+0

из ... классов ..? Из объектов. – Kos

ответ

2

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

Ваш класс должен выглядеть следующим образом:

class Quadrant(object): 
    def __init__(self): 
     self.klingonCount = 0 
     self.baseHere = 0 
     self.starCount = 0 

И вы можете создать массив как это:

quadrants = [[Quadrant() for i in range(8)] for j in range(8)] 

В вашем решении все списки в одной строке, содержащие один и тот же объект. Поэтому на каждой итерации вы изменяете те же 3 свойства.

Также обратите внимание, что списки имеют индекс 0 на основе, так что вы должны повторять, как это:

for x in range(9): 
    for y in range(9): 
     #... 
+0

Я отправился спать после публикации вопроса и сразу понял, что я сделал не так с классом. в 1 утра этим утром мой класс был похож на то, что вы написали, так что это был немного момент facepalm. * Большое спасибо * за код создания массива. Я искал абсолютно везде, чтобы найти что-то, что сработало, но безрезультатно. Теперь я могу заняться забавными частями игры! – user2991293

0

Ваша ошибка состоит в обращении к классу, а не экземпляр этого класса.

x = quadrant 
print x 

... будет возвращать что-то вроде <class '__main__.quadrant'>, потому что он относится к классу , не является объектом этого класса.

Это, как вы делаете объект этого класса:

x = quadrant() 
print x 

.. который будет печатать что-то вроде <__main__.quadrant object at 0x0000000003263828>

Попробуйте это:

quadrants = [[quadrant() for i in range(0,9)] for j in range(0,9)] 

Кроме того, может быть, рассмотреть более простую программу? Игры Cymons имеет кучу более простых программ, чтобы продемонстрировать свое понимание Python:

http://cymonsgames.com/category/programs/

+0

Просто чтобы уточнить: мне 41 год, и я написал версию этой игры для TRS-80 из книги Дэвида Х.Алса (http://www.amazon.com/BASIC-Computer-Games-Microcomputer- David/dp/0894800523/ref = sr_1_1? S = books & ie = UTF8 & qid = 1384457479 & sr = 1-1), когда мне было 7 или 8. Я в основном знаю, что я делаю - это просто заставляет его работать на Python, что потребовало меня переосмыслить, как я программирую. – user2991293

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