Trovare indice carta vincente in un array

di il
13 risposte

Trovare indice carta vincente in un array

Ho questo codice:

function findWinningCard($playedCards)
{
    $valoriCarte = array(
        "Asso" => array("Denare" => 11, "Spade" => 11, "Coppe" => 11, "Bastone" => 11),
        "Tre" => array("Denare" => 13, "Spade" => 13, "Coppe" => 13, "Bastone" => 13),
        "Due" => array("Denare" => 12, "Spade" => 12, "Coppe" => 12, "Bastone" => 12),
        "Re" => array("Denare" => 10, "Spade" => 10, "Coppe" => 10, "Bastone" => 10),
        "Cavallo" => array("Denare" => 9, "Spade" => 9, "Coppe" => 9, "Bastone" => 9),
        "Fante" => array("Denare" => 8, "Spade" => 8, "Coppe" => 8, "Bastone" => 8),
        "Sette" => array("Denare" => 7, "Spade" => 7, "Coppe" => 7, "Bastone" => 7),
        "Sei" => array("Denare" => 6, "Spade" => 6, "Coppe" => 6, "Bastone" => 6),
        "Cinque" => array("Denare" => 5, "Spade" => 5, "Coppe" => 5, "Bastone" => 5),
    );

    $maxValore = -1;
    $winningCardIndex = -1; // Dichiarazione della variabile
    $semePredominante = explode(".", $playedCards[0])[1]; // Seme della prima carta giocata
    $firstCardOfSeme = null;

    foreach ($playedCards as $index => $carta) {
        // Rimuovi l'estensione ".png" dal nome del file della carta
        $nomeCarta = basename($carta, ".png");

        // Dividi il nome della carta e il seme
        list($nomeCarta, $semeCarta) = splitNameAndSuit($nomeCarta);

echo "Nome è: " . $nomeCarta . " Seme: " . $semeCarta . "<br>";
       
	   if ($semeCarta === $semePredominante) {
            // La carta ha il seme predominante, confrontala con le altre
            if ($firstCardOfSeme === null) {
                // Questa è la prima carta del seme predominante giocata
                $firstCardOfSeme = $carta;
            }

            $valore = $valoriCarte[$nomeCarta][$semeCarta];
			
            if ($valore > $maxValore) {
                $maxValore = $valore;
                $winningCardIndex = $index;
            }
        }
    }

    // Se non ci sono carte del seme predominante, restituisci l'indice della prima carta giocata
    if ($winningCardIndex === -1 && $firstCardOfSeme !== null) {
        $winningCardIndex = array_search($firstCardOfSeme, $playedCards);
    }

    return $winningCardIndex;
}





function splitNameAndSuit($filename) {
    $name = "";
    $suit = "";

    $length = strlen($filename);
    for ($i = $length - 1; $i >= 0; $i--) {
        $char = $filename[$i];
        if (ctype_upper($char)) {
            // Se il carattere è maiuscolo, allora abbiamo trovato il seme della carta
            $name = substr($filename, 0, $i);
            $suit = substr($filename, $i);
            break;
        }
    }

    return array($name, $suit);
}

e lo richiamo in questo modo...

$playedCards = array("SeiDenare.png", "TreCoppe.png", "DueDenare.png", "TreSpade.png");
$winningCardIndex = findWinningCard($playedCards);
 echo "Indice carta vincente è: " . $winningCardIndex;
 
 spiego cosa dovrebba fare che non riesco a farglelo fare....
 
La funzione findWinningCard ha il compito di trovare l'indice della carta vincente all'interno dell'array $playedCards, dato l'array delle carte giocate. Per farlo, la funzione utilizza l'array associativo $valoriCarte che contiene i valori numerici delle diverse carte.
Il processo principale della funzione è il seguente:
Viene inizializzata la variabile $winningCardIndex con il valore -1. 
Questa variabile conterrà l'indice della carta vincente nell'array $playedCards.
Viene estratto il seme della prima carta giocata dalla variabile $playedCards[0] utilizzando explode(".", $playedCards[0])[1]. 
Questo seme viene memorizzato nella variabile $semePredominante.

Viene inizializzata la variabile $firstCardOfSeme con il valore null. Questa variabile sarà utilizzata per memorizzare la prima carta giocata con il seme predominante.
Viene eseguito un ciclo foreach per iterare tutte le carte giocate nell'array $playedCards.
Per ogni carta, viene utilizzata la funzione splitNameAndSuit per ottenere il nome della carta e il seme.
Se il seme della carta corrente è uguale al seme predominante, allora la carta appartiene al seme predominante e viene confrontato il valore numerico della carta. 
Se il valore numerico della carta corrente è maggiore del valore massimo trovato finora ($maxValore), viene aggiornato $maxValore con il nuovo valore numerico e viene aggiornato $winningCardIndex con l'indice della carta corrente.
Alla fine del ciclo, se non sono state trovate carte con il seme predominante, la variabile $winningCardIndex rimarrà -1. 
In questo caso, viene verificato se è stata giocata almeno una carta con il seme predominante ($firstCardOfSeme). 
Se sì, viene utilizzata la funzione array_search per trovare l'indice di $firstCardOfSeme nell'array $playedCards e questo indice viene assegnato a $winningCardIndex.
Infine, la funzione restituisce l'indice della carta vincente nell'array $playedCards.
La funzione splitNameAndSuit serve a dividere il nome della carta e il seme. 
Utilizza un ciclo per iterare all'indietro sulla stringa del nome della carta fino a quando trova il primo carattere maiuscolo, che indica l'inizio del seme. Quindi, utilizza la funzione substr per ottenere il nome della carta fino a quel punto e il seme dal punto in cui è stata trovata la prima lettera maiuscola.

MI  RITORNA SEMPRE INDICE -1 IN QUESTO CASO DOVREBBE DARMI INDICE 2 (DueDenare)

13 Risposte

  • Re: Trovare indice carta vincente in un array

    1. i semi Denare e Bastone non li ho mai sentito, devono essere Denari e Bastoni

    2. perchè inserisci .png per ogni seme? Così lui cercherà png che non è un seme

    Basta aggiungere 

    echo "Predominante " . $semePredominante . "\n";

    per capire cosa non va

    P.S. Il testo del post non devi inserirlo come se fosse del codice. Fai attenzione

  • Re: Trovare indice carta vincente in un array

    Perché devo passargli il nome con estensione…

  • Re: Trovare indice carta vincente in un array

    No, non “devi”. E' assurdo che tu passi l'estensione di un file. Nella stringa ci va solo la carta e il seme

    Re Denari

    e la funzione li separa e li gestisce.

  • Re: Trovare indice carta vincente in un array

    $playedCards = array("SeiDenare.png", "TreCoppe.png", "DueDenare.png", "TreSpade.png");
    $semePredominante = explode(".", $playedCards[0])[0]; // Seme della prima carta giocata
    var_dump($semePredominante);

    Non puoi modificare per tentativi, così è con dispendio di tempo e capire il codice. Puoi fornire il codice originale (dunque non creato da te).

    Dopo questa premessa per te che stringa è nel mio codice proposto? ("SeiDenare" nel tuo codice stai deferenziando per la chiave 1 “png”)

    Inoltre non puoi usare l'operatore di post decremento se poi dopo la prima volta chiami nuovamente $i. Quindi splitNameAndSuit($filename) se con valore SeiDenare $name è Sei mentre $suite Denare (la stai utilizzando per variabili tramite la funzione list che crea $nomeCarta, $semeCarta e toglie l'estensione .png con la funzione basename)

  • Re: Trovare indice carta vincente in un array

    Si effettivamente hai ragione….

  • Re: Trovare indice carta vincente in un array

    Sì ma cosa vuoi fare?

    Quel codice va riscritto, tenendo presente che va chiamato con

    $playedCards = array("Sei Denari", "Tre Coppe", "Due Denari", "Tre Spade");
  • Re: Trovare indice carta vincente in un array

    No non e possibile perche prende i nomi file da una directory e i file non possono essere scritti co uno spazio…

  • Re: Trovare indice carta vincente in un array

    Ovvio che è possibile, non scrivere assurdità, basta saperlo fare.

    Sicuramente prima della chiamata puoi eliminare il .PNG facilmente e inserire lo spazio tra carta e seme.

  • Re: Trovare indice carta vincente in un array

    function findWinningCard($playedCards)
    {
        $valoriCarte = array(
            "Asso" => array("Denare" => 11, "Spade" => 11, "Coppe" => 11, "Bastone" => 11),
            "Tre" => array("Denare" => 13, "Spade" => 13, "Coppe" => 13, "Bastone" => 13),
            "Due" => array("Denare" => 12, "Spade" => 12, "Coppe" => 12, "Bastone" => 12),
            "Re" => array("Denare" => 10, "Spade" => 10, "Coppe" => 10, "Bastone" => 10),
            "Cavallo" => array("Denare" => 9, "Spade" => 9, "Coppe" => 9, "Bastone" => 9),
            "Fante" => array("Denare" => 8, "Spade" => 8, "Coppe" => 8, "Bastone" => 8),
            "Sette" => array("Denare" => 7, "Spade" => 7, "Coppe" => 7, "Bastone" => 7),
            "Sei" => array("Denare" => 6, "Spade" => 6, "Coppe" => 6, "Bastone" => 6),
            "Cinque" => array("Denare" => 5, "Spade" => 5, "Coppe" => 5, "Bastone" => 5),
        );
    
        $maxValore = -1;
        $winningCardIndex = -1; // Dichiarazione della variabile
        list($nomeCarta, $semeCarta) = splitNameAndSuit(basename($playedCards[0], '.png'));
        $semePredominante = $semeCarta; // Seme della prima carta giocata
        $firstCardOfSeme = null;
    
        foreach ($playedCards as $index => $carta) {
            // Rimuovi l'estensione ".png" dal nome del file della carta
            $nomeCarta = basename($carta, ".png");
    
            // Dividi il nome della carta e il seme
            list($nomeCarta, $semeCarta) = splitNameAndSuit($nomeCarta);
    
    echo "Nome è: " . $nomeCarta . " Seme: " . $semeCarta . "<br>";
           
    	   if ($semeCarta === $semePredominante) {
                // La carta ha il seme predominante, confrontala con le altre
                if ($firstCardOfSeme === null) {
                    // Questa è la prima carta del seme predominante giocata
                    $firstCardOfSeme = $carta;
                }
    
                $valore = $valoriCarte[$nomeCarta][$semeCarta];
    			
                if ($valore > $maxValore) {
                    $maxValore = $valore;
                    $winningCardIndex = $index;
                }
            }
        }
    
        // Se non ci sono carte del seme predominante, restituisci l'indice della prima carta giocata
        if ($winningCardIndex === -1 && $firstCardOfSeme !== null) {
            $winningCardIndex = array_search($firstCardOfSeme, $playedCards);
        }
    
        return $winningCardIndex;
    }
    
    
    
    
    
    function splitNameAndSuit($filename) {
        $name = "";
        $suit = "";
    
        $length = strlen($filename);
        for ($i = $length - 1; $i >= 0;) {
            $char = $filename[$i];
            if (ctype_upper($char)) {
                // Se il carattere è maiuscolo, allora abbiamo trovato il seme della carta
                $name = substr($filename, 0, $i);
                $suit = substr($filename, $i);
                break;
            }
            $i--;
        }
    
        return array($name, $suit);
    }
    
    $playedCards = array("SeiDenare.png", "TreCoppe.png", "DueDenare.png", "TreSpade.png");
    $winningCardIndex = findWinningCard($playedCards);
     echo "Indice carta vincente è: " . $winningCardIndex;
    
    ?>
  • Re: Trovare indice carta vincente in un array

    Ottimo Hormus ora ho modificato il codice salvo le carte senza estensione…quindo modifichero amche questo… grazie se non ci riesco vi faccio sapere  visto che io in Php sono alle prime armi….

  • Re: Trovare indice carta vincente in un array

    Gli algoritmi e i metodi per programmare sono sempre quelli. Il ragionamento è il medesimo. Se lo sai fare in vb.net o c# lo fai anche in php

    E comunque Denare non si può leggere!

  • Re: Trovare indice carta vincente in un array

    Si lo so in italiano hai ragione tu….dovrò modificare tutte le immagini di denare in denari… a proposito hai voglia di darmi una mano per creare un gioco di carte? vorrei farlo sia on line che of line…ho gia preparato il sistema di stanze gioco… per poter giocare in 4 giocatori a volta… se ne hai voglia contattami ne parliamo…

  • Re: Trovare indice carta vincente in un array

    Per trovare l'indice della carta vincente in un array, puoi utilizzare un semplice ciclo in linguaggio PHP. Ad esempio, se hai un array di carte chiamato $carte e stai cercando una carta specifica chiamata $carta_vincente, puoi farlo in questo modo:

    $carte = array("carta1", "carta2", "carta3", "carta4", "carta_vincente", "carta6");

    $indice_carta_vincente = array_search("carta_vincente", $carte);

    if ($indice_carta_vincente !== false) {

    echo "L'indice della carta vincente è: " . $indice_carta_vincente;

    } else {

    echo "La carta vincente non è presente nell'array.";

    }

    Questo codice cerca la carta specifica "carta_vincente" nell'array $carte e restituirà l'indice se la trova. Se la carta vincente non è presente nell'array, verrà visualizzato un messaggio che lo indica.

    A proposito, un principio simile viene utilizzato nella programmazione dei casinò. Ad esempio, utilizzo questo sito CasinoHEX dove puoi esplorare diversi tipi di giochi da casinò come slot, poker, roulette ecc. per scoprire cosa si adatta meglio ai tuoi interessi e alle tue capacità.

    Spero che questo ti aiuti a trovare l'indice della carta vincente nell'array!

Devi accedere o registrarti per scrivere nel forum
13 risposte