質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

2680閲覧

python3 簡易人生ゲーム 設計について

Untitled_Sample

総合スコア192

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/03/18 08:50

乱数で進んだ。止まったマスに書かれた文字を取得したい。

移動した数値を格納したのですが、文字を取得する方法が思い付きません。
取得する文字の重複はなしです。取得文字を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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2018/03/18 10:16

ルールがよくわかりません。サイを三つ振ってその合計だけ進むのでしょうか?
Untitled_Sample

2018/03/18 11:12

Aマスから出発してzまで行くゲームでした。サイコロで進み踏んだ文字を取得するだけのモノです。
Untitled_Sample

2018/03/18 11:14

実行を確認する為に試しに3回ほど繰り返してます。
guest

回答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
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Untitled_Sample

2018/03/18 11:57

私には、この発想は有りませんでした。 面白いですね。
LouiS0616

2018/03/18 12:03

人生ゲームと名乗る以上イベントマスが必要ですが、これをJinseiGameクラスにべた書きするとカオスなことになるので、FieldMapクラスも別途用意した方が良いかと思います。
giit

2018/03/18 15:42

クラス設計など大変参考になりました!! 処理をクラスにべた書きすることが多かったので 今後の参考にさせていただきます
guest

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

giit

総合スコア91

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Untitled_Sample

2018/03/18 11:35

#ユーザー 移動配列 user1=[[],[]] user2=[[],[]] import random #進む処理 def Sample01(xx01): xx01[0].append(random.randint(1,6)) xx01[1].append(l[sum(xx01[0])-1]) print(xx01) Sample01(user1)
Untitled_Sample

2018/03/18 11:36

サンプル、ありがとうございます 適度にいろいろ試して行こうと思います。 失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問