Final-Fantasy-13-2

時鐘拼圖的手有什麼簡單的解決方案嗎?

  • April 26, 2019

在導致迷你游戲的時間裂縫中,有沒有什麼簡單的方法或有用的技巧來解決時鐘謎題?一般來說,我會隨機選擇一些選項,並希望它們能奏效。我想玩 RPG——不是 Super Magic Happy Clocks,但我離題了……

我了解基本概念,並且我意識到每個謎題都是隨機生成的,因此沒有預先確定的解決方案。非常歡迎任何提示/建議。

那裡有一些時間求解器。

我個人認為這些是最好的:

http://clockpuzzle.pl/(它是線上的,所以沒有什麼可下載的)

或者

http://www.mediafire.com/?dar4yh69lxcaavh

手動進行,我發現獲得正確解決方案的最佳方法是查看板上的每個數字,並標記哪些數字可以成為鏈中的下一個數字。我沒有繼續這個鏈條,而是順時針移動到下一個數字,直到我建立了一個值表。該表通常足以找出正確的鏈。

因此,例如,採用以下時鐘:

 2
2   2
3   1
 1

為每個數字分配一個字母,從頂部的 2 開始並按順時針方向工作,我可以生成如下表格:

   A | B | C | D | E | F
--------------------------
A   x | x | o | x | o | x
B   o | x | o | x | x | x
C   x | o | x | o | x | x
D   x | o | x | x | x | o
E   x | o | x | x | x | x
F   x | o | x | o | x | x

由此,我可以看出E必須通向B。通過消除鎖定在鏈條中的其他選擇,我可以得出正確的解決方案,即:

AEBCDF

這可以擴展到任何大小的時鐘,但它很乏味。因此,我決定用 PHP 編寫一個自動化解決方案:

<?php

// Supply clock values clockwise.
// Keys can be anything you want to use to remember the positions.
$clock = array(
 'a' => 2,
 'b' => 1,
 'c' => 1,
 'd' => 2,
 'e' => 3,
 'f' => 2,
);

$positions = array_keys($clock);
$values = array_values($clock);

// Test all possible starting positions.
for ($i = 0; $i < count($clock); ++$i) {
 $chain = test_clock($values, $i);

 // When the solution has all values, it's the right one.
 if (count($chain) == count($clock)) {
   break;
 }
}

// Use the user-supplied keys.
$solution = array();
foreach ($chain as $position) {
 $solution[] = $positions[$position];
}

print 'The solution is: ' . implode($solution, ' → ') . PHP_EOL;

/**
* Recursively test the clock based on a supplied position.
*
* @param array $values
*   The current values of the clock.
* @param integer $i
*   The current position of the clock.
* @param array $chain
*   The current possible solution.
*
* @return
*   An array of positions that represents a possible solution.
*/
function test_clock(array $values, $i, array $chain = array()) {
 // If the value of the position we're in is 0, we've already tested it.
 if ($values[$i] == 0) {
   return $chain;
 }

 // Find the next two positions.
 $position1 = $i + $values[$i];
 $position2 = $i - $values[$i];

 // Account for wraparound in the array.
 if ($position1 > count($values) - 1) {
   $position1 -= count($values);
 }
 if ($position2 < 0) {
   $position2 += count($values);
 }

 // Mark this position as tested.
 $values[$i] = 0;
 $chain[] = $i;

 // Test the first position.
 $solution = test_clock($values, $position1, $chain);

 // Don't bother checking the second position if the first is correct.
 if (count($solution) == count($values)) {
   return $solution;
 }

 // Test the second position.
 return test_clock($values, $position2, $chain);
}

把它放到一個文件中,比方說hands-of-time.php,然後從網路伺服器或通過 PHP CLI 執行它:

$ php hands-of-time.php
The solution is: a → e → b → c → d → f

將數組更改$clock為拼圖。例如,這是一個較大的時鐘:

$clock = array(
 'a' => 2,
 'b' => 2,
 'c' => 2,
 'd' => 4,
 'e' => 2,
 'f' => 2,
 'g' => 3,
 'h' => 3,
 'i' => 6,
 'j' => 4,
 'k' => 5,
 'l' => 3,
);

這是輸出:

The solution is: a → k → f → h → e → g → j → b → d → l → i → c

引用自:https://gaming.stackexchange.com/questions/50503