2012-12-24 6 views
5

Ich bin ein ziemlich bequemer PHP-Programmierer und habe sehr wenig Erfahrung mit Python. Ich versuche, einem Kumpel mit seinem Projekt zu helfen, der Code ist einfach genug, um in PHP zu schreiben, ich habe das meiste davon portiert, aber brauche ein wenig Hilfe, um die Übersetzung zu vervollständigen, wenn es möglich ist. Das Ziel ist:Der Sprung von PhP zu Python

  • Erstellen Sie eine Liste von Basisobjekten mit uid des
  • Randomly ein paar wählen Angebot eine zweite Liste auf die uid enthält neue Eigenschaften verkeilt zu erstellen.
  • Auf Überschneidungen zwischen den beiden Listen testen, um die Reaktion entsprechend zu ändern.

Das Folgende ist ein funktionierendes Beispiel das, was ich in Python

<?php 
srand(3234); 
class Object{ // Basic item description 
    public $x  =null; 
    public $y  =null; 
    public $name =null; 
    public $uid  =null; 
} 
class Trace{ // Used to update status or move position 
# public $x  =null; 
# public $y  =null; 
# public $floor =null; 
    public $display =null; // Currently all we care about is controlling display 
} 
########################################################## 
$objects = array(); 
$dirtyItems = array(); 

#CREATION OF ITEMS######################################## 
for($i = 0; $i < 10; $i++){ 
    $objects[] = new Object(); 
    $objects[$i]->uid = rand(); 
    $objects[$i]->x  = rand(1,30); 
    $objects[$i]->y  = rand(1,30); 
    $objects[$i]->name = "Item$i"; 
} 
########################################################## 

#RANDOM ITEM REMOVAL###################################### 
foreach($objects as $item) 
    if(rand(1,10) <= 2){ // Simulate full code with 20% chance to remove an item. 
     $derp = new Trace(); 
     $derp->display = false; 
     $dirtyItems[$item->uid] = $derp; //# <- THIS IS WHERE I NEED THE PYTHON HELP 
     } 
########################################################## 
display(); 

function display(){ 
global $objects, $dirtyItems; 
    foreach($objects as $key => $value){ // Iterate object list 
     if(@is_null($dirtyItems[$value->uid])) // Print description 
      echo "<br />$value->name is at ($value->x, $value->y) "; 
     else // or Skip if on second list. 
      echo "<br />Player took item $value->uid"; 

    } 
} 
?> 

Also Code versuchen, wirklich ich habe das meiste davon sortierte ich nur Schwierigkeiten hat, die mit Python bin Version eines assoziativen Arrays eine Liste haben, deren Schlüssel mit der Eindeutigen Anzahl von Elementen in der Hauptliste übereinstimmen.

Die Ausgabe des obigen Code sollte wie folgt aussehen:

Player took item 27955 
Player took item 20718 
Player took item 10277 
Item3 is at (8, 4) 
Item4 is at (11, 13) 
Item5 is at (3, 15) 
Item6 is at (20, 5) 
Item7 is at (24, 25) 
Item8 is at (12, 13) 
Player took item 30326 

noch Kurs Meine Python Fähigkeiten sind, aber das ist in etwa der gleichen Codeblock wie oben. Ich habe gesucht und versucht, die Listenfunktionen .insert() oder .setitem() zu verwenden, aber es funktioniert nicht ganz wie erwartet.

Dies ist mein aktueller Python-Code, noch nicht voll funktionsfähig

import random 
import math 

# Begin New Globals 
dirtyItems = {}   # This is where we store the object info 
class SimpleClass:  # This is what we store the object info as 
    pass 
# End New Globals 

# Existing deffinitions 
objects = [] 
class Object: 
    def __init__(self,x,y,name,uid): 
     self.x = x # X and Y positioning 
     self.y = y # 
     self.name = name #What will display on a 'look' command. 
     self.uid = uid 

def do_items(): 
    global dirtyItems, objects 
    for count in xrange(10): 
     X=random.randrange(1,20) 
     Y=random.randrange(1,20) 
     UID = int(math.floor(random.random()*10000)) 
     item = Object(X,Y,'Item'+str(count),UID) 
     try: #This is the new part, we defined the item, now we see if the player has moved it 
      if dirtyItems[UID]: 
       print 'Player took ', UID 
     except KeyError: 
      objects.append(item) # Back to existing code after this 
      pass # Any error generated attempting to access means that the item is untouched by the player. 

# place_items() 
random.seed(1234) 

do_items() 

for key in objects: 
    print "%s at %s %s." % (key.name, key.x, key.y) 
    if random.randint(1, 10) <= 1: 
     print key.name, 'should be missing below' 
     x = SimpleClass() 
     x.display = False 
     dirtyItems[key.uid]=x 

print ' ' 
objects = [] 
random.seed(1234) 

do_items() 

for key in objects: 
    print "%s at %s %s." % (key.name, key.x, key.y) 

print 'Done.' 

So, sorry für den langen Post, aber ich wollte durch sein und beiden Sätze von vollständigem Code bereitzustellen. Der PhP funktioniert perfekt und der Python ist in der Nähe. Wenn mir jemand in die richtige Richtung zeigen könnte, wäre das eine große Hilfe. dirtyItems.insert (key.uid, x) ist, was ich

Bearbeiten eine Liste Arbeit als Assoc-Array zu machen zu verwenden versucht: kleine Korrektur.

+0

Versuch 'dirtyItems' zu verwenden, wie' statt 'list' dict'. Du kannst ein Schlüssel-Wert-Paar als 'dirtyItems [key] = value' einfügen. – Netro

+0

Das ist großartig, ich habe es jetzt funktioniert, danke, ich finde es wahnsinnig, dass das Ausmaß der Änderung im Grunde aus ** switching [] zu {} bestand. ** und ein paar kleinere Korrekturen. Jetzt kann ich das in das Hauptprojekt für die nächste Version integrieren. – Toaster

+0

Wenn Sie Dinge wie sich überschneidende Sets machen, sollten Sie die Objekte [hashable] (http://docs.python.org/2/reference/datamodel.html#object.__hash__) so gestalten, dass sie an 'teilnehmen können einstellen. –

Antwort

2

Sie deklarieren dirtyItems als ein Array anstelle eines Wörterbuchs. In Python sind sie unterschiedliche Typen.

Do dirtyItems = {} statt.

+0

Danke Ladys Jungs!Ich konnte fühlen, dass es eng war, ich bin mir nicht sicher, wie lange ich gebraucht hätte, um nach einem Dictionary-Typ zu suchen. – Toaster

1

ein Wörterbuch Stellen anstelle eines Arrays:

import random 
import math 

dirtyItems = {} 

Dann können Sie verwenden, wie:

dirtyItems[key.uid] = x 
Verwandte Themen