Seite 2 von 3

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 18:21
von jtschoch
So geht es aber auch nicht:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
Generate the playingfield
"""
#~Imports

import cPickle as pickle
import random

#~Define arena
#5*5 = 25

height_rows=5
width_cols=5

#~Define images

grass = {"tile" : "/gametiles/grass.png", "action" : None, "x" : None, "y": None}
baum1 = {"tile" : "/gametiles/baum1.png", "action" : None, "x" : None, "y": None}
baum2 = {"tile" : "/gametiles/baum2.png", "action" : None, "x" : None, "y": None}
baum3 = {"tile" : "/gametiles/baum3.png", "action" : None, "x" : None, "y": None}

#~Variables

objectlist = []
rows=[]
for y in range(height_rows):
    row=[]
    for x in range(width_cols):
        number = random.randint(1, 10)
        if number == 5:
            objectlist = baum1
        elif number == 1:
            objectlist = baum2
        elif number == 7:
            objectlist = baum3
        else:
            objectlist = grass
            
        objectlist.update({"x" : x, "y" : y})
        row.append(objectlist)
    rows.append(row)
for i in rows:
    for e in i:
        print e
name = raw_input("mapname: ")
pickle.dump(row, open("../maps/" + name + ".sav", "wb" ) )
print "fertig"

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 18:23
von jbs
Waren wir da nicht schon einen Schritt weiter?

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 18:25
von jtschoch
bei was? kann sein das ich es verhauen habe mit den Backups, hatte ich auch:/

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 18:27
von EyDu
Ist dir in den Sinn gekommen, dass Probleme ab einer gewissen Größe nicht mehr durch raten gelöst werden können? Wie sollen wir dir denn noch abnehmen, dass du dich mit dem Problem beschäftigst, wenn du gefühlt alle 3 Minuten mit der nächsten Frage kommst? Wenn man ein Fehler in seinem Programm hat, dann geht man den entsprechenden Teil Schritt für Schritt durch und schaut mal, was bei den Anweisungen tatsächlich passiert. Hier braucht es doch nur ein paar print-Statements.

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 18:28
von jtschoch
Hab ich schon gemacht, aber es kommt immer das selbe raus!

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 18:41
von kbr
Blackjack hatte Dich schon darauf hingewiesen: Du legst vier Dictionaries an (gras, baum1 etc) und bei denen bleibt es auch. Mehr werden es nicht. Python arbeitet mit Labels auf mutable und immutable Objekte. Das ist in diesem Fall (und grundlegend überhaupt) wichtig zu wissen.

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 18:44
von jtschoch
Ich habe einfach keinen Plan, schade das ich nicht an meinen Projekt weiterkomme :(

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 18:48
von jbs
Ich denke du möchtest, eigentlich etwas anderes machen. Die Elemente sind Prototypen, die du mit Werten instanziieren möchtest.

Code: Alles auswählen

import random

class Prototype:
    def __init__(self, tile, action=None, x=None, y=None):
        self.tile = tile
        self.action = action
        self.x = x
        self.y = y

    def new(self, action=None, x=None, y=None):
        if action is None:
            action = self.action
        if x is None:
            x = self.x
        if y is None:
            y = self.y

        return Prototype(self.tile, action, x, y)


    def __repr__(self):
        return '<%s>' %self.tile

prototypes = map(Prototype, ['baum1', 'baum2', 'baum3', 'grass'])

matrix = {}

n_rows = 5
n_cols = 5

for y in range(n_rows):
    for x in range(n_cols):
        prototype = prototypes[min(random.randrange(10), 3)]

        matrix[ (x,y) ] = prototype.new(x=x, y=y)

print matrix
Versuche bitte den Code zu verstehen und nicht als gegeben anzusehen. Wenn das eine Schulaufgabe ist, wird man es sehr schnell merken, dass das nicht deine eigene geistige Leistung war :wink:

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 18:52
von jtschoch
Vielen Dank ich werde mir ihn dann inruhe anschauen, wie das ganze abläuft:)

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 18:57
von jbs
Darf ich kurz fragen, wie alt du bist?

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 18:59
von jtschoch
14, übrigens hatte ich mich eine längere Zeit mit Python nichtmehr beschäftigt, und Alles was mit Listen und Arrays ist da verliere ich schnell den Überblick.

Ich hätte nochmal eine kleine Erklärung zu dem Teil bitte:

Code: Alles auswählen

class Prototype:
    def __init__(self, tile, action=None, x=None, y=None):
        self.tile = tile
        self.action = action
        self.x = x
        self.y = y

    def new(self, action=None, x=None, y=None):
        if action is None:
            action = self.action
        if x is None:
            x = self.x
        if y is None:
            y = self.y

        return Prototype(self.tile, action, x, y)


    def __repr__(self):
        return '<%s>' %self.tile
was tut er genau?

Edit, er gibt doch nur die Daten zurück, aber wozu, oder?

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 19:17
von jbs
14 und längere Zeit nicht mit Python beschäftigt - ich werde alt.

Die Idee von Prototypen ist es, dass du neue Objekte aus alten erschaffst. Das heißt, das neue Object übernimmt alle Eigenschaften seines Erschaffers, es ist quasi geklont. Man kann es natürlich klassisch mit Klassen lösen (was ein Wortspiel), aber diese Lösung kommt deiner mit den Dictionaries näher.

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 19:56
von cofi
Vielleicht will ihm noch jemand auf der Mailingliste helfen: http://permalink.gmane.org/gmane.comp.p ... erman/8145

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 20:09
von jtschoch
Irgendwie weis ich immernochnicht wie ich das umsetze, die Ausgabe muss so sein:

Code: Alles auswählen

{"tile" : "/gametiles/grass.png", "action" : None, "x" : 0, "y": 0}
{"tile" : "/gametiles/grass.png", "action" : None, "x" : 1, "y": 0}
{"tile" : "/gametiles/grass.png", "action" : None, "x" : 2, "y": 0}
{"tile" : "/gametiles/grass.png", "action" : None, "x" : 3, "y": 0}
{"tile" : "/gametiles/grass.png", "action" : None, "x" : 4, "y": 0}
{"tile" : "/gametiles/grass.png", "action" : None, "x" : 0, "y": 0}

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 20:24
von jbs
Muss? Es hindert dich doch keiner dran.

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 20:54
von jtschoch
Doch weil ich das so für die Weiterverarbeitung brauch!

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 21:10
von jbs
Wer sagt das?

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 22:02
von BlackJack
@jbs: Wenn ich mal raten müsste der Quelltext der bereits zur Weiterverarbeitung existiert.

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 22:17
von jtschoch
Ja er existiert schon, du hast recht!

Re: Problem mit update() bei Dict's

Verfasst: Montag 3. Dezember 2012, 22:18
von jbs
Kann man doch alles patchen:

Code: Alles auswählen

class Prototype(object):
    basepath = "/gametiles/"

    def __init__(self, tile, action=None, x=None, y=None):
        self._tile = tile
        self.action = action
        self.x = x
        self.y = y

    @property
    def tile(self):
        return "{base}{tile}.png".format(
            base=self.basepath,
            tile=self._tile
            )

    def new(self, action=None, x=None, y=None):
        if action is None:
            action = self.action
        if x is None:
            x = self.x
        if y is None:
            y = self.y

        return Prototype(self._tile, action, x, y)


    __getitem__ = object.__getattribute__
        

    def __repr__(self):
        return '<%s>' %self.tile