Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在线程/循环中只运行一次_Ruby_Multithreading_Output - Fatal编程技术网

Ruby 在线程/循环中只运行一次

Ruby 在线程/循环中只运行一次,ruby,multithreading,output,Ruby,Multithreading,Output,我用ruby制作了一个名为“Pushback”的街机游戏,你把每个数字都推回到零,游戏的目标是不让任何数字超过9。但是刷新屏幕时有一个问题,屏幕输出线程只给出开始状态(000),不输出除此之外的任何内容 代码如下: $screen = '000' Thread.new do loop do puts $screen sleep 1 $screen[0] = ($screen[0].to_i + 1).to_s $screen[1] = ($screen[1].

我用ruby制作了一个名为“Pushback”的街机游戏,你把每个数字都推回到零,游戏的目标是不让任何数字超过9。但是刷新屏幕时有一个问题,屏幕输出线程只给出开始状态(000),不输出除此之外的任何内容

代码如下:

$screen = '000'
Thread.new do
  loop do
    puts $screen
    sleep 1
    $screen[0] = ($screen[0].to_i + 1).to_s
    $screen[1] = ($screen[1].to_i + 1).to_s
    $screen[2] = ($screen[2].to_i + 1).to_s
    clear
  end
end
loop do
  case gets.chomp.downcase
  when ?l
    $screen[0] = '0'
  when ?m
    $screen[1] = '0'
  when ?r
    $screen[2] = '0'
  end
end
编辑:

(1) 我曾尝试在线程外创建一个函数,然后从内部调用它,但仍然不起作用

(2) 其中一个答案是关于互斥的。我用了它,它起了作用。这是最后的代码


我建议使用互斥锁锁定
$screen
变量


您可以在这里看到。

您的
clear
命令在做什么?你在哪里定义它?哦,对了,我没有定义它,它会清除屏幕(系统“清除”),你不必使用
。要使用
,数组就可以了
屏幕=[0,0,0]
。然后,您还可以使用
screen.map更新所有屏幕!{| x | x+=1}
(记住然后将
'0'
更改为
0
)谢谢,这是一个很好的解决方案。要清除屏幕,您可以使用
system('clear')
,它可以在Mac osx上工作,可能还有其他unix系统。