pythonで激むずヌメロンを作ってみた

# はじめに
こんにちは！ダンです。
友達とバスの中で暇だったので、久しぶりにヌメロンをやっていたのですが、思いのほか面白く作ってみたくなったので、共有したいと思います！(バスの中では鉛筆と紙を使ってヌメロンをしていました。)

# ヌメロンとは
1対1で相手が選んだ3つの数字を当てるという戦略型推理ゲームです。
通常のヌメロンは3桁の数字を当てれば正解なのですが、普通じゃ面白くないと思い、ゲームを難しくしようと正解の数字が6桁のヌメロンを作成しました。
# コード
少し長いですが、以下がゲームのコードです
```python
import random

print("ヌメロンを始めます。")
#答えを生成する関数
def generate_answer():
    return [random.randint(0, 9) for _ in range(6)]

#ユーザーから3桁の数字を取得する関数
def get_user_input():
    while True:
        usernum = input("6桁の数字を入力してください>>>")
        if len(usernum) != 6:
            print("6桁の数字以外の数字が入力されました。6桁の数字を入力してください")
        else:
            valid = True
            for i in range(6):
                if not usernum[i].isdigit():
                    print("数字ではありません")
                    valid = False
                    break
            if valid:
                break
    return usernum

#EATの数を数える関数
def count_eat(answer, usernum):
    eat = 0
    for i in range(6):
        if answer[i] == int(usernum[i]):
            eat += 1
    return eat

#BITEの数を数える関数
def count_bite(answer, usernum):
    bite = 0
    for i in range(6):
        for j in range(6):
            if (int(usernum[i]) == answer[j] and int(usernum[i]) != answer[i] and int(usernum[j]) != answer[i]):
                bite += 1
    return bite

#ゲームをプレイする関数
def play_game():
    # 答えの生成
    answer = generate_answer()

    while True:
        usernum = get_user_input()

        eat = count_eat(answer, usernum)
        bite = count_bite(answer, usernum)

        print("EAT:", eat)
        print("BITE:", bite)

        if eat == 6:
            print("おめでとうございます！")

        choice = input("ゲームを続けますか？(1: 続ける, 2: やめる)>>> ")
        if choice == '2':
            print("答えは", ''.join(map(str, answer)) + " でした!")
            break

if __name__ == "__main__":
    play_game()

```
順を追って説明します。
### 答えの生成
```python
def generate_answer():
    return [random.randint(0, 9) for _ in range(6)]
```
randam.randintで0~9の数字を6つランダムに取ってきました。

### ユーザから数字を取得する
while Trueの無限ループで6桁の数字が取得できるまでループから抜けられないようにします。
#### 桁数の判別
```python
usernum = input("6桁の数字を入力してください>>>")
        if len(usernum) != 6:
            print("6桁の数字以外の数字が入力されました。6桁の数字を入力してください")
        else:
```
len関数でリストのサイズを取得して、6でなければもう一度数字を求めるようにしました。
#### 入力された文字が数字であるかの判別
```python
valid = True
for i in range(6):
        if not usernum[i].isdigit():
            print("数字ではありません")
            valid = False
            break
        if valid:
        break
```
.insident()メゾットで文字列がすべて数字で構成されているかどうかを判定しました。
### 桁の位置が合致している時
```python
def count_eat(answer, usernum):
    eat = 0
    for i in range(6):
        if answer[i] == int(usernum[i]):
            eat += 1
    return eat
```
forループで6桁分の照合をします。
### 数字自体は合っているが桁の位置が違う時
```python
def count_bite(answer, usernum):
    bite = 0
    for i in range(6):
        for j in range(6):
            if (int(usernum[i]) == answer[j] and int(usernum[i]) != answer[i] and int(usernum[j]) != answer[i]):
                bite += 1
    return bite
```
2重ループを回して答えの数字の「一桁とユーザーが入力した数字の一桁を順番に照合しました。ここで、if文の中身は「数字が合っていてかつ同じ桁で同じ数字ではい」という風にしました。
### ゲーム開始から終了まで
```python
def play_game():
    # 答えの生成
    answer = generate_answer()

    while True:
        # ユーザーの数字入力
        usernum = get_user_input()

        # EATとBITEの数を計算
        eat = count_eat(answer, usernum)
        bite = count_bite(answer, usernum)

        # 結果の出力
        print("EAT:", eat)
        print("BITE:", bite)

        # eatが3の場合、おめでとうメッセージを表示
        if eat == 6:
            print("おめでとうございます！")

        # プレイを続けるかどうかを尋ねる
        choice = input("ゲームを続けますか？(1: 続ける, 2: やめる)>>> ")
        if choice == '2':
            print("答えは", ''.join(map(str, answer)) + " でした!")
            break
```
最後にゲームのユーザーに対する文章の表示、ゲームの表示をして終わりです！

# 結果
![スクリーンショット 2024-02-11 15.35.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065095/23adf4d3-4e27-1d4a-3453-e1f11cb9c16f.png)
鬼畜ヌメロンができました！(当たる気しない、、、笑)

# おわりに
激ムズヌメロンを作成することができました！！
懐かしいものやちょっと面白いものなどをぱぱっと作ることが楽しかったです！！
もし改善点やコメントがあればお気軽にお願いいたします！
コードレビュー大歓迎です！むしろしていただきたいです！
よろしくお願いします！


最後まで読んでいただきありがとうございました！