くだらないゲームをつくる

## 目次
- [くだらないゲームをつくろう！](#くだらないゲームをつくろう！)
- [プレイ環境](#プレイ環境)
- [作成するゲーム](#作成するゲーム)
- [どのように判定数値をもってくるか](#どのように判定数値をもってくるか)
- [ソースコード](#ソースコード)
- [ソースコード説明](#ソースコード説明)
    - [なぜよろしくないのか](#なぜよろしくないのか)
- [最後に](#最後に)

## くだらないゲームをつくろう！
くだらないゲームとは、プレイしていても「これは楽しいのだろうか」という感想を持たせるものである！
そんなくだらないゲームは初心者向けであるとは思わないだろうか？~~思わない~~。

## プレイ環境
+ 今回はPython3.6.1を利用する（Python3であれば問題ない）。
+ importするライブラリもrandomだけなので、pipの必要もない。

## 作成するゲーム
今回は、1/2の確率で進み続けるゲームを作成しようと思う。1/2の確率で進み続けるゲームとか最高にくだらなくて最高だとは思わないか？
ゲームの仕組みは以下のようになっている。
```mermaid
graph TD;
    A-->B;
    A-->C;
    C-->D;
    C-->E;
    D-->..;
    D-->...;
```
最高にくだらなくて最高。

## どのように判定数値をもってくるか
例えば、C言語には
```C:sample_C
// C言語
int num;
scanf(%d, &num);
```
のような便利便利機能があったりする（便利ではない）。
Pythonにはないだろうか。。。
```Python:sample_Py
dt = input()
```
あるわ。しっかりありました。忘れてましたわ。
コマンドライン引数以外で持ってくる方法は他にもありそうだけど、いっちゃん簡単な方法だからこれを使いましょう！

## ソースコード
```Python:game.py
import random

def random_8192(n):
    ans = [0,1]
    ans = random.sample(ans,len(ans))
    if n >= 13:
        return print("1/8192?! YOU WIN !")
    # debug
    # print(ans[0],end = ">")
    print("0 or 1 ?",end = " -> ")
    uans = int(input().rstrip())

    if uans <= 1 and uans >= 0:
        if uans == ans[0]:
            return random_8192(n + 1)
        else:
            return print("Not a bad choice.")
    else:
        return print("Augument is not correct.")    
    
if __name__=='__main__':
    random_8192(0)
```

下から説明しまっせ。

## ソースコード説明
まずはこのコード
```Python:21行目
if __name__=='__main__':
    random_8192(0)
```
本来であれば、
```Python:本来
def main():
    random_8192(0)

if __name__=='__main__':
    main()
```
ってやってmain関数内でrandom_8192関数を呼ぶのが正しいと思いますが、~~めんどくさくて~~ こうなっちゃいましたわ。申し訳。

やっていることは単純で、このpyファイルを呼び出したとき、random_8192関数を呼びますよ～という話。

次に、
```Python:18行目
else:
    return print("Augument is not correct.")
```
条件外の判定（False）だった時、
「**おたく、引数違いまっせ？**」というだけのコードです。本来であれば、もっと細かくerrorを排除しなくてはならないのですが、最高にくだらないゲームにはそんなものﾌﾖｳﾗ!
#
次に、
```python:13行目
if uans <= 1 and uans >= 0:
    if uans == ans[0]:
        return random_8192(n + 1)
    else:
        return print("Not a bad choice.")
```

ココ　イチバン　ウェイト　オモイ。
以前のelse文で排除しなかった（Trueだった）ものの条件が書いてあります。

まず、**uans**とはユーザ（プレイヤー）が選択する数値のことです。（**user answer**を略してuansにしています。~~わかりにくくね？~~）

そしてif文の中身は、選択された数値の範囲を聞いています。これ、書き方がよろしくないです。
#### なぜよろしくないのか
このゲームは、ユーザに**0**か**1**を選んでもらい選んだ数値が当たっているか、否かで判定をしています。
つまり、小数という選択をとることもできるこのif文では数値が当たらないのです！！　ﾅ､ﾅﾝﾀﾞｯﾃｰ

普通に0か1かしかないのであれば、
```python:改善案
if uans == 0 or uans == 1:
    if uans == ans[0]:
        return random_8192(n + 1)
    else:
        return print("Not a bad choice.")
```
の形の方がよいだろう。
~~実は、上の文章で~~`uans = int(input())`~~ってやっているからこのif文ではエラーはかないのは内緒。~~

中身の内容はめちゃくちゃ簡単で、答えの配列0番目に入っている数値と一致していれば次に進む。異なっていれば「**・・・悪くない選択だった。**」って言ってゲームオーバー。

次に、
```python:8行目
# debug
# print(ans[0],end = ">")
print("0 or 1 ?",end = " -> ")
uans = int(input().rstrip())
```
あ、ここまで来ていうことではないですが、tab派です。

さて、コメントアウトしてあるdebug内容は置いといて、`print("0 or 1 ?",end = " -> ")`はユーザに「**0か1か**」を問うています。こういうものがないと、ユーザ側は何をされているのかわからないですからね。最低限、理解できる要素をあげましょう。

そして、`uans = int(input().rstrip())`でユーザの指定した数値をキーボード入力できるようにしています。
`.rstrip()`は要らないと思います。どこで何をしているの？君は？？

最後のコードですね。
```python:4行目
ans = [0,1]
ans = random.sample(ans,len(ans))
if n >= 13:
    return print("1/8192?! YOU WIN !")
```
**ans**は正解の配列です。

`ans = random.sample(ans,len(ans))`で配列の長さに対して中身をシャッフルしています。

if文では、13回正解したら「**1/8192も通したの？！やるじゃん！**」というメッセージを表示してゲームクリアにしています。
もちろんこんなif文を用意しなければ、無限にゲームをやり続けることは可能です。

## 最後に
初投稿なので、不備があっても許してほしいのですが、それ以上にこのようなゲームを販売されている人がいたら大変申し訳ないです。

あくまでも、この記事はPythonでゲームを作成してみないか？という誘いとtwitter以外の発信方法を得たいなぁと思ったため書かれています。皆さまを貶めるために書かれたものではありません。~~まぁみられることはないだろうｳﾊﾊ~~

次に記事を書くときが来るとしたら、研究の内容がオワッているか、くたばったときです。夜風を遠くに聞きながら歯を磨いて待っていてください。では。