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 = ♠