2017-04-01 2 views
0

Rock, Paper, Scissors에 대한 통계 기반 'AI'시스템은 DB를 사용하여 플레이어가 가장 일반적으로 다음에 던지는 것을 저장합니다. 특정 패턴의 던졌습니다. 아래에 표시된 방법으로 데이터베이스에 저장됩니다. (위 그림 참조)PHP 로직 어시스턴트 (배열에서 가장 높은 값 선택/일치하면 무작위로 선택)

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

DB에 표시되는 정보를 사용하여, 나는 바위, 종이, 가위 필드의 가장 높은 값을 얻고 (가장 일반적인 던져 쇼) 필드 이름을 반환해야합니다. 위의 예에서와 같이 가장 높은 값이 2/3 필드에있는 경우 무작위로 선택해야하므로이 경우 무작위로 바위와 가위를 선택해야합니다.

내가 현재 사용하는 코드는 다음과 같습니다

그러나
$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