1
1

Pythonで新しいデータ型を作成する

Posted at

データ型の設計図:クラスの作成

多面体のサイコロを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("引き分けです。")

これで、簡単なサイコロゲームを作成できたよ。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1