Передача аргументов в функции в ruby ​​с использованием переменных - PullRequest
0 голосов
/ 10 марта 2012

После урока Зед А. Шоу , я пишу футбольный матч. Мой код пока выглядит следующим образом:

$team_a_players = ["Basar", "Mehmet", "Abdullah", "Alpaslan", "Salih", "Recep", "Ibrahim", "Orhan", "Hakki", "Yakup", "Serdar"]
$team_a_substitutes = ["Hasan", "Turgay", "Umit"]
$team_b_players = ["Habib", "Erkan", "Sahin", "Cemal", "Ahmet", "Fikret", "Yucel", "Pergel", "Ali", "Sabri", "Yilmaz"]
$team_b_substitutes = ["Abdulkadir", "Gokhan", "Mustafa"]
$yellow = []
$red = []
$reasons = ["corner", "direct attack", "free kick", "side attack", "speed kick"]
$team_a_attack = 90.0
$team_a_defense = 80.0
$team_b_attack = 70.0
$team_b_defense = 60.0
$team_a_goals = 0
$team_b_goals = 0

def prompt()
  print "> "
end

def dice()
  if rand(2) == 0
    round_team_a()

  else
    round_team_b()
  end
end

def fauls()
  if rand(0) > 0.95 and rand(10) % 2 == 0
    faul_player = $team_a_players[rand(11)]
    if $yellow.include?(faul_player)
      $red.push(faul_player)
      $team_a_players.delete("faulplayer")
      puts "#{faul_player} of Team A gets a red card in #{$i}. minute!"
      puts "Who would you like to substitute in place of #{faul_player}?"
      list_subs_a()
      prompt()
      substitute = STDIN.gets.chomp()
      $team_a_players.push("substitute")
      $yellow.delete(faul_player)

    else
      $yellow.push(faul_player)
      puts "#{faul_player} of Team A gets a yellow card in #{$i}. minute!"
    end

  elsif rand(0) > 0.95 and rand(10) % 2 == 1
    faul_player = $team_b_players[rand(11)]
    if $yellow.include?(faul_player)
      $red.push(faul_player)
      $team_b_players.delete("faulplayer")
      puts "#{faul_player} of Team B gets a red card in #{$i}. minute!"
      puts "Who would you like to substitute in place of #{faul_player}?"
      list_subs_b()
      prompt()
      substitute = STDIN.gets.chomp()
      $team_b_players.push("substitute")
      $yellow.delete(faul_player)

    else
      $yellow.push(faul_player)
      puts "#{faul_player} of Team B gets a yellow card in #{$i}. minute!"
    end

  else
    faul_player = nil
  end
end

def list_subs_a()
  $team_a_substitutes.each {|p| puts p}
end

def list_subs_b()
  $team_b_substitutes.each {|p| puts p}
end

def list_yellow()
  $yellow.each {|p| puts p}
end

def list_red()
  $red.each {|p| puts p}
end

def round_team_a()
  score = $team_a_attack / $team_b_defense * rand(0)
  if score > 1
    goal = 1
    $team_a_goals += 1
    reason = $reasons[rand(5)]
    puts "Team A scored #{goal} goal through a #{reason} in #{$i}. minute!"

  else
    goal = 0
  end
end

def round_team_b()
  score = $team_b_attack / $team_a_defense * rand(0)
  if score > 1
    goal = 1
    $team_b_goals += 1
    reason = $reasons[rand(5)]
    puts "Team B scored #{goal} goal through a #{reason} in #{$i}. minute!"

  else
    goal = 0
  end
end

def match()
  $i = 0
  until $i > 59 do
    dice()
    fauls()
    $i += 1
  end
  puts "Team A scored a total of #{$team_a_goals} goals and Team B scored a total of #{$team_b_goals} goals."
  if $team_a_goals > $team_b_goals
    puts "Team A won against Team B by #{$team_a_goals}:#{$team_b_goals}!"

  elsif $team_b_goals > $team_a_goals
    puts "Team B won against Team A by #{$team_b_goals}:#{$team_b_goals}!"

  else
    puts "It's a tie!"
  end

  if $yellow.length > 0
    puts "Players shown a yellow card are:"
    list_yellow() 

  else
    puts "No yellow cards in the end of the game"
  end

  if $red.length > 0
    puts "Players shown a red card are:"
    list_red()

  else
    puts "No red cards in the end of the game"
  end
end

match()

Отсюда я бы хотел сделать следующее:

  • Замените массивы $yellow и $red хешами, чтобы я также мог сообщать минуты и команды желтых и красных карточек.
  • Замените массивы, начинающиеся с имени $team_, на хэши, чтобы я мог добавить индивидуальные силы атаки и защиты для игроков, чтобы замены означали sth. но прежде чем код станет более сложным, я должен решить, что. Это похоже на этот вопрос относительно php .
  • Определите функции list, round и faul таким образом, чтобы их можно было использовать общими для a_players и b_players. Я попытался сделать team_#{team}_players вместо team_a_players и т. Д., Но не смог достичь этого.

То, что я ищу, - это руководство к этой проблеме, а не решение, чтобы я мог исправить это сам. Ссылка или длинное объяснение в ясных словах намного более приветствуются, чем фиксированный код. И, пожалуйста, обратите внимание, что в учебнике еще не упоминались классы, так что это пока не вариант.

1 Ответ

1 голос
/ 10 марта 2012

Основная идея, которую вы, похоже, не поняли, - это передача аргументов функциям.Предположим, у нас есть две глобальные переменные, и мы хотим выполнить идентичные операции над ними - скажем, умножить элементы массивов на 2. Вы пишете:

$a = [1,2,3]
$b = [2,3,4]

def multiply_a
  result = []
  for element in $a do
    result << element * 2
  end
  result
end

def multiply_b
  result = []
  for element in $b do
    result << element * 2
  end
  result
end

Но этот код очень плох.Прежде всего следует отметить, что в Ruby $a есть специальная переменная - глобальная переменная.Вам никогда не нужно их использовать - написание кода, содержащего их, означает, что с ним что-то не так.Так как это исправить?Основная идея состоит в том, чтобы передать аргумент в функцию, вместо жесткого кодирования переменной, над которой работает функция.Таким образом, вы можете преобразовать код следующим образом:

a = [1, 2, 3]
b = [2, 3, 4]
def multiply(argument)
  result = []
  for element in argument do
    result << element * 2
  end
  result
end
# and then call
multiply(a) # instead of multiply_a
multiply(b) # instead of multiply_b 

Так вы должны исправить свой код.

...