2012-12-24 34 views
5

से लीप बनाना मैं काफी आरामदायक PHP प्रोग्रामर हूं, और बहुत कम पाइथन अनुभव है। मैं अपने प्रोजेक्ट के साथ एक दोस्त की मदद करने की कोशिश कर रहा हूं, कोड पीएचपी में लिखने में काफी आसान है, मैंने इसे अधिकतर पोर्ट किया है, लेकिन यदि संभव हो तो अनुवाद को पूरा करने में थोड़ी मदद की ज़रूरत है।पीएचपी से पायथन

  • uid के कुछ आइटम
  • बेतरतीब ढंग से चयन नई गुण युक्त uid को keyed एक दूसरी सूची बना सकते के साथ बुनियादी वस्तुओं की एक सूची तैयार करें: लक्ष्य है।
  • तदनुसार प्रतिक्रिया बदलने के लिए दो सूचियों के बीच चौराहे के लिए परीक्षण।

निम्नलिखित मैं क्या अजगर

<?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"; 

    } 
} 
?> 

में कोड करने के लिए कोशिश कर रहा हूँ तो, वास्तव में मैं इसके बारे में सबसे हल कर मैं तो बस एक साहचर्य सरणी के पायथन के संस्करण के साथ परेशानी हो रही हूँ है की एक काम उदाहरण है, एक सूची है जिसके कुंजी मुख्य सूची में आइटम की अनोखी संख्या से मेल खाते हैं।

ऊपर कोड से उत्पादन के लिए इसी तरह दिखना चाहिए:

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 

मेरे अजगर कौशल अभी भी कोर्स कर रहे हैं, लेकिन यह लगभग एक ही कोड ब्लॉक के रूप में ऊपर है। मैं देख रहा हूं और सूची फ़ंक्शंस का उपयोग करने की कोशिश कर रहा हूं .insert() या .setitem() लेकिन यह अपेक्षा के अनुसार काफी काम नहीं कर रहा है।

यह मेरे वर्तमान पायथन कोड, अभी तक पूरी तरह से कार्य नहीं है

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.' 

तो, लंबे समय तक इस पद के लिए खेद है, लेकिन मैं के माध्यम से हो सकता है और पूरा कोड के दोनों सेट प्रदान करने के लिए करना चाहता था। पीएचपी पूरी तरह से काम करता है, और पायथन करीब है। अगर कोई मुझे सही दिशा में इंगित कर सकता है तो यह एक बड़ी मदद होगी। नाबालिग सुधार: dirtyItems.insert (key.uid, एक्स) क्या मैं एक Assoc सरणी

संपादित के रूप में एक सूची काम करने के लिए उपयोग करने के लिए करने की कोशिश की है।

+0

कोशिश:

import random import math dirtyItems = {} 

तो फिर तुम जैसे उपयोग कर सकते हैं। आप एक कुंजी मान जोड़ी को 'dirtyItems [key] = value' – Netro

+0

के रूप में सम्मिलित कर सकते हैं यह बहुत अच्छा है, मुझे अब यह काम मिल रहा है धन्यवाद, मुझे लगता है कि यह उल्लसित है कि मूल रूप से परिवर्तन की सीमा ** स्विचिंग [] से {} ** और कुछ अन्य मामूली सुधार। अब मैं इसे अगले रिलीज के लिए मुख्य परियोजना में एकीकृत कर सकता हूं। – Toaster

+0

यदि आप छेड़छाड़ सेट जैसी चीजें कर रहे हैं तो आपको ऑब्जेक्ट्स [हैशबल] (http://docs.python.org/2/reference/datamodel.html#object.__hash__) बनाना चाहिए ताकि वे ' set'। –

उत्तर

2

आप dirtyItems को एक शब्दकोश के बजाय एक सरणी के रूप में घोषित कर रहे हैं। पायथन में वे अलग-अलग प्रकार हैं।

इसके बजाय dirtyItems = {} करें।

+0

धन्यवाद लोड लोग!मुझे लगता है कि यह करीब था, मुझे यकीन नहीं है कि मुझे डिक्शनरी प्रकार देखने के लिए कितना समय लगेगा। – Toaster

1

एक सरणी के बजाय एक शब्दकोश बनाएँ: `उपयोग करने के लिए dirtyItems` के रूप में` `बजाय list` की dict`

dirtyItems[key.uid] = x