データ型の設計図:クラスの作成
多面体のサイコロを3回振って、数字の大きい方が勝ちという設定のゲームを作るよ。面の数はユーザーに選択してもらう設計にするよ。
まずはサイコロのデータ型を作成するよ。
クラスの作成
新しいデータ型を作成するには、classを作っていけばいいよ。新しく作成するデータ型の名前は大文字で始める習慣があるよ。
class Dice:
データ属性の追加
データ属性を追加したい場合は、このようにインデントを下げて記載するよ。
class Dice:
face_num = 8
メソッドの作成
次にメソッドを書いていくよ。
関数の最初はdefを付けて、関数名(引数)最後に:を付けてあとは処理をインデントを下げて書くよ。例えばfuncという関数名で、引数arg1,arg2なら、下のように書くよ。
def func(arg1, arg2):
# 処理1
# 処理2
メソッドは常に引数を1つ以上持たないといけないので、引数が不要なメソッドでも慣習的にselfと書くよ。
# 引数が不要なメソッドfunc
def func(self):
# 処理
今回は、8面のサイコロのクラスを作って、1~8の数字をランダムで取得して、3回分の値を返すメソッドを作成するよ。初期化メソッドを変更したい場合は、__init__というメソッドで書くよ。特に変更しないなら、書かなくてもいいよ。
今回は、ユーザーが面の数を4,6,8,12,20から選択してもらうようにするよ。プレイヤーが選択した面の数をvalという引数で受け取って、face_numというデータ属性にセットするよ。もし、指定でない数字を入力した場合は、エラーになるようにするよ。
# 整数をランダムに返すモジュールをインポート
import random
class Dice:
# 初期化メソッド
# valが不正な値の場合は終了し、正しい値の場合は面の数を設定する
def __init__(self, val):
if val not in [4, 6, 8, 12, 20]:
print(f'{val}は不正な値です。指定の数字で入力してください。')
exit()
self.face_num = val
# サイコロを3回振って合計値を返すメソッド
def shoot(self):
result = list()
for i in range(3):
result.append(random.randint(1, self.face_num))
return result[0] + result[1] + result[2]
これでDiceクラスの設計は完了だよ。
このクラスをdice.pyとして保存してね。
サイコロゲームを作る
ここからは、先ほど作成したDiceクラスを利用して、ゲームを行うよ。
コンピュータ(CPU)とプレイヤー(player)で出た目の合計が大きい方が勝ちというゲームを作っていくよ。
# 先ほど作成したdice.pyをインポート
import dice
print("ゲームを開始します。")
print("あなたの名前を入力して下さい。")
player_name = input()
print("サイコロの目の数は4, 6, 8, 12, 20のどれにしますか?")
num = input()
# 文字列を整数に変換し、失敗した場合は終了する
try:
int_num = int (num)
except:
print(f'"{num}"は不正な値です。算用数字で入力してください。')
exit()
# Diceクラスの初期化メソッドの呼び出し
player_dice = dice.Dice(int_num)
cpu_dice = dice.Dice(int_num)
# Diceクラスのメソッドshoot()の呼び出し
player_dice_sum = player_dice.shoot()
cpu_dice_sum = cpu_dice.shoot()
# 勝敗の判定
print(f'CPU: {cpu_dice_sum} / {player_name}: {player_dice_sum}')
if player_dice_sum > cpu_dice_sum:
print(f'{player_name}の勝ちです。')
elif player_dice_sum < cpu_dice_sum:
print(f'{player_name}の負けです。')
else:
print("引き分けです。")
これで、簡単なサイコロゲームを作成できたよ。