Rubyでレベルアップの仕組みを作ろう!(ファイルでデータ保持)

Ruby

 こんにちは。今回は、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の記事を書いていくと思うので、引き続き見守ってください。

 最後まで、読んでいただきありがとうございました。

 

コメント

タイトルとURLをコピーしました