Ir para o conteúdo

Baralho de Cartas

Introdução

O exercício propõem que desenvolvamos uma aplicação capaz de distribuir dois baralhos de cartas distintos, criando assim os respectivos ficheiros de texto: mãos.txt, ordenadas.txt, cartasforas.txt. As cartas são constituídas pelos respectivos naipes já conhecidos:

private $cartas = array('2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A'); // T = 10
private $naipes = array('♦', '♣', '♠', '♥');

Class Cartas

Mãos.txt

O objectivo deste ficheiro de texto é obter os dois baralhos distintos. Estes baralhos são sorteados automaticamente e não se podem repetir. A primeira função (sortear_cartas) tem como objectivo sortear apenas e só cartas+naipes.

    function sortear_cartas() {
        $cartas_ = array_rand($this->cartas);
        $naipes_ = array_rand($this->naipes);
        return array(0 => $cartas_, 1 => $naipes_);
    }

A segunda função (gerar_cartas) vai tratar de todo o processo de escrita/verificação sobre as cartas+naipes gerados pela função anterior.

    function gerar_cartas() {
        if (file_exists("maos.txt")) {
            unlink("maos.txt");
        }
        $fw = fopen("maos.txt", "w");

        for ($i = 0; $i < 10; $i++) {
            $cartas_1 = $this->sortear_cartas();
            $cartas_2 = $this->sortear_cartas();
            /* 
             * Se for detectado que as cartas+naipes sorteados já saíram, então
             * terá, obrigatoriamente, de haver um novo sorteio para evitar
             * repetições.
             */
            if (in_array($this->cartas[$cartas_1[0]] . $this->naipes[$cartas_1[1]], $this->cartas_saidas) ||
                in_array($this->cartas[$cartas_2[0]] . $this->naipes[$cartas_2[1]], $this->cartas_saidas)) {
                $i--;
                $cartas_1 = $this->sortear_cartas();
                $cartas_2 = $this->sortear_cartas();
            } else {
                fwrite($fw, $this->cartas[$cartas_1[0]] . $this->naipes[$cartas_1[1]] . " ");
                fwrite($fw, $this->cartas[$cartas_2[0]] . $this->naipes[$cartas_2[1]] . "rn");
                $this->cartas_saidas[] = $this->cartas[$cartas_1[0]] . $this->naipes[$cartas_1[1]];
                $this->cartas_saidas[] = $this->cartas[$cartas_2[0]] . $this->naipes[$cartas_2[1]];
                $this->baralho_1[] = $this->cartas[$cartas_1[0]] . $this->naipes[$cartas_1[1]];
                $this->baralho_2[] = $this->cartas[$cartas_2[0]] . $this->naipes[$cartas_2[1]];
            }
        }
        fclose($fw);
    }

Ordenadas.txt

Após os baralhos terem saído, haverá uma ordenação simples aos mesmos.

    function ordenar_baralho() {
        if (file_exists("ordenadas.txt")) {
            unlink("ordenadas.txt");
        }
        $fw = fopen("ordenadas.txt", "w");

        rsort($this->baralho_1);
        rsort($this->baralho_2);

        for ($i = 0; $i < 10; $i++) {
            fwrite($fw, $this->baralho_1[$i] . " " . $this->baralho_2[$i] . "rn");
        }
        fclose($fw);
    }

CartasFora.txt

A função, tal como o nome do ficheiro de texto indica, tem como objectivo detectar todas as cartas que ficaram de fora de ambos os baralhos. Para isso, primeiro faz-se a combinação de todas as cartas+naipes.

 function total_combinations() {
        /*
         * Número total de combinações entre as cartas.
         */
        for ($i = 0; $i < count($this->cartas); $i++) {
            for ($x = 0; $x < count($this->naipes); $x++) {
                $this->combinations[] = $this->cartas[$i] . $this->naipes[$x];
            }
        }
    }

E por fim escreve-se os valores no ficheiro.

    function cartas_fora() {
        if (file_exists("cartasfora.txt")) {
            unlink("cartasfora.txt");
        }
        $fw = fopen("cartasfora.txt", "w");
        $diff = array_diff($this->combinations, $this->cartas_saidas); // diferença
        foreach ($diff as $value) {
            fwrite($fw, $value . " ");
        }
        fclose($fw);
    }

Código Final

Class Cartas {
    /*
     * É necessário eliminar os ficheiros que vão sendo criados ao longo da 
     * aplicação isto porque se escrever no ficheiro existente, ele vai 
     * adicinar o novo conteúdo ao já existente no ficheiro. 
     */

    private $cartas = array('2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A'); // T = 10
    private $naipes = array('♦', '♣', '♠', '♥');
    private $combinations = array();
    private $baralho_1 = array();
    private $baralho_2 = array();
    private $cartas_saidas = array();

    function sortear_cartas() {
        $cartas_ = array_rand($this->cartas);
        $naipes_ = array_rand($this->naipes);
        return array(0 => $cartas_, 1 => $naipes_);
    }

    function gerar_cartas() {
        if (file_exists("maos.txt")) {
            unlink("maos.txt");
        }
        $fw = fopen("maos.txt", "w");

        for ($i = 0; $i < 10; $i++) {
            $cartas_1 = $this->sortear_cartas();
            $cartas_2 = $this->sortear_cartas();
            /* 
             * Se for detectado que as cartas+naipes sorteados já saíram, então
             * terá, obrigatoriamente, de haver um novo sorteio para evitar
             * repetições.
             */
            if (in_array($this->cartas[$cartas_1[0]] . $this->naipes[$cartas_1[1]], $this->cartas_saidas) ||
                in_array($this->cartas[$cartas_2[0]] . $this->naipes[$cartas_2[1]], $this->cartas_saidas)) {
                $i--;
                $cartas_1 = $this->sortear_cartas();
                $cartas_2 = $this->sortear_cartas();
            } else {
                fwrite($fw, $this->cartas[$cartas_1[0]] . $this->naipes[$cartas_1[1]] . " ");
                fwrite($fw, $this->cartas[$cartas_2[0]] . $this->naipes[$cartas_2[1]] . "rn");
                $this->cartas_saidas[] = $this->cartas[$cartas_1[0]] . $this->naipes[$cartas_1[1]];
                $this->cartas_saidas[] = $this->cartas[$cartas_2[0]] . $this->naipes[$cartas_2[1]];
                $this->baralho_1[] = $this->cartas[$cartas_1[0]] . $this->naipes[$cartas_1[1]];
                $this->baralho_2[] = $this->cartas[$cartas_2[0]] . $this->naipes[$cartas_2[1]];
            }
        }
        fclose($fw);
    }

    function ordenar_baralho() {
        if (file_exists("ordenadas.txt")) {
            unlink("ordenadas.txt");
        }
        $fw = fopen("ordenadas.txt", "w");

        rsort($this->baralho_1);
        rsort($this->baralho_2);

        for ($i = 0; $i < 10; $i++) {
            fwrite($fw, $this->baralho_1[$i] . " " . $this->baralho_2[$i] . "rn");
        }
        fclose($fw);
    }

    function total_combinations() {
        /*
         * Número total de combinações entre as cartas.
         */
        for ($i = 0; $i < count($this->cartas); $i++) {
            for ($x = 0; $x < count($this->naipes); $x++) {
                $this->combinations[] = $this->cartas[$i] . $this->naipes[$x];
            }
        }
    }

    function cartas_fora() {
        if (file_exists("cartasfora.txt")) {
            unlink("cartasfora.txt");
        }
        $fw = fopen("cartasfora.txt", "w");
        $diff = array_diff($this->combinations, $this->cartas_saidas);
        foreach ($diff as $value) {
            fwrite($fw, $value . " ");
        }
        fclose($fw);
    }

}

$cartas = new Cartas;
$cartas->gerar_cartas();
$cartas->ordenar_baralho();
$cartas->total_combinations();
$cartas->cartas_fora();

Conclusão

Para escreverem os naipes, basta fazerem o seguinte:

ALT + 3 = ♥
ALT + 4 = ♦
ALT + 5 = ♣
ALT + 6 = ♠