- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在测试Ruby Connect 4游戏中的对角线胜利我一直在用一个硬编码的二维阵列进行测试:
grid_array = [
["B", ".", ".", ".", ".", ".", ".", "."],
[".", "B", ".", ".", ".", ".", ".", "."],
[".", ".", "B", ".", ".", ".", ".", "."],
[".", ".", ".", "B", ".", ".", ".", "."],
[".", ".", ".", "X", "M", ".", ".", "."],
[".", ".", ".", ".", "X", "M", ".", "."],
[".", ".", ".", ".", ".", "X", "M", "."],
[".", ".", ".", ".", ".", ".", "X", "M"]
]
'M'
或
'B'
分别是赢家,但是当我试图将对角线检查移过列或用外环向上移动行以获取
'X'
作为赢家值时,我就卡住了。
def nw_diagonal_win (playing_board)
row = 7
while row < playing_board.size && row >= 0
row = 7
column = 7
piece_count = 0
while (row < playing_board.size && column < playing_board[row].size && column >= 0)
if playing_board[row][column] == 'M'
piece_count += 1
if piece_count == 4
puts "Player is the winner in a diagonal!"
end
puts piece_count.inspect
else
piece_count = 0
puts "No winner."
end
row += 1
column += 1
end
row -= 1
end
end
'X'
和
'0'
表示碎片从网格中的一个列的顶部“掉落”到该列中最底部的可用空间棋子可以堆叠成一列,但不能“漂浮”在棋盘中间。对角线可以从左上角到右下角,也可以从右上角到左下角只有当棋子在网格内不间断(没有环绕)时,才会发生赢球。
def top_left_diagonal (playing_board, player_piece)
row = 0
while row < playing_board.size - 3
piece_count = 0
column = 0
while column < playing_board[row].size - 3 && playing_board[row][column] == player_piece
if (playing_board[row][column] == playing_board[row + piece_count][column + piece_count])
piece_count += 1
else
piece_count = 0
end
column += 1
end
if piece_count == 4
puts "Diagonal winner!"
end
row += 1
end
end
最佳答案
假设我们有
grid = [
%w| . . . . . . |,
%w| . . . w w . |,
%w| . . . w b . |,
%w| b . w . b . |,
%w| w w . w b b |,
%w| b w b b w b |
]
#=> [[".", ".", ".", ".", ".", "."],
# [".", ".", ".", "w", "w", "."],
# [".", ".", ".", "w", "b", "."],
# ["b", ".", "w", ".", "b", "."],
# ["w", "w", ".", "w", "b", "b"],
# ["b", "w", "b", "b", "w", "b"]]
def four_in_a_row_by_row(arr)
arr.each do |row|
a = row.each_cons(4).find { |a| a.uniq.size == 1 && a.first != '.' }
return a.first unless a.nil?
end
nil
end
w
,则此方法返回
w
,如果一行中有四个
b
,则返回
b
,否则返回
nil
。
arr.size == grid.size
或
arr
的所有元素具有相同的大小它只检查任何元素是否有四个或四个连续的
'w'
。这在以后会有意义的。
'b'
的最后一个元素如下。
row = ["b", "w", "b", "b", "w", "b"]
enum0 = row.each_cons(4)
#=> #<Enumerator: ["b", "w", "b", "b", "w", "b"]:each_cons(4)>
enum1 = enum0.find
#=> #<Enumerator: #<Enumerator: ["b", "w", "b", "b", "w", "b"]:each_cons(4)>:find>
arr
可以看作是一个复合枚举器,尽管ruby并没有这样定义它。
enum1.to_a
#=> [["b", "w", "b", "b"], ["w", "b", "b", "w"], ["b", "b", "w", "b"]]
a = enum1.next
u = a.uniq
u.size == 1
enum1
a.first != '.'
的其余两个元素被传递到块中,并为每个元素计算
enum1
,这表示在最后一行中没有四个元素。
four_in_a_row_by_row(grid.transpose)
#=> nil
nil
,然后应用
'w'
。首先确定包含第一列中长度
'b'
或更大的元素的对角线:
(0..grid.size-4).map { |i| (0..grid.size-1-i).map { |j| grid[i+j][j] } }
#=> [[".", ".", ".", ".", "b", "b"], [".", ".", "w", "w", "w"], [".", ".", ".", "b"]]
arr
之外,长度
four_in_a_row(arr)
或更大的元素:
(1..grid.first.size-4).map { |j| (0..grid.size-j-1).map { |i| grid[i][j+i] } }
#=> [[".", ".", "w", "b", "b"], [".", "w", "b", "."]]
def diagonals(grid)
(0..grid.size-4).map { |i| (0..grid.size-1-i).map { |j| grid[i+j][j] } }.
concat((1..grid.first.size-4).map { |j| (0..grid.size-j-1).map { |i| grid[i][j+i] } })
end
arr = diagonals(grid)
#=> [[".", ".", ".", ".", "b", "b"], [".", ".", "w", "w", "w"], [".", ".", ".", "b"],
# [".", ".", "w", "b", "b"], [".", "w", "b", "."]]
four_in_a_row_by_row(arr)
#=> nil
4
90度获得的阵列对角线。
def rotate90(grid)
ncols = grid.first.size
grid.each_index.with_object([]) { |i,a| a << ncols.times.map { |j| grid[j][ncols-1-i] } }
end
arr = rotate90(grid)
#=> [[".", ".", ".", ".", "b", "b"],
# [".", "w", "b", "b", "b", "w"],
# [".", "w", "w", ".", "w", "b"],
# [".", ".", ".", "w", ".", "b"],
# [".", ".", ".", ".", "w", "w"],
# [".", ".", ".", "b", "w", "b"]]
arr1 = diagonals(arr)
#=> [[".", "w", "w", "w", "w", "b"], [".", "w", ".", ".", "w"],
# [".", ".", ".", "b"], [".", "b", ".", ".", "w"], [".", "b", "w", "b"]]
four_in_a_row_by_row(arr1)
#=> "w"
def four_in_a_row(grid)
four_in_a_row_by_row(grid) ||
four_in_a_row_by_row(grid.transpose) ||
four_in_a_row_by_row(diagonals(grid)) ||
four_in_a_row_by_row(diagonals(rotate90(grid)))
end
four_in_a_row_by_row(grid)
#=> "w"
关于arrays - 连接4个对角线赢支票,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53690155/
使用掷骰子游戏中的 10,000 次模拟来计算获胜概率 (wins/(wins + Loss))。下面是双骰子游戏的方法: public class CrapsGame { public st
我想制作一个程序作为检查网,如果地址向上,则返回 1;如果地址向下,则返回 0。代码如下: #include #include #include #pragma comment(lib, "ws
我正在尝试使用 Win API ReadConsole(...),我想传入一个分隔符字符以停止来自控制台的输入。下面的代码有效,但它只会停止读取 \r\n 上的输入。例如,我希望它停止读取 '.' 上
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我想在 d3.js 中制作一个条形图,每个项目或行都有正条和负条,如下所示: 它有点像谷歌金融“行业摘要”图表(http://google.com/finance) 任何人都可以指出我这种图表的 d3
尝试根据 GF 和 GA 创建一个新列“Results”。想知道如何通过定义函数和条件语句来做到这一点。以下是我对一行的初步尝试,但无法弄清楚如何将其应用于所有行,非常感谢您的帮助! 日期地点对手GF
过去,我通过 wpf 使用 mvvmlight 并取得了一定程度的成功。我最近看到了 Caliburn Micro,但我想知道是否有人对此有任何经验。 我看到了 Caliburn Micro 的网站,
我正在尝试将 FFMPEG(我实际上只是在寻找 FFProbe,它包含在 FFMPEG 工具中)编译为适用于 MacOS X、Linux 和可能的 Windows 的独立应用程序。对于独立,我的意思是
你能告诉我你是如何让 PartCover 在 VS2008 上运行并赢得 7 x64 的吗?基于此帖子 How do I run PartCover in x64 windows ,我跑了 c:\Pr
我要抓: 窗口调整大小/移动/最小化/最大化/关闭消息。 鼠标点击和键盘按下。 当用户按 enter 或 dblclick 执行任何程序时。 (如果可能的话?) 这应该与键锁程序的工作方式相同:如果您
我正在创建一个实用软件,其中存储了 PC 的所有详细信息,我设法找到了一个包含我想要的所有详细信息的程序“msinfo32”。 目前的问题是我不知道如何尽快在软件中获取这些信息。 请帮我写一段代码 提
我需要我的一个 .exe 文件在没有 UAC 提示的情况下始终以管理员身份运行。我的程序将与安装程序一起安装,它将有一次管理员权限,我需要在这个安装程序中执行这样的步骤,我的 exe 将始终以管理员身
这个错误发生在前一段时间,2011年 http://cygwin.com/ml/cygwin/2013-11/msg00021.html 根据我在这篇文章和其他一些文章中所读到的内容,我看到他们写了一
关于 tel 协议(protocol)处理程序:除了在窗口 10 下,我的应用程序工作正常。在窗口 10 下需要哪些额外的注册表项才能为 tel 协议(protocol)注册应用程序(因此我的应用程序
我是一名优秀的程序员,十分优秀!