ほぼPython

Not技術ブログBut勉強ブログ 内容には誤りがあることが多いです

Pythonでババ抜きシミュレーターを作った

こんにちは。

どうやら、今日でちょうど、このブログを開設して半年だそうです。このブログの開設と同時にPythonを始めたので、Pythonを勉強し始めてからちょうど半年が経ったということになりますね。

 

さて、来る8月某日に大学院入試(化学系)を迎える私ですが、諸事情により(?)全く入試の勉強をする気は起きず、勉強は放置しておき、ババ抜きシミュレーターを作ってみました。(友人に触発された)

 

簡単にできると思って作り始めたのですが、かなり苦労しました。

これまでは、「モジュールの使い方がわからない」とか「APIの仕様がわからない」というわからないがほとんどでしたが、今回のプログラムについては「処理の流れをどうすればいいかわからない」という、調べてもそう簡単に解決する問題ではない悩みでした。(競プロにおける、この問題わからない、に近い)

 

Twitterでそんなことを呟いていたら、「やることを箇条書きにしてみるといい」というアドバイスをいただいたので、箇条書きにしてみました。これにより、一気に作業が進み、たぶん完成しました。

 

実際に、プログラムを実行する。

今回は、プレイヤーの人数は10人にしました。

まず、各プレイヤーにカードが分配され、かぶっているカードは捨てられます。

 

f:id:short_4010:20180727175152p:plain

 

次に、それぞれのプレイヤーが次のプレイヤーからカードを引きます。手札にカードのかぶりがあったらカードを捨てて、手札が0枚になったら上がります。

 

f:id:short_4010:20180727175524p:plain

 

途中も、同じようにひたすら進んでいきます。最後のターンを載せておきます。

 

f:id:short_4010:20180727175825p:plain

 

ちなみに、「ターン」については、あるプレイヤーが1回カードを引いたら「1ターン」にしています。そのため、##118ターン目 と書いてありますが、実際に、ゲームが終了したのは、119ターン目になります。(ちょっと書き方が微妙だなと思ったが、これが一番きれいに書けたので妥協しました)

 

最後に、結果が表示されます。

 

f:id:short_4010:20180727180459p:plain

 

苦労した点について

特に苦労したのは、手札が0枚になったら上がるという処理です。

 

当然ですが、カードを引いたプレイヤーだけではなく、カードを引かれたプレイヤーも手札が0枚になる可能性があります。このあたりの場合分けをできるだけキレイに書きたいと思い、もがいていました。しかし、プレイヤー自体を配列として持っているので、上がるプレイヤーの配列上の位置によって処理を変える必要があるなど、どうしても読みにくいコードになってしまいました。

 

さらに、プレイヤーが上がったときに、上がった後のプレイヤーからゲームを再開するにはどうすればいいかという点も苦労しました。これについては、プレイヤーの配列を並び替えてループし直すという処理により解決したはずです。

 

醤油も載せておくので、ぜひコピーしてシミュレートしてみてください!(あと、もし、間違っているところに気づいたらご指摘お願いします!!)

ソース