2016-05-29 86 views
0

我在Django中創建網絡文字遊戲。我想給用戶選擇與銀行交換他的寵物。交換表是靜態的,不能修改。Django文字遊戲交易表

1羊= 6只兔

1豬= 2羊= 12只= 1個+羊6只兔

1牛= 3豬= 6只綿羊= 36兔等

現在,如果用戶有3頭豬,我想給他看看他可以交易3頭豬用於1頭牛或1頭豬用於2頭羊或1頭豬用於12只兔子等的選項。 是否有任何選項可以用ifs或者我可以做一些其他的方式?

models.py

class Players(models.Model): 
    name = models.CharField(max_length=25) # nazwa gracza 


class Game(models.Model): 
    name = models.CharField(max_length=25) # nazwa gry 
    turn = models.IntegerField(default=1) # numer gracza ktory aktualnie rzuca 
    rabbit = models.IntegerField(default=60) 
    sheep = models.IntegerField(default=24) 
    pig = models.IntegerField(default=20) 
    cow = models.IntegerField(default=12) 
    horse = models.IntegerField(default=6) 
    small_dog = models.IntegerField(default=4) 
    big_dog = models.IntegerField(default=2) 


class GamePlayer(models.Model): 
    game = models.ForeignKey(Game, on_delete=models.CASCADE) 
    player = models.ForeignKey(Players, on_delete=models.CASCADE) 
    turn = models.IntegerField() 
    rabbit = models.IntegerField(default=0) 
    sheep = models.IntegerField(default=0) 
    pig = models.IntegerField(default=0) 
    cow = models.IntegerField(default=0) 
    horse = models.IntegerField(default=0) 
    small_dog = models.IntegerField(default=0) 
    big_dog = models.IntegerField(default=0) 
+0

你是什麼意思「交換表是靜態的」? 「用ifs寫這個」在哪裏?視圖或模板? – doniyor

+0

交換表不能像上面的例子那樣改變。其實我唯一的想法是在模板上寫ifs,然後看看用戶有足夠數量的動物進行交換,如果他有交換的話。 – Krzysieqq

+0

你能顯示你的models.py嗎?取決於我們可以編寫視圖 – doniyor

回答

0

列表項

如果表是靜態的話,就可以用一個簡單的字典

下面是一個例子代碼可以解決這個問題

from collections import Counter 

# 1 sheep = 6 rabbits 
# 
# 1 pig = 2 sheep = 12 rabbits = 1 sheep + 6 rabbits 
# 
# 1 cow = 3 pig = 6 sheeps = 36 rabbit etc. 

TABLE = { 
     'rabbit': 1, 
     'sheep': 6, 
     'pig': 12, 
     'cow': 36, 
     } 



def get_trades(amount, l=()): 
    ''' 
    Recursive function that returns a list of all possible trades as tuples 
    ''' 
    if amount < 0 : return [()] # bad trade (not enough money) 
    if amount == 0 : return [l] # bingo!!! we have a full trade possibly. 
    possible_trades = []   
    animals_sorted = sorted(TABLE, key= lambda key: TABLE[key], reverse=True) 
    if l: 
     animals_sorted = animals_sorted[animals_sorted.index(l[-1]):] #preventing duplicates - since order doesn't matter 
    for something in animals_sorted: 
     value = TABLE[something] 

     trades = get_trades(amount-value, l + (something,)) #get possible trades for l+something ... 
     possible_trades.extend(trades) 
    return possible_trades 

def get_trades_counters(amount): 
    return [Counter(t) for t in get_trades(amount)] 


def main(): 
    print(get_trades_counters(TABLE['pig'])) 
    print(get_trades_counters(2*TABLE['pig'])) 
    print(get_trades_counters(2*TABLE['cow'])) 


if __name__ == '__main__': 
    main() 
+0

它幾乎工作良好。如果我打印(get_trades_counters(TABLE ['sheep']))'我看到輸出'small_dog 1只綿羊1只兔子6'。我不想爲1只羊換一隻羊,所以不應該顯示。我不知道這個代碼是如何工作的,但這幾乎就是我想要的。感謝幫助。 – Krzysieqq

+0

閱讀關於*遞歸*的一些信息,並且在應用算法之後,您可以去除不需要的結果。我還會添加更多評論 –

+0

你能檢查我是否正確嗎?我修改函數get_trades_counters()以除去元素並返回列表: 'DEF get_trades_counters(動物,量): 結果= [計數器(T),用於在get_trades噸(量* TRADE_TABLE [動物])] R = [] 對於我的結果: r.append(i.most_common()) r.remove([(animal,amount)]) return r' – Krzysieqq