Arrays Ruby:如何替换数组中的元素?
我正在制作一个简单的井字游戏,我的网格完全撞到了墙 每次玩家做出选择时,我都会“放置@grid”,包括玩家输入。我怎样才能做到这一点?我几乎完全是Ruby的初学者,以前从未制作过任何游戏。非常感谢您的帮助,提前谢谢 我试着制作两个不同的网格(网格和带有网格标记的网格),但不知道从哪里开始。回顾过去,拥有两个网格似乎也是个坏主意。我也尝试过使用散列(marker_positions),但与数组相比,这似乎过于复杂了 这是网格Arrays Ruby:如何替换数组中的元素?,arrays,ruby,methods,Arrays,Ruby,Methods,我正在制作一个简单的井字游戏,我的网格完全撞到了墙 每次玩家做出选择时,我都会“放置@grid”,包括玩家输入。我怎样才能做到这一点?我几乎完全是Ruby的初学者,以前从未制作过任何游戏。非常感谢您的帮助,提前谢谢 我试着制作两个不同的网格(网格和带有网格标记的网格),但不知道从哪里开始。回顾过去,拥有两个网格似乎也是个坏主意。我也尝试过使用散列(marker_positions),但与数组相比,这似乎过于复杂了 这是网格 def initialize @possible_choice
def initialize
@possible_choice = [1,2,3,4,5,6,7,8,9]
@marker_positions = [1,2,3,4,5,6,7,8,9]
@grid = "
|----|----|----|
| #{@marker_positions[0]} | #{@marker_positions[1]} | #{@marker_positions[2]} |
|----|----|----|
| #{@marker_positions[3]} | #{@marker_positions[4]} | #{@marker_positions[5]} |
|----|----|----|
| #{@marker_positions[6]} | #{@marker_positions[7]} | #{@marker_positions[8]} |
|----|----|----|
"
end
我想使用一种方法add_markers来显示带有用户输入的网格。因此,当玩家选择数字1时,@marker_位置[0]将替换为“X”(或“O”)。4号将取代@marker_位置[3]等
编辑:我意识到这篇文章的标题有误导性,因为我实际上想用字符串(“X”或“O”)替换@marker\u positions数组的元素。但是替换的元素是根据用户输入选择的,换句话说,player_one和player_two数组
def add_markers
puts @grid
end
这是玩家的单回合方法
def player_one_turn()
puts "Player One, make your choice:"
p @possible_choice
add_markers
@@player_one << @possible_choice.delete(gets.chomp.to_i)
p "Player One has chosen: #{@@player_one}"
end
def播放器一圈()
放置“玩家一,做出选择:”
p@可能的选择
添加标记
@@一号选手
因此,当玩家选择数字1时,@marker_位置[0]将替换为“X”
您只需读取用户输入:(示例显示播放器输入1的结果)
并替换相应的数组元素:(我们必须减去1,因为数组是基于零的)
在网格字符串中使用数组值是另一个问题。通过{…}
的插值发生在创建字符串时,刚好在初始化
中将其分配给@grid
之前。这意味着插值之后更改时,字符串不会被更新–除非再次插值,否则字符串将保持不变:
x = 'foo'
@grid = "hello #{x}"
#=> "Hello foo"
x = 'bar'
@grid
#=> "Hello foo" <- doesn't change
@grid = "hello #{x}"
#=> "Hello bar"
这将导致:(#
不是实际输出的一部分)
grid=grid.new
grid.add_标记
#|----|----|----|
#| 1 | 2 | 3 |
#|----|----|----|
#| 4 | 5 | 6 |
#|----|----|----|
#| 7 | 8 | 9 |
#|----|----|----|
网格标记位置[0]=“X”
网格标记位置[4]=“X”
网格标记位置[8]=“X”
grid.add_标记
#|----|----|----|
#|X | 2 | 3|
#|----|----|----|
#|4 | X | 6|
#|----|----|----|
#|7 | 8 | X|
#|----|----|----|
另一个–可能更干净–选项是使用占位符定义模板,在呈现模板时占位符将被其实际(或当前)值替换:
类网格
TEMPLATE=为什么不把@marker_positions
做成一个3x3矩阵,这样每当用户输入一个位置时,你就可以找到相应的行和列,并更新存储在该位置的值?@StefanRendevski在3×3的网格中选择一个从1到9的插槽似乎比要求用户输入行和列更容易。我也应该尝试一下。谢谢你的回复!谢谢这非常有帮助(如果有点混乱)。我把我的工作游戏上传到github。我知道,天气不太干燥。需要改进。哦,没注意到你修改了答案。那更有用!非常感谢。@Keskiviko不客气。顺便说一句,如果事后看来拥有两个独立的数组似乎是个坏主意,那么你也许应该抛弃它们。毕竟,您正在编写软件,很容易更改:-)
input = gets.to_i
#=> 1
@marker_positions[input - 1] = 'X'
x = 'foo'
@grid = "hello #{x}"
#=> "Hello foo"
x = 'bar'
@grid
#=> "Hello foo" <- doesn't change
@grid = "hello #{x}"
#=> "Hello bar"