2016-09-19 6 views
0

私はPythonのクラスにはかなり新しいです。私は戦艦ゲームをコーディングしているうちに、コンピュータの船の位置とコンピュータの攻撃座標のランダムx、y座標を選択することに問題がありました。私は、関数の1つでローカル変数として乱数を生成するか、クラス属性またはインスタンス属性として乱数を生成するかについて混乱します。Python Battleship乱数生成器

最初はインスタンス属性(下記)を作成すると思っていましたが、rand_xが定義されていません。私は乱数を生成する戦艦の機能を作成しようとしましたが、呼び出される度に同じ座標の組が返されました。ランダムな数のローカル変数を作成するためにこれを行う唯一の方法はありますか?私はランダムジェネレータを複数回使用するので、そのコードを繰り返さなくていいといいでしょう。

ご理解いただきありがとうございます。

編集:乱数関数でコードを追加し、ランダム関数のsizeself.sizeに置き換えました。

たとえば、Battleship(4,2,0,0)はhitlistの中のランダムな番号を使用したい[[2,1]、[2,1]]のhitlistを私に与えるかもしれません。

import random 
hitlist=[]; #a global variable 

class Battleship(object): 
    """ Ship object container. A game where the user tries to destroy the enemy's ships User tries to guess computer's position x and y """ 
    def __init__(self, size, numberships,position_x,position_y): 
     self.position_x=position_x 
     self.position_y=position_y 
     self.numberships=numberships 
     self.size = size 

    def plotships(self,r): 
     """input is integer coordinates for ships and output is an array of arrays with battleship locations CREATES THE HITLIST DONT REPEAT""" 
     print('plotships function running') 
     for i in range(self.numberships): 
      hitlist.append(r) #random number from function randomness 
      print(hitlist) 
     return hitlist 

    def randomness(self): 
     rand_x=random.choice(range(self.size)) 
     rand_y=random.choice(range(self.size)) 
     randcoord=[rand_x,rand_y] 
     return randcoord 

#Game Interface 
size=int(input('Gameboard size')) 
numberships=int(input('Waiting for Number of enemy ships')) 
b=Battleship(size,numberships,0,0) 
random=b.randomness() #create a random x y coordinate 
b.plotships(random) #create a hitlist 
+0

は 'インポートしていることを確認しますランダム。 'random.randint(0、self.size - (wtvはあなたのx範囲です)'と 'random.randint(0、self.size - (wtvはあなたのy範囲です)'を使ってみてください ' –

+0

あなたはあなたの[編集] –

+2

@ Imtiaz Raqibこれは100%の問題ですが、これ以上のことは考えていませんが、安全な乱数ジェネレータコール(IE: 'os.urandom')。敵があなたの艦隊Admiral @ st4rgutの位置を予測するのを見たくないだけです。 –

答えて

2

random.choicesizeとし、self.sizeではないと考えています。また

すなわち

rand_x = random.choice(range(self.size)) 

、あなたがself.randを定義していますか?確かに、コンストラクタで問題を印刷しようとしていますか?

EDIT - 応答で以下にコメントするには:

あなたはhitlistは、独立した乱数の組のself.numbershipsペアが移入されるようにしたい場合は、としてplotships方法を記述します。

def plotships(self): 
    """input is integer coordinates for ships and output is an array of arrays with battleship locations CREATES THE HITLIST DONT REPEAT""" 
    print('plotships function running') 
    for i in range(self.numberships): 
     hitlist.append(randomness()) #random number from function randomness 
     print(hitlist) 
    return hitlist 
+0

よりそれを指摘するためのks。残ったコードself.randを削除しました。私は自己を使う。size私はそれが同じインスタンスを参照し、同じ乱数のペアを印刷していると思う。確かに、 – st4rgut

+0

、問題の主な原因と思われる。ありがとうございました – st4rgut

+0

私は今あなたの問題を本当に理解していません。ヒットリストに異なる乱数のペアを設定する必要がありますか? – Aidenhjj

0

乱数を取得するには、ランダムライブラリをインポートすることもできます。

クラスのインスタンスで(X​​、Y)座標を初期化するために使用できます。

import random 

Battleship(size, numberships, random.randint(0, WIDTH), random.randint(0, HEIGHT)) 

私はあなたが画面のwidhtと高さを利用できると仮定しています。それが役に立てば幸い。