【问题标题】:How to generate a certain amount of numbers and spread them randomly across a grid?如何生成一定数量的数字并将它们随机分布在网格中?
【发布时间】:2017-01-25 16:48:38
【问题描述】:

我想生成数字 2 5 次和数字 1 10 次。我正在尝试将这些随机分布在 Delphi 的字符串网格中。我还想用 0 填充不是 1 或 2 的其余网格。我什至不知道如何从这里开始。

看起来像这样(P 代表玩家,只有 5 个 2 和 10 个 1):https://gyazo.com/aeef05c3a92ce7847c0f42ad40faa733

【问题讨论】:

  • 到目前为止你做了什么?你的确切问题是什么?创建要显示的数字列表?改组该列表?将数字写入网格?
  • 我已经创建了列表并初始化了它们(1 个数组 2 5 次和 1 个数组 1 10 次)。我只是不确定如何将它们随机写入网格。
  • 将网格的所有坐标放入一个数组中。用 Fisher-Yates shuffle 洗牌。用 2 填充前 5 个随机坐标,接下来的 10 个用 1 填充,其余的用 0 填充。
  • 我正在尝试将 1 分配给一个数组,但由于某种原因,我不断收到错误消息。我将它分配给一个动态数组,因为用户输入了行数和列数。尝试分配前 10 个数字时,我不断遇到的错误是:模块“Project1.exe”中地址 00409f9A 的访问冲突。写入地址 00000000
  • 您的代码显然存在缺陷。尝试调试它。这是迄今为止最有效的前进方式。新手程序员往往不擅长调试。让学习如何调试成为您的使命。

标签: delphi pascal


【解决方案1】:

给定一个尺寸为 m×n 的网格,创建一个长度为 m * n 的数组。将 5 个 2 和 10 个 1 放入数组中,其余部分用 0 填充。 (我们假设 m 和 n 的乘积至少为 15。)随机排列数组。将混洗后的数组的每个元素复制到网格中的连续单元格中。

【讨论】:

  • 我必须使用动态数组,因为用户输入了列数和行数。当我尝试分配前 10 个数字时,我收到此错误:模块“Project1.exe”中地址 00409f9A 的访问冲突。写入地址 00000000
  • 这根本不影响这个答案。看起来你有一些调试要做。您是否已将数组设置为所需的大小? (致电SetLength。)
  • 我知道这不是你的错,我只是征求意见哈哈。是的,我设置了动态数组的长度。然后我使用了 2 个 for 循环:N:= Treasure[i]; multiarray[i,j] := IntToStr(N);
  • 除非j 始终为0,否则您最终会到达用于索引网格的i 超出数组边界的点。不过,这不会导致地址 0 的访问冲突。您在其他地方有一个空指针。打开范围检查,打开溢出检查,使用调试器。
  • 您在 Internet 上找不到关于洗牌数组的任何内容?我不相信你。仅在这个网站上就有近 3000 个关于它的问题。去再试一次。或者参考你的教科书。或者问你的导师。
【解决方案2】:

虽然 Rob 回答中表示的方法可以完成工作,但我个人认为它的目的是复杂的。

那么有什么更简单的方法呢?

你的目标是将这些数字放在网格中的随机位置。

如何确定某个对象在网格中的位置?您可以通过其 X(列)和 Y(行)坐标来完成。

那么如何在网格中获得随机位置? Simple 为 X 和 Y 坐标选择了两个随机值。

至于放置一定数量的数字 1 和数字 2 使用两个简单的循环。

【讨论】:

  • 我不确定我明白这有多简单。你如何衡量简单性? (顺便说一句,您的方法是错误的,因为它没有考虑到您选择的位置已经在上一次迭代中填充的情况。我的方法不受这种情况的影响。)
  • @RobKennedy 这可以通过简单检查这些随机坐标处的单元格是否为空来解决。
  • 这是一个检查,我的方法不需要担心。您如何衡量简单性?
  • 我最终用 Rob 的方法弄明白了。洗牌很痛苦,但我在大约 3 小时后发现了如何去做。我本来打算按照你的方法做,但我不确定如何选择随机坐标来放置它们。现在我会坚持 Rob 的方法,但如果我遇到任何问题,我会切换。感谢您的回答。
  • @silver 你没有提到的是你需要检查你是否已经绘制了坐标。所以你最终循环。如果您需要填充网格,那么这可能有点浪费。它肯定比简单的随机播放更复杂。
猜你喜欢
  • 2023-04-08
  • 2021-06-01
  • 2017-04-17
  • 2019-02-09
  • 2018-09-19
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多