PHPer,

Het is vakantie, hier en daar dus terug scriptneigingen.
Vandaag zijn de microben weer overgeslagen op mij en heb een project bedacht. Een Texas Hold'em script. Dit is eveneens een goede reden om te beginnen met OOP. Ik heb enkele tutorials gelezen, onderandere ook van deze site. Daarin staat duidelijk vermeld dat OOP een denkwijze is. Het verband tussen Classes zoals : maand extends dag, mastadizzy extends gebruiker, et cetera.
Nu zie ik deze logische verbanden niet echt terug in classes om kaarten te schudden en de kaarten te delen.

Even over de vraag waarmee ik zit. Hoe kan ik mijn geschudde kaarten ($kaarten) gebruiken in mijn volgend class? Zoals je wel kan zien schud ik de kaarten in mijn eerste class, en wil ik om te testen die geschudde kaartenarray oproepen in mijn volgende functie van een andere class (delen).

edit: Even vergeten bij te vermelden. Ik krijg netjes de array te zien die geprint wordt (dus de output van de eerste print_r van de functie schudden). daarna krijg ik 2 errors.

Notice: Use of undefined constant kaarten - assumed 'kaarten' in D:\wamp\www\class.inc.php on line 20

Notice: Object of class delen could not be converted to int in D:\wamp\www\class.inc.php on line 20
1


class.inc.php

<?PHP

class shuffle_kaarten
{
	var $kaarten = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52);

	function schudden()
	{
		shuffle($this->kaarten); //schud array met kaarten
		print_r($this->kaarten); //print array geschudde kaarten
	}
}

class delen
{
	var $aantal_spelers;
	
	function showkaarten()
	{
		print_r($this-kaarten); //om te testen array met geschudde kaarten weergeven	
	}
	
	function delen_speler1()
	{
		for($i=1;$i<=9;$i++)
		{
			echo $kaarten;
		}
	}
	function delen_computer()
	{
		
	}
}
?>



Het PHP bestand dat de classes oproept:

<?PHP
include 'class.inc.php';

$shuffle = new shuffle_kaarten;
$shuffle->schudden();

$kaartendelen = new delen;
$kaartendelen->showkaarten();


?>


Bij voorbaat dank!
Ziet er goed uit alleen bij het schudden van het deck doe je iets niet helemaal goed. Het schudden is een bewerking op het deck en zou dus een method in de deck klasse moeten zijn. Verder hoort er in je dealer klasse geen array met kaarten meer te staan, maar enkel een verwijzing naar het deck dat gebruikt wordt. Dat is immers het object dat jouw kaarten bevat.

Het delen in de dealer klasse gebeurt dus ook door aan je deck object om een kaart te vragen: $deck->dealCard() bijvoorbeeld. In die dealCard() method vind dan de array_shift() plaats.

Verder zou je ook nog een object Player kunnen introduceren. Op die manier ben je af van de array met playerCards in de dealer klasse. Daar heb je dan enkel nog een array met Player objecten die tijdens het delen elk weer kaarten toegewezen krijgen: $player_a->assign() bijvoorbeeld.

Kortom, de basis is goed, alleen zorg dat je de eigenschappen en bewerkingen bij de juiste klasses houdt.
hmm,,
Dus eigenlijk krijg je in de deck class een functie die shufled, en dan in de dealer eentje die hem aanroept.
Voor de rest ben k niet bekend met referenties in PHP, in C# kan ik gewoon ref gebruiken.
voor de rest lees je in de laatste 2 regels dat ik dat ook van plan was/ben.
Voor de rest bestaat er nog een class table, waaraan het spel plaats vind.
en nog een class waarvoor ik eigenlijk niet echt een goede naam weet, maar die handelt alle kaarten af, en berekent het aantal punten.
nico schreef op 25.06.2009 13:56
en nog een class waarvoor ik eigenlijk niet echt een goede naam weet, maar die handelt alle kaarten af, en berekent het aantal punten.

Validator misschien :)?
Dizzy schreef op 25.06.2009 13:59
[quote='nico schreef op 25.06.2009 13:56']en nog een class waarvoor ik eigenlijk niet echt een goede naam weet, maar die handelt alle kaarten af, en berekent het aantal punten.

Validator misschien :)?[/quote]

Lijkt me niet. Een score berekenen is niet valideren. Voor de scores zou ik simple een klasse Score maken.
Hoe moet ik de kaarten delen aan de tafel?
Alle 5 de kaarten gewoon in één array gooien? Dit in een aparte functie? (ik heb nu "dealCard" die kaarten deelt alleen aan de spelers). Of moet ik dit doormiddel van nog een FOR-lus bij de "dealCard" toevoegen?

Ik had in mijn gedachte om nog eens 3 aparte functies te maken (dealFlop, dealTurn, dealRiver), maar dit lijkt mij geen goed idee :).

Dit is een deel van mijn Deck-class:

<?
	public function schudden() //deck schudden
	{
		shuffle($this->deck);
		$shuffledDeck = $this->deck;
		return $shuffledDeck;
	}
	
	public function dealCard($aantalPlayers, $nrCards) //aantal spelers
	{
		$shuffledDeck = $this->schudden();
		
		for ($p=1; $p<=$aantalPlayers; $p++) //delen aan de spelers
		{
			for ($c=1; $c<=$nrCards; $c++)
			{
				$playerCards[$p][$c] = array_shift($shuffledDeck);
			}
		}
	}
?>


PS: hoe kan ik de array $shuffledDeck na het uitvoeren van dealCard terug aanroepen? Ik heb al geprobeerd een functie dealFlop te maken, maar als ik $this->shuffledDeck probeer aan te roepen is dit een lege array. Dit omdat ik niet nogmaals mag schudden (wat dus een compleet nieuw deck oplevert).
<?php
public function schudden() //deck schudden
{
shuffle($this->deck);
$this->shuffledDeck = $this->deck;

}
?>

eigenlijk moet je tafel er zo iets uitzien:
(even snel uit de losse pols)
<?php
class table
{
public $players; //een array met alle player objecten
public $deck; //de stapel met kaarten, ook weer een array met objecten dus
public $dealer; //de dealer, die het bovenstaande deck kan aanpassen, en kaarten kan delen aan de bovenstaande spelers.

//alle classes ook aanmaken

$dealer->dealCards(); // en dan moet de functie dealCards zo worden aangepast dat hij weet wat te doen.
Je kan hem ook een lijst met players laten returnen, en dan $players gewoon zo te declareren.
}
?>
Ik weet niet of je al een class diagram heb gemaakt, maar dat zou wel heel handig wezen, voornamelijk voor jezelf.
Je gaat gewoon je probleem opdelen in meerdere stukken.
je begint bij de essentie van poker,
Die ligt bij de tafel.
de tafel heeft verschillende dingen nodig om er een potje poker op te kunnen spelen.
dit zijn:
een dealer
een *x* aantal spelers
een stapel met kaarten

Ga nu gewoon een paar potjes spelen, en speel ieder onderdeel eens zelf, en schrijf dan op wat je allemaal moet doen.
Dat zijn dan de functies die ieder "ding" heeft.
Om dan nog even bij het schudden van de kaarten terug te komen,
Ik ben het niet helemaal eens met blanche dat schudden een onderdeel is van de kaarten, het is een bewerking die door de kaarten word gedaan, maar omdat je de standaard functie shufle al heb, kan je (vind ik) die functie direct op de kaarten uitvoeren, vanuit de dealer class.
Anders krijg je in de deck class een functie als deze:
public function shuflleCards()
{
shuffle($this->deck);
}

en dan heeft de dealer een functie die de functie shuflleCards() aanroept, en die dan weer op het deck aanpassen, beetje dubbel op vind ik.

voor de rest moet je wel een beetje consequent zijn in je taal gebruik,
of engels, of nederlands, niet alle 2.
Bij voorkeur zelfs engels.

Reageren