初心者がPythonで数あてゲームを作ってみた

まえがき

最近プログラミングの勉強できていない。周りが成長していく中、自分も勉強しなきゃと焦り始める。
とりあえずどういった形でもいいからひとつプログラムを作ってみなきゃと思う。
初心者でも作れそうなゲームを考え、とりあえず作ってみることにした。

ゲームの内容

それぞれの桁が重複しない値の数字を推理して当てるゲーム。
10回解答が出来、1回、回答するごとにHitやBlowといったヒントが出てくる。
10回以内に当てることが出来れば勝ち、出来なければ負けとなるゲーム。
ヒントはHitというものと、Blowというものとする。

Hitは答えた数字の中に桁と値があたっている個数を出力する。
Blowは答えた数字の中に値があたっている個数を出力する。
HitとBlowの表示はHitを優先する。

例)
答えとなる数字:[1][8][4]

1回目の回答:[1][2][3]

出力:Hit 1 Blow 0

2回目の回答:[1][4][8]

出力:Hit 1 Blow 2

3回目の回答:[1][8][4]

出力:ゲームクリア!

どっかで見たことあるゲームだナマステ!!!!

制作環境

Python3.6
Pythonista3.2
iPhone7 iOS 11.2.6

必要な機能を考える

1.ランダムな数字3桁で値が重複しない「答え」を作る機能

考えたこと
1. リストを作る(最初は空)
2. randomモジュールで1~9の乱数の値1つを生成する
3. 生成した値とリストの中を比較し、同じ値がリスト内になければ挿入する
4. リスト内に3つ要素が入るまで1~3を繰り返す

コード

# 答えを作る処理
import random

kotae = []
while len(kotae) != 3:
    x = random.randint(1,9)
    if x not in kotae:
        kotae.append(x)

---追記---
これはこちらでもよいみたいです
random.sample()は重複がないもの出力するみたいです

  kotae = random.sample(range(1, 9), 3)

2.「回答」を入力してもらうことと、例外を弾く機能

考えたこと

  1. inputを使って入力してもらう
  2. inputされたものが「数字」ではない場合は、エラーとして1.に戻る
  3. inputされたものが「3桁」ではない場合は、エラーとして1.に戻る
  4. 2.3.に該当しない場合、整数にしてlistに入れる

コード

# 入力処理
kai = input('3桁の数字を入れてください(残り' + str(count) + '回) :')

# 入力値エラー処理
# 数字以外
if not kai.isdigit():
    print('数字以外は入力できません')
# 3ケタ以外の場合
elif len(kai) != 3:
    print('3桁のみ入力してください')

# 入力値が正常の時の処理
else:
    klist = list(map(int,kai))

3.ヒントと答えを出力する機能

考えたこと
1. 「回答」と「答え」の同じインデックスの要素を比較し、同じであればHitの変数を+1する
2. 「回答」と「答え」を比較し、同じ値の要素があればBlowの変数を+1する(日本語おかしい)
3. Hitの変数が3になれば正解と処理をし、ゲームクリアとする。
4. 1.2に該当しなければ何も処理をしない
5. 後ほどHitとBlowを表示し、初期化を行う

コード

H = 0
B = 0

for i,j in zip(klist,kotae):

    # ヒントの処理
    # Hit count
    if i == j:
        H += 1

    # Blow count
    elif i in kotae:
        B += 1

    else:
        pass

# ゲームクリアの処理
if H == 3:
    print('おめでとうございます!')
    break

# ヒント出力
print('Hit :' + str(H) + '   ' + 'Blow :' + str(B))

(ここだけ見るとbreakの位置とか変数の処理とかおかしい気もするけど、全体としてみればあってるはずなので気にしないでほしいです)

作ったコード

import random
from time import sleep

OPENING_MESSAGE = """
__________________________________
****数当てゲームへようこそ!****
君は3ケタの数字を当てることができるかな?

Hit = 桁と数字が当たっている
Blow  = 数字が当たっている
数字  = 1〜9 が 3桁 重複無し
__________________________________

"""

# ゲームの中身
def game():

    # オープニング表示
    print(OPENING_MESSAGE)

    sleep(2)

    # 答えを作る処理
    kotae = []
    while len(kotae) != 3:
        x = random.randint(1,9)
        if x not in kotae:
            kotae.append(x)


    # 回答回数カウント
    count = 10

    # ゲームの開始処理
    while True:
        # Hintの変数宣言と初期化
        H = 0
        B = 0

        # 入力処理
        kai = input('3桁の数字を入れてください(残り' + str(count) + '回) :')

        # 入力値エラー処理
        # 数字以外
        if not kai.isdigit():
            print('数字以外は入力できません')
        # 3ケタ以外の場合
        elif len(kai) != 3:
            print('3桁のみ入力してください')

        # 入力値が正常の時の処理
        else:
            klist = list(map(int,kai))

            # 回答表示
            print(klist)

            # 答え合わせ
            for i,j in zip(klist,kotae):

                # ヒントの処理
                # Hit count
                 if i == j:
                    H += 1

                # Blow count
                 elif i in kotae:
                    B += 1

                 else:
                    pass

            # ゲームクリアの処理
            if H == 3:
                print('おめでとうございます!')
                print('あなたは残り' + str(count) + '回でクリアしました!')
                break

            # ヒント出力
            print('Hit :' + str(H) + '   ' + 'Blow :' + str(B))

            count -= 1

            # ゲームオーバーの処理
            if count == 0:
                print('ざんねん!回答回数を超えました。')
                print('答え↓')
                print(kotae)
                break

    # ゲームの終了処理
    return print('ゲームを終了します。')

# ゲームの開始
def main():
    while True:
        # 初期処理
        x = input('プレイしますか?y/n:')

        # 例外処理
        if x != 'y' and x != 'n':
            print('yかnを入力してください')

        # 終了処理
        elif x == 'n':
            print('終了します。')
            break

        # 開始処理
        elif x == 'y':
            print('起動します')

            sleep(2)

            game()


        # 初期処理エラー 
        else:
            print('不明なエラー')

if __name__ == '__main__':
    main()

出来たもの

https://youtu.be/L4f6wkothNI

BrowとHitとか出てますけど気にしないでください…

つくってみて

何か作ろうと思ってやってみたら2日もかからずに出来てしまった。
今後はもっとわかりやすく、短いコードで書いてみたいと思いますし
もっと難易度の高いものにも挑戦してみたいです。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.