乱数で進んだ。止まったマスに書かれた文字を取得したい。
移動した数値を格納したのですが、文字を取得する方法が思い付きません。
取得する文字の重複はなしです。取得文字をdel関数で配列から消した場合、長さが変わってエラーになります。
現状のコード
python
1 2# upper-case A-Z 3AZ=[chr(i) for i in range(65,65+26)] 4# lower-case a-z 5az=[chr(i) for i in range(97,97+26)] 6 7#mapです 8l=AZ+az 9#表示 10print(l),print() 11 12#ユーザー 移動配列 13user1=[] 14user2=[] 15 16 17import random 18 19#進む処理 20def Sample01(xx01): 21 xx01.append(random.randint(1,6)) 22 print(xx01,sum(xx01)) 23 24#ユーザー1の移動を実行 25[Sample01(user1) for _ in range(3)]
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/18 11:12
2018/03/18 11:14
回答2件
0
その場の勢いで書いてみました。せっかくなので挙げます。
Python
1import random 2from string import ascii_letters 3 4def shake_dice(): 5 return random.randint(1, 6) 6 7 8class JinseiGame: 9 def __init__(self, *users, field_map): 10 self._field_map = field_map 11 12 self._users = users 13 self._users_pos = {user: 0 for user in users} 14 self._turn_count = 0 15 16 def print_state(self): 17 print(*self._field_map, sep='') 18 for user in self._users: 19 print(' ' * self._users_pos[user] + user.get_name_pointer()) 20 21 print('-' * 64) 22 23 def next_turn(self): 24 turn_user = self._users[self._turn_count % len(self._users)] 25 dice_result = shake_dice() 26 27 print(f'{turn_user.name}のターン!出目は{dice_result}', end='\n\n') 28 29 self._users_pos[turn_user] += dice_result 30 self._turn_count += 1 31 32 33class UserParam: 34 def __init__(self, name): 35 self.name = name 36 37 def get_name_pointer(self): 38 return '^' + self.name 39 40def main(): 41 game = JinseiGame( 42 UserParam('Yamada'), UserParam('Tanaka'), UserParam('Suzuki'), 43 field_map=list(ascii_letters) 44 ) 45 game.print_state() 46 47 for _ in range(10): 48 game.next_turn() 49 game.print_state() 50 51 52if __name__ == '__main__': 53 main()
実行結果 (凡例)
plain
1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 2^Yamada 3^Tanaka 4^Suzuki 5---------------------------------------------------------------- 6Yamadaのターン!出目は5 7 8abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 9 ^Yamada 10^Tanaka 11^Suzuki 12---------------------------------------------------------------- 13Tanakaのターン!出目は6 14 15abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 16 ^Yamada 17 ^Tanaka 18^Suzuki 19---------------------------------------------------------------- 20Suzukiのターン!出目は1 21 22abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 23 ^Yamada 24 ^Tanaka 25 ^Suzuki 26---------------------------------------------------------------- 27Yamadaのターン!出目は5 28 29abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 30 ^Yamada 31 ^Tanaka 32 ^Suzuki 33---------------------------------------------------------------- 34Tanakaのターン!出目は1 35 36abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 37 ^Yamada 38 ^Tanaka 39 ^Suzuki 40---------------------------------------------------------------- 41Suzukiのターン!出目は4 42 43abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 44 ^Yamada 45 ^Tanaka 46 ^Suzuki 47---------------------------------------------------------------- 48Yamadaのターン!出目は6 49 50abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 51 ^Yamada 52 ^Tanaka 53 ^Suzuki 54---------------------------------------------------------------- 55Tanakaのターン!出目は3 56 57abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 58 ^Yamada 59 ^Tanaka 60 ^Suzuki 61---------------------------------------------------------------- 62Suzukiのターン!出目は5 63 64abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 65 ^Yamada 66 ^Tanaka 67 ^Suzuki 68---------------------------------------------------------------- 69Yamadaのターン!出目は4 70 71abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 72 ^Yamada 73 ^Tanaka 74 ^Suzuki 75----------------------------------------------------------------
Yamadaが独走しています。しかし永久にゴールすることはありません(実装してないもん)。
所感
- ゲームの情報とユーザの情報は切り分けた方が(多分)わかりやすい
- LifeGameだと別の何かを彷彿とさせるのでJinseiGameに
- ユーザの数が可変だったり、マップが自在だったりだと面白いのかな、と
投稿2018/03/18 11:52
編集2018/03/18 11:59総合スコア35660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/18 11:57
2018/03/18 12:03
2018/03/18 15:42
0
ベストアンサー
python3
1# coding: utf-8 2import random 3 4class LifeGame(): 5 # upper-case A-Z 6 AZ=[chr(i) for i in range(65,65+26)] 7 # lower-case a-z 8 az=[chr(i) for i in range(97,97+26)] 9 lifeGameMap = AZ + az 10 11 def __init__(self): 12 #user1,user2,今のuserを定義 13 self.user1 = [] 14 self.user2 = [] 15 self.currentUser = self.user1 16 17 def ChangeUser(self,userName): 18 #userの変更 19 if userName == "user1": 20 self.currentUser = self.user1 21 elif userName == "user2": 22 self.currentUser = self.user2 23 24 def ShakeDice(self): 25 #ダイスの結果を今のuserに追加 26 self.currentUser.append(random.randint(1,6)) 27 28 def ResaltDice(self): 29 #ダイスの結果の合計を表示 30 self.ShakeDice() 31 if sum(self.currentUser) > len(self.lifeGameMap):#範囲外の処理 32 print("Out of range") 33 return -1 34 print(self.lifeGameMap[sum(self.currentUser)]) 35 36#mainの処理 37lifeGame = LifeGame() 38resalt = [lifeGame.ResaltDice() for i in range(3)]
だいぶ変えてしまいましたがこのような感じでどうでしょうか?
変更点として
クラスを使うことにより、その処理(LifeGame)に使う変数が明確になり関数間(ChangeUser、ResaltDice)の変数の扱いが容易になる
関数を分けた(ShakeDice、ResaltDice)ことにより何をしてるのかが明確になったりShakeDiceのみで実行できるので再利用やデバックができる
考え方として
プログラムにどんな処理をさせたいかをさせたいかを先に考えるといいと思います
今回の場合は
サイコロを振る(ShakeDice)
↓
サイコロの結果を合計して、lifeGameMapを参照する(ResaltDice)
↓
ユーザーが増えた時の処理を考える(ChangeUser)
のような順序で考えてからプログラムを作成し始めました
自分もまだまだ勉強中ですが助けになれば幸いです
何か間違っていたりわからないとこがあれば気軽に質問してください
投稿2018/03/18 10:26
総合スコア91
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/18 11:35
2018/03/18 11:36
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。