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