こんにちは。今回は、Rubyを使ったレベルアップの仕組みがある計算ゲームを作っていきます。今回つくるレベルアップの仕組みは、他のプログラムでも応用が利くと思うのでぜひ参考にしてください。
ゲームのひな型を作る
本題であるレベルアップの仕組みを作る前に、まず計算ゲームのひな型を作っていきます。計算ゲームの機能は以下のものに絞ります。
コードを載せます。
random = Random.new();
num_of_correct = 0 #正解数
puts "問題数を入力してください。"
md = gets.to_i #解く問題数を取得
puts "#{md}問、出題します。"
md.times {
num1 = rand(10)
num2 = rand(10)
puts "#{num1} + #{num2} = "
ans = num1 + num2 #解答をansに代入
guess = gets.to_i #問題の回答を取得
if guess == ans then
puts "正解!"
num_of_correct += 1 #正解したら正解数を1増やす。
else
puts "不正解"
puts "正解は#{ans}です。"
end
}
if num_of_correct == md then #出題数と正解数が等しいなら
puts "全問正解おめでとう!!"
else
puts "もっとがんばろう。"
end
とりあえず先ほど示した機能の付いた計算ゲームが完成しました。
本題ではないので手短に、コードの解説をしていきます。
md = gets.to_i #解く問題数を取得
gets.to_iを使い、入力を受け取ります。
num1 = rand(10)
num2 = rand(10)
変数に0 ~ 10未満の数でランダムに代入しています。これにより、一回一回違う問題を出題することができます。
if num_of_correct == md then #出題数と正解数が等しいなら
puts "全問正解おめでとう!!"
else
num_of_correct == mdは正解数と問題数が等しいならという式です。ここで全問正解判定をしています。以上で計算ゲームの解説を終わります。
レベルアップの仕組みをつくる
次にレベルアップの仕組みを考えていきます。ほしい機能は、実行画面を閉じてもレベルが保持される機能ことです。
それを実現する方法として、今回はtxtファイルに保存するという方法をとります。他にはMYSQLに接続する方法などがあります。安全性などではMYSQLに接続した方がよいのですが、あくまで今回は例なのでセキュリティなどは考慮せずに作ります。
ファイルの読み書きの復習
Rubyでファイルに保存する方法を復習しておきます。まずは、ファイルを読み込む方法から、復習します。
#ファイルの読み込み
file = File.open("ファイルの位置", "r")
a = file.read
file.close()
File.open関数の引数である”r”はreadの頭文字で読み込む意味です。
aにはファイルのなかの文字列が入ります。
#ファイルの書き込み
file = File.open("ファイルの位置", "w")
file.puts("これがファイルに書き込まれます。")
file.close()
File.open関数は変化していないと思われるかもしれませんが、第二引数の”r”が”w”に変わっています。これはwriteの頭文字という意味です。
file.puts関数はファイル内にダブルクォーテーション内の文字列を書き込めます。
レベルアップシステムの作成
では、レベルアップの仕組みも考え、ファイルの読み書きの復習もしたところで、ようやくレベルアップシステムを作成していきます。
ファイルの読み書きや計算ゲームを一つのファイルだけで管理するのは大変です。ですので、今回はファイルの読み書きをするFile.rbファイルと計算ゲームを進行するmain.rbファイルとレベルを保存するLevel.txtファイル , 解いた数を保存するQnum.txtファイルの4つのファイルに分けて、作っていきます。
(これらのファイルは同じ階層に作ることにします)
では、ファイル構成ができたところで早速レベルアップシステムを作っていきましょう。
まず、ファイルを読むFileRead関数を作ります。(関数名は適当でいいです)
#FileRead関数
def FileRead(fileType) # 1ならLevel.txtを読む,2ならQnum.txtを読む。
if fileType == 1 then
file = File.open("Level.txt", "r")
elsif fileType == 2 then
file = File.open("Qnum.txt", "r")
end
a = file.read
le = a
file.close()
return le
end
引数fileTypeはLevel.txtとQnum.txtの2つのファイルを1つの関数で開けるようにしたいので、どちらを開くのか分別するためです。
戻り値はレベルです。
次に、ファイルを書き込む関数を作ります。
#FileWrite関数
def FileWrite(contents, fileType) # contentsは保存する値。1ならLevel.txtを書く,2ならQnum.txtを書く。
if fileType == 1 then
file = File.open("Level.txt", "w")
elsif fileType == 2 then
file = File.open("Qnum.txt", "w")
end
file.puts("#{contents}")
file.close()
end
こちらの関数にも関数fileTypeがあります。役割はFileRead関数と同じです。コメントにもありますが、引数contentsはファイルに書き込むです。こちらに戻り値はありません。
最後にFile.rbファイルをまとめます。
# File.rb
def FileRead(fileType) # 1ならLevel.txtを書く,2ならQnum.txtを書く。
if fileType == 1 then
file = File.open("Level.txt", "r")
elsif fileType == 2 then
file = File.open("Qnum.txt", "r")
end
a = file.read
le = a
file.close()
return le
end
def FileWrite(contents, fileType) # sは保存する値。1ならLevel.txtを書く,2ならQnum.txtを書く。
if fileType == 1 then
file = File.open("Level.txt", "w")
elsif fileType == 2 then
file = File.open("Qnum.txt", "w")
end
file.puts("#{contents}")
file.close()
end
最後にQnum.txtファイルとLevel.txtファイルを作成します。どちらにも0を記述しといてください。
以上でファイル保存する仕組みの解説・作成は終わります。
レベルアップをチェックする関数
最後にレベルアップかチェックする関数をつくります。CheckLevelUp関数を作ります。これは新しくCheckLevelUp.rbファイルを作ります。
def CheckLevelUp(level,qnum) #qはいままでの正解数
if qnum % 10 == 0 then
FileWrite(level.to_i + 1, 1)
puts "レベル#{level.to_i + 1}になったよ。おめでとう!"
end
end
10問解いたごとにレベルをアップさせるようにしています。.to_iはint型への変換です。
以上でレベルアップをチェックする仕組みの解説・作成を終わります。
ファイルをまとめる(完成)
では、最後にmain.rbファイルとFile.rbファイルとCheckLevelUp.rbファイルをつなげます。
#test.rb
require "./File.rb"
require "./CheckLevelUp"
random = Random.new();
num_of_correct = 0 #正解数
level = FileRead(1)
qnum = FileRead(2)
puts "あなたはレベル#{level}です。"
puts "問題数を入力してください。"
md = gets.to_i #解く問題数を取得
puts "#{md}問、出題します。"
md.times {
num1 = rand(10)
num2 = rand(10)
puts "#{num1} + #{num2} = ?"
ans = num1 + num2 #解答をansに代入
guess = gets.to_i #問題の回答を取得
if guess == ans then
puts "正解!"
num_of_correct += 1 #正解したら正解数を1増やす。
CheckLevelUp(level, qnum.to_i + num_of_correct)
else
puts "不正解"
puts "正解は#{ans}です。"
end
}
if num_of_correct == md then #出題数と正解数が等しいなら
puts "全問正解おめでとう!!"
else
puts "もっとがんばろう。"
end
FileWrite(qnum.to_i + num_of_correct, 2) #qnumをintに変換して正解数と足す
1 , 2 , 3行目で今までの.rbファイルを読み込んでいます。
問題を正解したときに、レベルアップのチェックし、正解したタイミングでレベルアップが表示されるようにしていますが、正解したタイミングでレベルを変数に代入して保持し、最後に表示する方法もあったと思います。(29行目)
以上で全体の解説を終わります。
まとめ(振り返り)
では、今回の計算ゲーム制作を振り返っていきます。
私は、普段CやC++を使ったプログラムを多く組んでいるのですが、今回は久しぶりにRubyでプログラムを作りました。そのため、一番迷ったのは型がないことです。やはり、なにかと違和感がありますね。
以前まで、不便だと思っていたこの仕様ですが、今回の制作でこれはこれで使いやすいかもしれないと感じました。これからもRubyの記事を書いていくと思うので、引き続き見守ってください。
最後まで、読んでいただきありがとうございました。
コメント