見出し画像

ヌメロンのゲームを作ってみました

先日ちょっとだけつぶやきましたが、
pythonを使ってヌメロンのゲームを作ってみました。
今回もサンプルの画像とコードを公開することにいたします。

また、パソコンにpythonをインストールしていれば
実際にプレイできますので、興味のある方はぜひ遊んでみてください。
ヌメロンのルールはこちら→偏差値6億.com様の記事

ダウンロード

サンプル画像

画像1

コード

import random


# 以下関数==========================================================
def inputdigit():
   # 解答数字の桁数指定
   digit = int(input("桁数を入力してください(3~5)>>>"))
   return digit


def gamestartflug(digit):
   # 設定桁数確認とゲームスタート意思確認
   flug = str(input(str(digit) + "桁でプレイしますか?\n"
                                 "はい:y 桁数を設定し直す:n>>>"))
   if flug == "y":
       return True
   elif flug == "n":
       return False
   else:
       return 2


def makeanswernumber(digit):
   # 指定桁数に応じて解答数字定義
   ansnum = []
   set = 0
   while set < digit:
       a = str(random.randint(0, 9))
       if ansnum.count(a) == 0:
           ansnum.append(a)
           set = set + 1
   else:
       return ansnum


def callnumber(cha,dig):

   # 桁数判定フラグ
   digjudge = False
   # 重複数値入力なしの判定
   dupjudge = False

   while digjudge == False or dupjudge == False:
       digjudge = False
       dupjudge = False
       # 桁数判定
       challengetimes(cha)
       num = sengen(dig)
       numlen = len(num)
       if numlen == dig:
           digjudge = True

       #print("dig=" + str(digjudge))

       # 重複判定フェーズ
       count = 0
       while count <= 9:
           countstr = str(count)
           c = str(num).count(countstr)
           #print(str(count)+"="+str(c))
           if c >= 2:
               break
           if count == 9:
               dupjudge = True
           count = count + 1


       #print("dup=" + str(dupjudge))

       if digjudge == False or dupjudge == False:
           print("数値が不正です。\n"
                 "桁数が正しいことや重複数字が無いか等、\n"
                 "もう一度確認して数字を入れてください。\n")

   return num


def challengetimes(cha):
   # 回数宣言
   print(str(cha+1) + "回目のコールです。")


def sengen(dig):
   # ナンバーコールフェーズ
   num = input(str(dig) + "桁の数字を入れてください>>>")
   set=0
   numlist=[]
   while set<dig:
       numlist.append(num[set])
       set=set+1
   return numlist


def eatandbitejudge(ansnum, callnum, digit):
   # eat,bite判定
   eat = 0;
   bite = 0
   #print(ansnum)
   #print(callnum)

   # eat数カウンター
   counteat = 0
   while counteat < digit:
       if ansnum[counteat] == callnum[counteat]:
           eat = eat + 1
       counteat = counteat + 1

   # bite数カウンター
   countbite = 0
   while countbite < digit:
       if ansnum.count(callnum[countbite]) == 1:
           bite = bite + 1
       countbite = countbite + 1
   bite = bite - eat
   return eat, bite


# 初期フラグ========================================================

# 解答数の桁数
digit = 0
# ゲームスタート確認用フラグ
start = False
# 回答回数
challenge = 0

# 以下本体==========================================================
print("一花のヌメロンプログラムへようこそ!\n"
     "はじめにプレイする桁数を決めましょう。\n")
# 設定が終了次第ゲームスタート
while start == False:
   digit = inputdigit()
   while digit < 3 or digit > 5:
       # 桁数不正入力の場合
       print("桁数は3~5でお願いします。")
       digit = inputdigit()
   else:
       start = gamestartflug(digit)
       while start == 2:
           # ゲームスタート意思確認の不正入力
           print("入力が正しく有りません\n"
                 "「y」か「n」を入力してください。\n")
           start = gamestartflug()

# アンサーナンバー設定フェーズ
answer = makeanswernumber(digit)
#print(answer)
print("桁数を" + str(digit) + "桁で設定して、\n"
                          "数字が設定されました。\n")

# ゲームフェーズ
eat = 0
bite = 0
clear = False
while clear == False:
   call = callnumber(challenge, digit)
   print(str(call) + "がコールされました。")
   digitcount = 0
   # eat,biteの判定と表示
   eat, bite = eatandbitejudge(answer, call, digit)

   if eat == digit:
       clear = True
   else:
       print(str(eat) + "eat," + str(bite) + "biteです。\n")
       challenge = challenge + 1

else:
   print("BINGO! 正解です!\n"
         "見事" + str(challenge+1) + "回目でクリアしました!")

input("終了するにはなにかキーを押してください")

今回つかった主な文法や工夫

利用したコードや文法は以下の通りでした。

①ランダム関数
1行目に「import random」を記載することで利用できるようになります。
importの記載は今回が初めてでしたが、要ははじめに書いておくと
特定のライブラリ(便利な関数的なもの)が追加で利用できるらしいことは
なんとなく理解しました。 プラグイン的なものかと。

②繰り返し構文
While文を何度も使うことになりました。生命線ですね。
今回はループ条件にブール値「True False」を採用。
ゲームクリア判定や、コールされた数字の正誤性判定に
活用してみました。

③リスト
ヌメロンでは「0から始まる数字」を扱いますが、
ただの整数型変数に0開始数値を入れると、
桁数の計算がマイナス1になります。
(例:123→3桁 012→12の扱いとなり2桁)
そのため、0開始数字も扱えるようにリストを活用し、
そのリストの要素数をカウントすることで桁数判定に利用してます。
(例:012→2桁 リスト[0,1,2]→要素が3つ)

④関数表記の工夫
前回のレジのときもそうですが、できるだけ機能を細分化し
関数としてここに定義することを心がけています。
何度も表示される文言、回答のナンバーをコールするフェーズ、
eat,byte数の判定などがありますが、関数内でも関数を利用する、
多層構造の部分も出てきています。
なお、プログラム中に同盟の変数・関数がある場合、
関数の呼び出しが正常に行えない場合があるようです。
どこまでセーフなのか定義が掴みきれていないのですが、
「int object callable(?)」みたいなエラーにしばらく悩みました←

ゲームプレイにおける参考情報

ヌメロンは基本的に3桁の数字を当てるゲームですが、
桁数は任意で決めて遊ぶことができます。
どこぞの記事で参照する限りでは、3桁の数字を当てるために
条件問わず「6手目」で正解を導き出せるということが
数学的に証明されているようでございます。
あなたは6手目までに導き出せますか?

まとめ

これまではプログラム内部のみで数値や文字列処理を行う
プログラムを作成してきました。
もうちょっと基礎を抑えたら、外部からのデータをインポートしながら
データ処理を行うプログラミングにも挑戦してみたいと思います。

ひとまず、次回に関しては今回の経験を活かし、
「PW作成ツール」でも使ってみようかと思います。
ツールができ次第また公開いたしますが、
そのときにはPW作成の際に使えるちょっとしたコツなども
また紹介してみようかと思います。

記事をご覧頂きまして、まことにありがとうございます。 「缶コーヒーの差し入れ」くらいの気持ちでサポートをしてくれされば とても励みになります。