2012-12-24 50 views
5

Tôi là một lập trình PHP khá thoải mái và có rất ít kinh nghiệm về Python. Tôi đang cố gắng giúp đỡ một người bạn với dự án của mình, mã này đủ dễ viết trong Php, tôi có phần lớn nó được chuyển qua, nhưng cần một chút trợ giúp để hoàn thành bản dịch nếu có thể. Mục tiêu là:Thực hiện bước nhảy vọt từ PhP tới Python

  • Tạo một danh sách các đối tượng cơ bản với uid của
  • ngẫu nhiên chọn một vài mục để tạo ra một danh sách thứ hai vừa khít với uid chứa thuộc tính mới.
  • Kiểm tra giao lộ giữa hai danh sách để thay đổi phản hồi tương ứng.

Sau đây là một ví dụ làm việc về những gì tôi đang cố gắng để mã trong 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"; 

    } 
} 
?> 

Vì vậy, thực sự tôi có hầu hết nó được sắp xếp Tôi chỉ gặp rắc rối với phiên bản của một mảng Associative Python, để có danh sách có khóa khớp với số Mục duy nhất trong danh sách chính.

Kết quả của đoạn mã trên sẽ trông giống như:

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 

kỹ năng Python của tôi vẫn là tất nhiên, nhưng đây là khoảng khối mã tương tự như trên. Tôi đã xem xét và cố gắng sử dụng các hàm danh sách .insert() hoặc .setitem() nhưng nó không hoạt động như mong đợi.

Đây là mã Python hiện tại của tôi, chưa đầy đủ chức năng

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

Vì vậy, xin lỗi cho đăng bài dài, nhưng tôi muốn được thông qua và cung cấp cả hai bộ mã đầy đủ. PhP hoạt động hoàn hảo, và Python đã đóng. Nếu bất cứ ai có thể chỉ cho tôi theo đúng hướng nó sẽ là một trợ giúp rất lớn. dirtyItems.insert (key.uid, x) là những gì tôi cố gắng sử dụng để thực hiện một công việc danh sách như một mảng PGS

Edit: sửa chữa nhỏ.

+0

cố gắng để sử dụng 'dirtyItems' là' dict' thay vì 'list'. Bạn có thể chèn một cặp giá trị khóa là 'dirtyItems [key] = value' – Netro

+0

Điều này thật tuyệt vời, tôi nhận được nó bây giờ cảm ơn, tôi nghĩ thật thú vị về cơ bản mức độ thay đổi bao gồm ** chuyển [] thành {} ** và một vài sửa đổi nhỏ khác. Bây giờ tôi có thể tích hợp nó vào dự án chính để phát hành tiếp theo. – Toaster

+0

Nếu bạn đang làm những việc như tập hợp giao nhau thì bạn nên tạo các đối tượng [hashable] (http://docs.python.org/2/reference/datamodel.html#object.__hash__) để họ có thể tham gia vào ' set'. –

Trả lời

2

Bạn đang khai báo dirtyItems làm mảng thay vì từ điển. Trong python chúng là các kiểu riêng biệt.

Thay vào đó hãy làm dirtyItems = {}.

+0

Cảm ơn tải guys!Tôi có thể cảm thấy nó đã gần, tôi không chắc tôi phải mất bao lâu để tìm ra một loại từ điển. – Toaster

1

Tạo một từ điển thay vì một mảng:

import random 
import math 

dirtyItems = {} 

Sau đó, bạn có thể sử dụng như:

dirtyItems[key.uid] = x 
Các vấn đề liên quan