学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Rubyプログラミング入門その13 簡単なゲームを作成

<<前  [TOP]  次>>


メモ帳を開いて次のプログラムを作ってみましょう。


【saikoro1.rb】

# saikoro1.rb

def throwDices(score)
	me1 = rand(0..5).to_i
	me2 = rand(0..5).to_i
	showDices( me1, me2 )
	score = checkPoints( me1, me2, score )
	return score
end

def showDices( a, b )
	diceStrings = ['| * |', '| : |', '|...|', '|: :|','|:.:|','|:::|']
	puts ''
	puts (diceStrings[a]).to_s + ' ' + (diceStrings[b]).to_s
	puts ''
end

def checkPoints( a, b, score )

	bet = 5
	c = a + b + 2
	if ( c%2 == 0 ) then
		if ( a == b ) then
			score += bet*2
			puts 'あなたは ' + (bet*2).to_s + '$ 勝ちました。'
		else 
			score += bet
			puts 'あなたは ' + bet.to_s + '$ 勝ちました。'
		end
	else
		if( c == 7 )
			score -= bet*15
			puts 'あなたは ' + (bet*15).to_s + '$ 負けました。'
		else
			score -= bet*10
			puts 'あなたは ' + (bet*10).to_s + '$ 負けました。'
		end
	end
	puts 'あなたの持ち金は' + score.to_s + '$ です。'
	return score
end

def keyInput()

	begin
		gets
        rescue
	end
end

def main()
	score = 100
	round = 1

	while ( score > 0 ) do
		puts ''
		puts 'エンターキーを押してください。'
		keyInput()
		puts ''
		puts 'ラウンド:' + round.to_s
		score = throwDices(score)
		round += 1
	end
	puts 'あなたのお金はなくなりました。ゲームオーバーです。'
end

main()



まず最初に次の文を見てください。

diceStrings = ['| * |', '| : |', '|...|', '|: :|','|:.:|','|:::|']

これは、サイコロを記号で作っています。
シングルコーテーション(')で囲まれた部分が配列の箱一つに入ります。


mainメソッドでは、while文を使ってscoreが0になるまでループを行っています。
呼び出されるメソッドはkeyInput()とthrowDices()です。
まずは、keyInputメソッドから説明します。

def keyInput()

	begin
		gets
        rescue
	end
end

ここでは、begin,rescueの構文を使っています。

	begin
		実行文
        rescue
		実行文
	end

まず、beginの実行文には「何をしたときに」というのが入ります。 
今回は、gets「キーボードからの入力があった時に」という形になります。


getsは標準入力といいます。
今回のプログラムでは、何か入力があるまで待機するといった処理を行います。
何か入力があれば次の処理に進みます。
一時停止みたいなものです。


rescueは「もし入力にエラーが生じたら、rescueの実行文の内容を行いなさい」という意味になります。
今回は、実行文がありませんので実際にエラーがあっても何も起きません。


rand(0..5)という記述で、0から5までの整数がランダムに出ます。
ここで得られた2つの変数は、showDices()とcheckPoints()の二つのメソッドに引数として渡されます。
showDices()は、渡された2つの数字をサイコロにして表示しています。
checkPoints()は与えられた数字に対して、配当を決めています。
今回のプログラムの勝敗は、偶数か奇数か、同じ目が出たかどうかしか判定していません。


条件によって変数scoreに数字が足し引きされreturnで返しています。


実行してみましょう。
f:id:MrRadiology:20180117162658p:plain


メモ帳を開いて次のプログラムを作ってみましょう。


【saikoro2.rb】

# saikoro2.rb

@score = 100
@bet = 5
@round = 1
@choice = 0

def throwDices()
	me1 = rand(0..5).to_i
	me2 = rand(0..5).to_i
	showDices( me1, me2 )
	checkPoints( me1, me2)
end        

def showDices( a, b )
	diceStrings = ['| * |', '| : |', '|...|', '|: :|','|:.:|','|:::|']
	puts ''	
	puts (diceStrings[a]).to_s + ' ' + (diceStrings[b]).to_s
		puts ''
end

def checkPoints( a, b )
	c = a + b + 2
        d = 0
        if( c%2 == @choice ) then
	        if ( a == b || c == 7 ) then
			d = @bet*2
                else
                        d = @bet
		end
		print  'あなたは'
		print d.to_i
		puts '$を手に入れました!'
		@score = @score + d.to_i

	else
		if ( a == b || c == 7 ) then
			d = @bet*2
       		else
			d = @bet
		end
		print  'あなたは'
		print d.to_i
		puts '$負けました。'
		@score = @score - d.to_i
	end
	puts 'あなたの持ち金は ' + @score.to_s + '$です。'
end

def keyInput()

	begin
		s = gets
        rescue
		puts '予期しないエラーが起きました'
	end
	return s
end

def choice()

	puts ''
	puts '偶数か奇数かを選んでエンターを押してください。'
	puts '偶数ならEVEN 奇数ならODDと入力してください。'
        print 'EVEN or ODD-> '

        str = keyInput()
        if ( str[0] ='e' || str[0] = 'E' ) then
	        @choice = 0
        else
                @choice = 1
        end
end

def bet()
	puts ''
	puts '掛け金を入力してください'
	print '-> '
	@bet = keyInput()
end

def main()
	while ( @score > 0 ) do
		puts ''
		puts 'ラウンド:' + @round.to_s
		choice()
		bet()
                throwDices()
                @round += 1
	end
	puts 'あなたのお金はなくなりました。ゲームオーバーです。'
end

main()



このプログラムでは、「インスタンス変数」というものを使用しています。
インスタンス変数は変数名の前に「@」が付きます。

@score = 100
@bet = 5
@round = 1
@choice = 0

インスタンス変数を使用すると、プログラムの中で値を保持し続ける事が出来ます。
プログラム内の全メソッドで共通して使用することが出来るのでとても便利です。


checkPoint()メソッドを見てみます。

c = a + b + 2

最後に2を足しているのは、次の条件に理由があります。

if ( a == b || c == 7 ) then

このc == 7に当てはめる確率を上げています。
2を足さなければ、1と6の組み合わせしかありません。

str = keyInput()
if ( str[0] ='e' || str[0] = 'E' ) then

これは、strの最初の文字がeかEならばという意味です。


出力結果を見てみましょう。
f:id:MrRadiology:20180119093130p:plain


<<前  [TOP]  次>>