#今年もあとわずか・・・
こんにちは。たいちゃんです。今年もあとわずかとなってきました。
今回は今迄と趣向を変えて、Rで簡単なゲームを作ったことを取り上げてみたいと思います。
#なぜこんなことをしようと思ったの?
実は昨年の秋頃よりぼちぼちとですが、『R』を学び始めております。その過程で乱数を扱う関数があることがわかりました。もうあれは30年ぐらい前、私が小学生の頃ですが、とあるゲームにミニゲームが3種類程ありました。そのミニゲームの1つが3桁の数字を10回位の間の回答数の内に当てるというものだったのです。『R』を学んで「このようなゲームなら私でもRで作ることが出来るのでは?」と思ったのがきっかけでした。
#ゲームのルール
- 0〜99迄の整数を当てるゲームです。
- チャンスは10回とします。
- 0〜99迄の整数を入力するたびに、『当たり』でなければそれぞれ『大きい』、『小さい』旨の表示をします。
- 10回迄に数を当てられればゲームクリア、当てられなければゲームオーバーとなります。
- 今回対象とするのは0〜99迄の整数なので、それ以外の数値や数値以外のものが入力されたらゲームを強制的に終了します。
#ゲームの仕様
- 一様乱数を生成させる関数『runif 』を使用して0〜1迄の乱数を生成します。
- その乱数に100を掛け、小数点以下を切り捨てるために関数『floor 』を使用します。
- 更にその値をxに代入します。(但しこの場合、参考文献によると大変低い確率ですが、100がxに代入される可能性があるようです。その為、仮にx=100の場合はxに0を代入し直します。)
- 今回対象とするのは0〜99迄の整数なので、それ以外の数値や数値以外のものが入力されたらゲームが終了するようにしておきます。
- 入力した数値と生成した乱数xとを比較してそれぞれ『小さいです。』、『大きいです。』と表示するようにします。
- 入力した数値がxと等しい場合、『おめでとうございます。正解です。』と表示してゲームを終了します。
- 10回目の入力が終わってもxと等しい値を入力できていない場合は『ゲームオーバーです。正解は以下の数値です。残念でした。』と表示して、xの値を表示します。
#今回作成したゲーム関数内のコード
NumberQuiz <- function() {
x <- floor(runif(1)*100) #一様乱数を生成後100を掛けて小数点以下を切り捨て、xに代入します。
if (x == 100) x <- 0 #もし、大変低い確率ながらx=100となっていた場合はxに0を代入します。
for(i in 1:10) { #ここから10回のループが始まります。
input <- as.numeric(readline("0〜99迄の整数を入力して下さい。")) #ここで入力の案内を出します。
if (is.na(as.numeric(input))) { #入力された値が数値でなければ終了します。
return("数値ではないので終了します。")
} else if(input %% 1 != 0) { #入力された値が整数でなければ終了します。
return("整数ではないので終了します。")
} else if (input < 0) { #入力された値が負の数であれば終了します。
return("負の数が入力されたので、終了します。")
} else if (input > 99) { #入力された値が99を超えた整数であれば終了します。
return("99を超えた数が入力されたので、終了します。")
} else if (x > input) { #入力された値が小さいときの表示をします。
print("小さいです。")
} else if (x < input) { #入力された値が大きいときの表示をします。
print("大きいです。")
} else { #正解であったときの表示です。
return("おめでとうございます。正解です。")
}
}
print("ゲームオーバーです。正解は以下の数です。残念でした。" ) #10回目でも正解できなかった場合はゲームオーバーの表示をしてxの値を表示します。
return(x)
}
#参考文献
The R Tips 第3 版 ―データ解析環境Rの基本技・グラフィックス活用編― 舟尾暢男 オーム社 2016/10/20 (PDF版)
#作成を終えて
やっぱり自分で考え、実際に手を動かしてプログラムを組むと、思っていた表示とは違ったりすることがありました。例えばゲームオーバー時『ゲームオーバーです。正解は以下の数値です。残念でした。』ではなく、『ゲームオーバーです。正解はx(この時のxの数値)です。残念でした。』としたかったのですが、私にはその解消法が見つけられませんでした。
一方で一度始めるとこの機能も載せたいというのが結構出てきて、自分の実力と相談してある程度で打ち切らないといつまでたっても完成出来ないということもありました。学ぶところは少なくなかったと思います。
最後迄お付き合い下さり、有難うございました。