Arrays Ruby:如何替换数组中的元素?

Arrays Ruby:如何替换数组中的元素?,arrays,ruby,methods,Arrays,Ruby,Methods,我正在制作一个简单的井字游戏,我的网格完全撞到了墙 每次玩家做出选择时,我都会“放置@grid”,包括玩家输入。我怎样才能做到这一点?我几乎完全是Ruby的初学者,以前从未制作过任何游戏。非常感谢您的帮助,提前谢谢 我试着制作两个不同的网格(网格和带有网格标记的网格),但不知道从哪里开始。回顾过去,拥有两个网格似乎也是个坏主意。我也尝试过使用散列(marker_positions),但与数组相比,这似乎过于复杂了 这是网格 def initialize @possible_choice

我正在制作一个简单的井字游戏,我的网格完全撞到了墙

每次玩家做出选择时,我都会“放置@grid”,包括玩家输入。我怎样才能做到这一点?我几乎完全是Ruby的初学者,以前从未制作过任何游戏。非常感谢您的帮助,提前谢谢

我试着制作两个不同的网格(网格和带有网格标记的网格),但不知道从哪里开始。回顾过去,拥有两个网格似乎也是个坏主意。我也尝试过使用散列(marker_positions),但与数组相比,这似乎过于复杂了

这是网格

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"