Ruby – Trying to create an unbeatable game
我正在尝试创建我创建的游戏版本,其中程序(计算机)总是获胜。游戏是石头剪刀布。
我是 Ruby 的初学者,我已经成功创建了游戏的”普通”版本,计算机随机选择结果。我一直在寻找一段时间,并在这个简单的问题上停留了大约一天。
如果有人能指出我的写作方向,因为我真的不想为我解决解决方案,因为我真的在努力学习这一点。但我觉得我错过了一些重要的东西。我有使用 Minimax 算法的想法,所以我也开始阅读它。
我对这个问题的不同解决方案持开放态度。
以下是我目前的”普通”版本的游戏。还有我认为需要进行更改的部分……计算机根据用户输入进行选择。然后我将展示我在同一个游戏中尝试制作的部分,但让计算机始终获胜。
问题:我如何让计算机根据用户输入正确选择?我知道 Ruby 中存在许多选项,我对可以合并到我的程序中的不同解决方案或解决方案类型持开放态度。
感谢您提前做出任何/所有回复。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def get_player_play
prompt @player_play = gets.chomp.upcase.to_sym @winner = :invalid if @player_play != :R || :P || :S @winner = :score if @player_play == :X @winner =“” if @player_play == :Q end def get_computer_play def get_winner |
这是我尝试过的(加上同类型 if/else 语句的许多变体)。
1
2 3 4 5 6 7 8 9 10 11 |
#this makes it a tie
def get_computer_play if NAME[@player_play] == ( NAME[:R] ) return @computer_play = WIN[:P] elsif NAME[@player_play] == ( NAME[:P] ) return @computer_play = WIN[:S] else NAME[@player_play] == ( NAME[:S] ) return @computer_play = WIN[:R] end end |
- 在我们为您提供帮助之前,您将需要进一步削减它。这与其说是一个技术问题,不如说是一个代码转储。
- 为避免混淆自己,请非常注意缩进,尽量避免无缘无故的单线事情。 Ruby 允许许多在技术上有效但难以阅读的速记。一行中的 if … then … end 就是一个这样的例子。将其展开,使分支清晰。
- 谢谢你们的快速回复。现在正在为初学者修剪代码……
- 这段代码很混乱,尽管我会说这对于刚入门的人来说是正常的。您要做的是尝试创建具有单一、明确目的的方法,并为这些方法命名以传达其意图和功能。 get_computer_play 不接受任何输入,它只是使用碰巧四处乱跳的状态信息,而且它以一种远不清楚的方式这样做。更好的方法是 computer_play_for(move) ,它是自包含的。
- 我不知道井字游戏的详细程度,计算机是否有可能按照您的要求在任何情况下都获胜?
- @maxpleaner 这是石头剪刀布,不是井字游戏。 (为了记录,在任何井字游戏中至少有可能迫使平局。)
- @tadman 谢谢。这是我第一次尝试 Ruby 程序,您的建议很有道理。现在将工作。
- 还有一点需要注意的是,@player_play != :R || :P || :S 并不像你想象的那样做,它等同于 (@player_play != :R) || :P || :S。 ||= 首先被评估,而 :P || :S 从未被评估,因为这是第一个非逻辑错误值被发现。您可能的意思是 ![:R, :P, :S].include?(@player_play) 如果您经常使用它,该数组应该以一个常量结尾。这是因为运算符优先级。
- 如果没有计算机作弊,这可能吗?
- @SagarPandya那是我的目标:)我想要一个版本的游戏…正常的计算机选择随机轮流。我做到了,它有效!第二个版本的目标是根据用户输入使计算机作弊。
- 我了解您不想要显示如何修复代码的答案。您是否想要完整解决方案但采用不同方法的答案(例如@SagarPandya 的答案)?我认为看到更多类似 Ruby 的方法来解决问题对您有利。无论如何,请编辑以澄清这一点。
- @caryswoveland。感谢您的留言。我将在几个小时内为新家庭成员的健康预约回来后编辑该消息!是的,我会很感激另一种方法……我刚得到一本关于邮件面向对象的 ruby?? 的书,我也正在研究它。
这是一种不同的、更像 Ruby 的方法。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
WINNERS = {“rock”=>“paper”,“scissors”=>“rock”,“paper”=>“scissors” }
def cheat cheat #=> (enter”rock”) “You lose, computer chooses paper.” |
要创建一个被操纵的游戏,请使用类似于以下行的 case-expression:
1
2 3 4 5 6 7 8 9 10 11 |
puts“Rock, paper or scissors?”
ans = gets.downcase.chomp case ans |
来源:https://www.codenong.com/49158527/