2016-11-24 18 views
2

pythonを使ってpygameで2048ゲームを作ろうとしています。パラメータが与えられていなければ、関数stackrightとstackleftをself.data上で動作させ、行列がパラメータで与えられていればスタックライトまたはスタックレフト行列を返すようにします。私はここでのpython 2.7 を使用していますことは、私のコードです:クラス関数のオプション引数

import random 
def getnull(): # returns null matrix 
    data = [ 
    [0,0,2,2], 
    [0,4,0,2], 
    [0,2,0,0], 
    [2,0,2,0] 
    ] 
    return data 

class Data: 
    def fillrandom(self): #updates data by adding 2/4 randomly 
     exit = False 
     while not exit: 
      y = random.randint(0,3) 
      x = random.randint(0,3) 
      if self.data[y][x] == 0: 
       if random.randint(1,10) == 1: 
        self.data[y][x] = 4 
        exit = True 
       else: 
        self.data[y][x] = 2 
        exit = True 
    def alignright(self): # 
     list1 = [[],[],[],[]] 
     for i in range(4):   # per row loop 
      for count in range(4): # per column loop 
       if self.data[i][count] != 0: 
        list1[i] += [self.data[i][count]] 
      list1[i] = [0]*(4-len(list1[i])) + list1[i] 
     self.data = list1 
    def alignleft(self): 
     list1 = [[],[],[],[]] 
     for i in range(4):   # per row loop 
      for count in range(4): # per column loop 
       if self.data[i][count] != 0: 
        list1[i] += [self.data[i][count]] 
      list1[i] = list1[i] + [0]*(4-len(list1[i])) 
     self.data = list1 
    def printstate(self): 
     print(self.data[0]) 
     print(self.data[1]) 
     print(self.data[2]) 
     print(self.data[3]) 
     print("-------") 
    def checkfilled(self): 
     for count in range(4): 
      for i in range(4): 
       if self.data[count][i] == 0: 
        return False 
     return True 
    def stackright(self): 
     for i in range(4): 
      if self.data[i][3] == self.data[i][2]: 
       if self.data[i][1] == self.data[i][0]: 
        self.data[i][3] = self.data[i][3] *2 
        self.score += self.data[i][3] 
        self.data[i][2] = self.data[i][1] *2 
        self.score += self.data[i][2] 
        self.data[i][0] , self.data[i][1] = 0,0 
       else: 
        self.data[i][3] = self.data[i][3] *2 
        self.score += self.data[i][3] 
        self.data[i][2] = self.data[i][1] 
        self.data[i][1] = self.data[i][0] 
        self.data[i][0] = 0 
      elif self.data[i][2] == self.data[i][1]: 
        self.data[i][2] = self.data[i][2] *2 
        self.score += self.data[i][2] 
        self.data[i][1] = self.data[i][0] 
        self.data[i][0] = 0 
      elif self.data[i][1] == self.data[i][0]: 
       self.data[i][1] = self.data[i][1] *2 
       self.score += self.data[i][1] 
       self.data[i][0] = 0 
    def stackleft(self): 
     for i in range(4): 
      if self.data[i][0] == self.data[i][1]: 
       if self.data[i][2] == self.data[i][3]: 
        self.data[i][0] = self.data[i][0] *2 
        self.score += self.data[i][0] 
        self.data[i][1] = self.data[i][2] *2 
        self.score += self.data[i][1] 
        self.data[i][3] , self.data[i][2] = 0,0 
       else: 
        self.data[i][0] = self.data[i][0]*2 
        self.score += self.data[i][0] 
        self.data[i][1] = self.data[i][2] 
        self.data[i][2] = self.data[i][3] 
        self.data[i][3] = 0 
      elif self.data[i][1] == self.data[i][2]: 
        self.data[i][1] = self.data[i][1] *2 
        self.score += self.data[i][1] 
        self.data[i][2] = self.data[i][3] 
        self.data[i][3] = 0 
      elif self.data[i][2] == self.data[i][3]: 
       self.data[i][2] = self.data[i][2] *2 
       self.score += self.data[i][2] 
       self.data[i][3] = 0 
    def alignup(self): 
     col = [[],[],[],[]] 
     for i in range(4): #per col loop 
      for count in range(4): #per row loop 
       if self.data[count][i] != 0: 
        col[i] += [self.data[count][i]] 
      col[i] = col[i] + [0]*(4-len(col[i])) 
     for i in range(4):  # convert column to row 
      for count in range(4): 
       self.data[count][i] = col[i][count] 
    def aligndown(self): 
     col = [[],[],[],[]] 
     for i in range(4): #per col loop 
      for count in range(4): #per row loop 
       if self.data[count][i] != 0: 
        col[i] += [self.data[count][i]] 
      col[i] = [0]*(4-len(col[i])) + col[i] 
     for i in range(4):  # convert column to row 
      for count in range(4): 
       self.data[count][i] = col[i][count] 
    def __init__(self): 
     self.data = getnull() 
     self.score = 0 
data = Data() 
data.aligndown() 
data.printstate() 
print(data.score) 



while True: 
    pass 

答えて

3

あなたは、デフォルトパラメータを持つことができます。例えば:

def func(self, matrix=None): 
    if matrix is None: 
     #do stuff with self.data 
    else: 
     #do stuff 

はパラメータが指定されていない場合はその方法は、デフォルト値がそれではあなたがmatrixの値がNoneならば、呼び出し側はあなたので、値を指定していないことを知ってどれ

ではありませんself.dataで何かをしてください。彼が値(else)を指定していれば、呼び出し元が値を指定していて、行列で何かできることを意味します。

それともあなたは次のことを行うことができ、同じ値としてそれらを使用する場合:今

def func(self, matrix=None): 
    if matrix is None: matrix = self.data 
    #do stuff with the variable 'data' 

dataすることは、それがこのような

1

何かがトリックを行う可能性があることを好きです。

def stackright(self, *args): 
    if len(args) == 0: 
     #do things with no arguments 
    else: 
     #do things with arguments 
     print(args[0], args[1], ...) 

あなたは自分の名前でパラメータを呼び出すことができるようにしたい場合にも、**kwargs*argsを置き換えることができます。 、Noneデフォルト値で引数を渡す上

def f(self, madatoryArgument1, mandatoryArgument2, *args, **kwargs) 

この利点を引数の数が増えたときに、それを簡素化することです:あなたも、両方を使用することができます。

0

あなたが求めているもののために、あなたの関数は次のようになりますように思え:

def stackright(self, data=None): 
    if data is None: data = self.data 
    for i in range(4): 
     if data[i][3] == data[i][2]: 
      if data[i][1] == data[i][0]: 
       data[i][3] = data[i][3] *2 
       self.score += data[i][3] 
       data[i][2] = data[i][1] *2 
       self.score += data[i][2] 
       data[i][0] , data[i][1] = 0,0 
      else: 
       data[i][3] = data[i][3] *2 
       self.score += data[i][3] 
       data[i][2] = data[i][1] 
       data[i][1] = data[i][0] 
       data[i][0] = 0 
     elif data[i][2] == data[i][1]: 
       data[i][2] = data[i][2] *2 
       self.score += data[i][2] 
       data[i][1] = data[i][0] 
       data[i][0] = 0 
     elif data[i][1] == data[i][0]: 
      data[i][1] = data[i][1] *2 
      self.score += data[i][1] 
      data[i][0] = 0 
    return data 
def stackleft(self, data=None): 
    if data == None: data = self.data 
    for i in range(4): 
     if data[i][0] == data[i][1]: 
      if data[i][2] == data[i][3]: 
       data[i][0] = data[i][0] *2 
       self.score += data[i][0] 
       data[i][1] = data[i][2] *2 
       self.score += data[i][1] 
       data[i][3] , data[i][2] = 0,0 
      else: 
       data[i][0] = data[i][0]*2 
       self.score += data[i][0] 
       data[i][1] = data[i][2] 
       data[i][2] = data[i][3] 
       data[i][3] = 0 
     elif data[i][1] == data[i][2]: 
       data[i][1] = data[i][1] *2 
       self.score += data[i][1] 
       data[i][2] = data[i][3] 
       data[i][3] = 0 
     elif data[i][2] == data[i][3]: 
      data[i][2] = data[i][2] *2 
      self.score += data[i][2] 
      data[i][3] = 0 
    return data 

そして呼び出すdata.stackright(自己データを処理しますが、(行列2)をdata.stackright呼び出します) matrix2で動作します(上の部分を変更しない限り、データにスコアを追加します)

関連する問題