2017-04-01 37 views
0

我爲Rock,Paper,Scissors創建了一個基於統計的'AI'系統,它使用數據庫來存儲下一個最常拋出的玩家投擲的具體模式。它們以下面顯示的方式存儲在數據庫中。PHP邏輯協助(選擇陣列中的最高值/隨機選擇是否匹配)

ThrowHistory - [[Player Throws],[AI Throws]] (JSON Encoded Array) | Rock | Paper | Scissors 
[["Paper","Scissors","Paper"],["Rock","Paper","Rock"]]   |  4|  3|  4 

使用在數據庫中顯示的信息(如上圖所示),我需要得到的,石頭,剪刀領域的最高值,並返回字段名(以顯示最常用的擲)。如果像上面的例子那樣,最高值是在兩個/三個字段中,它們需要在它們之間隨機選擇,所以在這種情況下,它必須在Rock和Scissors之間隨機選擇。

我目前使用的代碼是:

$StrQuery = "SELECT Rock, Paper, Scissors FROM tblThrows WHERE ThrowHistory = ?"; 
    $StrThrowHistory = json_encode($_SESSION["ThrowHistory"]); 
    if ($statement = TF_Core::$MySQLi->DB->prepare($StrQuery)) { 
     $statement->bind_param('s', $StrThrowHistory); 
     $statement->execute(); 
     $results = $statement->get_result(); 
     $row = $results->fetch_assoc(); 

     $LstThrowNumbers = array("Rock" => $row["Rock"], "Paper" => $row["Paper"], "Scissors" => $row["Scissors"]); 
    } 

    if(count(array_unique($LstThrowNumbers)) != 1){ 
     return array_search(max($LstThrowNumbers), $LstThrowNumbers); 
    } 
    else{ 
     $LstOutcomes = array("Rock", "Paper", "Scissors"); 
     $IntPredictedThrow = rand(0, 2); 
     return $LstOutcomes[$IntPredictedThrow]; 
    } 

然而,這段代碼似乎沒有工作(沒有錯誤只是跳到別的),這樣即使它沒有它不是一個完美的解決方案,因爲它會在所有3個選項中隨機選擇,而不是兩個最高值。所以我需要找出一個新的解決方案,但是這是我擺脫了簡單的想法。有什麼建議麼?謝謝。

回答

1

您可以創建次的感動已經出現數訂購一個新的數組,並使用shuffle隨機化在多場比賽最高的情況下,順序爲:

//in your case, $row is returned from sql 
$row = [ 
    'rock'=>4, 
    'paper'=>3, 
    'scissors'=>4 
]; 

//array to hold values index by number of times move has appeared 
$temp=[]; 

foreach($row as $k=>$v) 
    $temp[$v][]=$k; 

//sort the array, the last element now holds the highest move(s); 
ksort($temp); 

//get the last element, this is an array with 1,2 or 3 elements 
$highest = array_pop($temp); 

//shuffle the array, randomizing the order 
shuffle($highest); 
//grap the last elements in the shuffled array 
$chosen = array_pop($highest); 

var_dump($chosen); //will randomly show rock or scissors 
+0

謝謝,已經完美。 –

+1

@ThomasSmyth沒問題,很高興我能幫到你 – Steve