def kerikata1()
 x=["インステップで","サイドキックで","おもいっきり"]
 puts"蹴り方を選択してください"
 while true
  puts"インステップ:0 サイドキック:1 おもいっきり:2"
   a = gets.chomp!.to_i
   if a == 0 || a ==1 || a == 2 
     break
    else
      puts"正しく入力してください"
     redo
    end
  end

  y = ["右","左","真ん中"]
  puts"コースを選択してください"
  while true
    puts"右:0 左:1 真ん中:2"
    b = gets.chomp!.to_i
    if b== 0 || b ==1 || b == 2 
      break
    else
       puts"正しく入力してください"
       redo
      end 
  end
   printf("あなたは%sに%s蹴りました\n",y[b],x[a])
  end

def kerikata2()
  x=["インステップで","サイドキックで","おもいっきり"]
  srand
  a = rand(3)
  y = ["右","左","真ん中"]
  srand
  b= rand(3)
  printf("相手は%sに%s蹴りました\n",y[b],x[a])
end


def result1(a)  
  i = 0
  if 0 == a
    i += 1
  elsif 1 == a
    i += 1
  elsif 2 == a
    i += 0
  elsif 3 == a
    i += 0
  end 
end


def result2(b)
  c = 0
  if 0 == b
    c += 1
  elsif 1 == b
    c += 1
  elsif 2 == b
    i += 0
  elsif 3 == b
    i += 0  end
end

puts"PK対決!"
sleep(1)
puts"あなたには蹴る強さとコースを選択してもらいます。"
sleep(1)
puts"それぞれ5回ずつ蹴ってもらい、合計スコアが高いほうが勝利です。"
sleep(1)
puts"準備は良いですか(y or n)\n"
junbi = gets.chomp!

if junbi == "y"
  sleep(1)
  puts"それではゲームスタート!"
else
  print"そうですかさようなら\n"
  exit(1)
end

sum1 = 0
sum2 =0

kekka=["ゴール!!","ポストに当たってゴール!","キーパーパンチング!",キーパーキャッチ!"]

5.times do
  srand
  kerikata1
  a = rand(4)
   3.times do
      sleep(0.7)
      print"."
    end
  p kekka[a]
   sum1 += result1(a)
   sleep(1)
  puts"相手のターンです"
  kerikata2
  b = rand(4)
  3.times do
      sleep(0.7)
      print"."
    end
  p kekka[b]
  sum2 += result1(b)
end
printf("あなたのスコアは%d点です\n",sum1)
printf("相手ののスコアは%d点です\n",sum2)

if  sum1 >  sum2
 puts"あなたの勝利です"
elsif sum1 < sum2
 puts"あなたの負けです"
else 
 puts"引き分けです"
end

 

2.プログラムの実行結果

 PK対決!

あなたには蹴る強さとコースを選択してもらいます。

それぞれ5回ずつ蹴ってもらい、合計スコアが高いほうが勝利です。

準備は良いですか(y or n)

y

それではゲームスタート!

蹴り方を選択してください

インステップ:0 サイドキック:1 おもいっきり:2

0

コースを選択してください 

右:0 左:1 真ん中:2

1

あなたは左にインステップで蹴りました

..."ポストに当たってゴール!"

相手のターンです

相手は右にサイドキックで蹴りました

..."ゴール!!"

蹴り方を選択してください

インステップ:0 サイドキック:1 おもいっきり:2

1

コースを選択してください 

右:0 左:1 真ん中:2

2

あなたは真ん中にサイドキックで蹴りました

..."キーパーパンチング!"

相手のターンです

相手は左におもいっきり蹴りました

..."ポストに当たってゴール!"

蹴り方を選択してください    

インステップ:0 サイドキック:1 おもいっきり:2

2

コースを選択してください

右:0 左:1 真ん中:2

2

あなたは真ん中におもいっきり蹴りました

..."ゴール!!"

相手のターンです

相手は左におもいっきり蹴りました

..."ゴール!!"

蹴り方を選択してください

インステップ:0 サイドキック:1 おもいっきり:2

1

コースを選択してください

右:0 左:1 真ん中:2

0

あなたは右にサイドキックで蹴りました

..."キーパーパンチング!"

相手のターンです

相手は右にインステップで蹴りました

..."ゴール!!"

蹴り方を選択してください

インステップ:0 サイドキック:1 おもいっきり:2

1

コースを選択してください

右:0 左:1 真ん中:2

0

あなたは右にサイドキックで蹴りました

..."ゴール!!"

相手のターンです

相手は真ん中にサイドキックで蹴りました

..."キーパーキャッチ!"

あなたのスコアは3点です

相手ののスコアは4点です

あなたの負けです

3.プログラムの説明

まず初めに一つ目のメソッド(kerikata1)にplayer側に蹴り方を選択してもらうメソッドを作成しました。

蹴り方の選択肢をxという配列にいれ、aという変数にgets.chomp!.to_i でplayer側に蹴り方の方法を番号で入力してもらうように促し、もし選択肢にない番号を選んだら全体をwhile trueで囲んでいるのでredoでもう一度入力するように促します。

今度は蹴る方向をyという配列に入れ蹴り方を選択してもらった時のようにbという変数にgets.chomp!.to_iを使い入力を促します。もし選択肢にない番号を選んだらこちらも全体をwhile trueで囲んでいるのでredoでもう一度入力するように促します。

printfでそれぞれの選んだ番号をxとyの配列に入れ蹴り方を表示します。

 

二つ目(kerikata2)のメソッドではcomputerの蹴り方決めます。

一つ目のメソッドと同じようにxとyの配列を作り、乱数を使い0~3の番号を抽出し、その番号を配列にいれprintfで表示させます。computer側の蹴り方はランダムになります。

 

三つ目(result1)のメソッドにはplayer側のスコアを計算するif文を設定しました。

 

四つ目の(result2)のメソッドにはcomputer側のスコアを計算するif文を設定しました。

 

つぎからは実際に表示するプログラムをかきました。

最初はゲーム説明の文の表示をし、すぐにゲームが始まらないように準備がよかったらy、それ以外だったらnで、ゲーム開始するかを選択してもらいます。

 

sum1という変数はplayer側スコア、sum2という変数にはcomputer側のスコアを表します。

 

kekkaという配列にシュートを打った時の結果の文を入れました。

設定したメソッドkerikat1を実行し結果がすぐに表示されされてしまったらドキドキ感がないので0.7秒後に.(ピリオド)を表示しそれを3times.doで三回繰り返すようにします。次に乱数を使い0~3までの数字をランダムに抽出します。結果の配列に代入し、結果を表示します。結果はランダムになります。sum1に三つ目に設定したresult(a)を足します。

このメソッドにはaという引数にさっきランダムに抽出した数字を入れます。Kekkaの配列でゴールしている文を表しているのkekka[0]kekka[1]なのでランダムに抽出した数(0か1)と等しかったらiという変数に+1しkekka[2]kekka[3]はゴールには入ってないので

ランダムに抽出した3と4が等しかったらiに+0をします。そしてsum1にもどってきたiを足します。

今度はcomputer側になりkerikata2で蹴り方を表示し、player側と同じように表示しスコアを足します。

それを5.times doで五回繰り返します。

 

最後にif文でsum1とsum2比べスコアが大きかったら勝ち、小さかったら負け、それ以外だったら引き分けと表示させます。

 

4.感想

どんなお題にするか迷った。始めヌメロン(数字あてゲーム)とか作ったがdef-endをちゃんと使いこなせてりか不安だったのでやめたりして苦労した。

 

5.ファイルの添付

 

 

Windows 10 版のメールから送信