PythonでNumer0n(ヌメロン)作ってみた!
はじめに
前回に続き、なんでもいいからPythonで何か作りたいという衝動にかられ、考えていたらヌメロンというゲームを
昔に父とよくしていたのを思い出した。今となっては友達のいない僕なので、Pythonくんに遊んでもらうことにした。
名案だと思いルール確認するために「ヌメロン」でウェブ検索するとPythonで作ったという記事もいくつかもう既に存在。
しかし、お勉強も兼ねるために記事は一切覗かずに制作に取り組むことにした。Python歴は一ヶ月ないくらいだ。
開発環境
いまだに自分がどんな環境で作成しているかわかっていない(そろそろ勉強しろ)
正直Pythonだけである
ルール
まず、それぞれのプレイヤーが、0~9までの数字が書かれたカードのうち3つを使って、3桁の番号を作成する。
0から始めても良い。ただし、「550」「377」といった同じ数字を2つ以上使用した番号は作れない。
これだけが、ゲーム前の準備。以下はゲームのルールである。
先攻のプレイヤーは相手が作成したと思われる番号をコールする。
相手はコールされた番号と自分の番号を見比べ、コールされた番号がどの程度合っているかを発表する。
数字と桁が合っていた場合は「EAT」、数字は合っているが桁は合っていない場合は「BITE」となる。
例として、相手の番号が「765」で、コールされた番号が「746」であった場合は、3桁のうち「7」は桁の位置が合致しているためEAT、
「6」は数字自体は合っているが桁の位置が違うためBITE。EATが1つ・BITEが1つなので、「1EAT-1BITE」となる。
これを先攻・後攻が繰り返して行い、先に相手の番号を完全に当てきった(3桁なら3EATを相手に発表させた)プレイヤーの勝利となる。
参考ページ ヌメロン 基本ルール
使い方
基本的にはプログラムの指示の通りである
import random
def duplication_check(num):
if len(num) == len(set(num)) and len(num) == 3:
return True
def eat_bite_check(self_number,enemy_number):
global eat
global bite
eat = 0
bite = 0
if self_number[0] == enemy_number[0]:
eat += 1
elif self_number[0] in enemy_number:
bite += 1
else:
pass
if self_number[1] == enemy_number[1]:
eat += 1
elif self_number[1] in enemy_number:
bite += 1
else:
pass
if self_number[2] == enemy_number[2]:
eat += 1
elif self_number[2] in enemy_number:
bite += 1
else:
pass
return (str(eat)+ 'EAT-'+ str(bite)+ 'BITE')
print('まず始めにあなたの番号を決めます')
while True:
try:
given_number = input('3桁の数字を入力:')
if duplication_check(given_number) and str.isdecimal(given_number):
player_number = list(given_number)
break;
except:
pass
print('3桁の数値を重複無しで再入力してください')
while True:
random_number = str(random.randint(1,1000))
if len(random_number) == 3:
computer_number = list(random_number)
if duplication_check(computer_number):
break;
else:
pass
elif len(random_number) == 2:
computer_number = list(random_number)
computer_number.insert(0, "0")
if duplication_check(computer_number):
break;
else:
pass
eat = 0
bite = 0
print('---------------------------------------------------')
print('ゲームを開始します')
while True:
while True:
players_answer = input('コンピューターの3桁の数字を予想してください:')
if duplication_check(players_answer) and str.isdecimal(players_answer):
players_expectation = list(players_answer)
break;
else:
print('3桁の数値を重複無しで再入力してください')
print('結果は['+ eat_bite_check(players_expectation,computer_number)+ ']でした')
if eat == 3:
print('あなたの勝ちです')
break;
print('コンピューターがあなたの番号を予想します')
while True:
random_number = str(random.randint(1,1000))
if len(random_number) == 3:
computer_expectation = list(random_number)
if duplication_check(computer_number):
break;
else:
pass
elif len(random_number) == 2:
computer_expectation = list(random_number)
computer_expectation.insert(0, "0")
if duplication_check(computer_expectation):
break;
else:
pass
print('コンピューターは'+ str(computer_expectation)+ 'と予想しました')
print('結果は['+ eat_bite_check(computer_expectation,player_number)+ ']でした')
if eat == 3:
print('あなたの負けです')
break;
print('-----------------------------------------------------')
print('ゲームを終了します')
##解説
ゲーム開始後、プレイヤーから数値入力を受け取りプレイヤーの番号が決定。その後ランダムでコンピューター側の番号を決定します。
問答無用でプレイヤーが先手です。予想を入力で受け取ったら数が的中してるかを確認しに行きます。
EAT BITEともに順番に見ていき、あってればそれぞれの変数に1ずつ足していき最終的に結果として表示するだけです。
実に原始的かと思われます。
コンピューターも同様の手順で進めていきますが、なんと人工知能的な実装ができず毎回ランダムで当てにきます。
以後頑張りますwwwwww
以上をどちらかがEATが3になるまで続けさせ、勝った方を表示し終了する形です。
終わりに
美しくない。実に美しくない。そもそも何が美しいのかもよくわかっていない。
作成終了後に他者様のを拝見させていただいたが、コンパクトだった。半分もなかった気がする。
でも100行超えた。無駄ばっかだけど達成感はいっちょまえに感じている。
そしてこのコンピューター。無能である。毎回当てずっぽうの回答しかしてこないので、ほぼ勝てる。
次回はAIみたいなのを実装して、まともに戦えるようにしたいものである。
ここは、流石にこんな風に簡略化できただろ!!!みたいなのあったら是非ご教授ください!
泣いて喜びます!
今年中にサーバーにリクエスト送ったりするネットを介したプログラムをくんで見たいです!
以上、Pythonでヌメロン作ってみた!でした
ありがとうございました。