Doing OO card game
BlitzMax Forums/BlitzMax Beginners Area/Doing OO card game| 
 | ||
| I'm doing a basic card game to try to teach myself OOP in BlitzMax. To begin with I just want very basic functionality, such as the abillity to deal cards to players and shuffel the deck. I just need some pointers to see if I'm going about this the right way. The way I'm thinking of doing it is have a type called TCard, for every card and initalize it with all 52 cards of the deck at the start of the game. Then have a type called TCardHolder, with a field that can contain TCard objects. TCardHolder would then have several derived types such as TPlayer, TOpponent, TDeck, TDiscardPile and so on. The idea is that the TCard objects can get passed around between the different TCardHolder objects (players,deck etc.). So that I can tell a deck object to deal five cards to a player. It will then take the top five card objects in it's TList field and give them to that player (i.e. add the to the TList of that player and remove them from it's own). Would this be a logical way to do it? Ragnar | 
| 
 | ||
| Oi... that's kinda scary... this is what a buddy of mine and me was working on a month ago: 
Strict
Type TCard
	Field _symbol:Int
	Field _value:Int
	
	Method Draw(deckimage:TImage, x:Int, y:Int)
		DrawImage(deckimage, x, y, ((_symbol * 13) + _value))
	EndMethod
	
	Method SetValue(family:Int, value:Int)
		self._symbol	= family
		self._value		= value
	EndMethod
		
	Method GetFamily:Int()
		Return self._symbol
	EndMethod
	
	Method GetValue:Int()
		Return self._value
	EndMethod
	
	Method AsText:String()
		Local s:String
		
		If self._value = 0
			s = "Ace"
			Else If self._value < 10
			s = ""+ (self._value + 1)
			Else If self._value = 10
			s = "Knight"
			Else If self._value = 11
			s = "Queen"
			Else If self._value = 12
			s = "King"
			EndIf 
			
			If self._symbol = 0
			s:+ " of Clubs"
			Else If self._symbol = 1
			s:+ " of Diamonds"
			Else If self._symbol = 2
			s:+ " of Hearts"
			Else If self._symbol = 3
			s:+ " of Spades"
		EndIf 
			
		Return s
	EndMethod
		
EndType
Type TDeck
	Field _image:TImage
	Field _card:TCard[52]
	
	Method New()
		self.InitImage("gfx/cardset1m2.jpg")
		Local family:Int, value:Int
		Local i:Int = 0
		For family:Int = 0 To 3
			For value:Int = 0 To 12
				Local crd:TCard = New TCard
				crd.SetValue(family, value)
				self._card[i] = crd
				i :+ 1
			Next
		Next
	EndMethod
			
	Method Shuffle(rec:Int = 3)
		Local buffercard:TCard = New TCard
		' lage nytt utgangspunkt for random
		SeedRnd(MilliSecs())
		
		' stokk kortene "rec" antall ganger
		For Local a = 0 To rec
			For Local i = 0 To 51
				' finne et tilfeldig kort
				Local random:Int = Rand(0,51)
				' bytte ut dette kortet med det på den aktuelle plassen
				buffercard			= self._card[random]
				self._card[random]	= self._card[i]
				self._card[i]		= buffercard
			Next
		Next
	EndMethod
			
	Method InitImage(s:String)
		self._image = LoadAnimImage(s,93,135,0,55, MASKEDIMAGE | FILTEREDIMAGE | MIPMAPPEDIMAGE)
		If Not(self._image)
			DebugLog "Couldn't load image: " + s
		EndIf
	EndMethod
	Method GetImage:TImage()
		Return self._image
	EndMethod
		
	Method Debug()
		DebugLog ""
		For Local i = 0 To 51
			DebugLog self._card[i].AsText()
		Next
	EndMethod
	
EndType
' cardholder er bare en "boks" som kan inneholde kort
' f.eks. kan det være en spiller, eller bordet, eller en "OUT" boks
Type TCardholder
	Field _cards:TList
	
	Method AddCard(card:TCard)
		' her skal vilegge til et kort i listen
	EndMethod
	
	Method RemoveCard(num:Int)
		' her fjerner vi kort "num" fra lista
		' "num" er da pekeren til kortet i listen
	EndMethod
	
	Method ListCards()
		' her spytter vi bare ut alle kortene som er i listen.
		For Local i:TCard = EachIn _cards
			i.AsText()
		Next
	EndMethod
	
EndType
Type TPlayer Extends TCardholder
	Field name:String
	Method Deal(numofcards:Int, player:TList)
		' dette legger til numofcards antall kort til listen som er gitt
		For Local i = 0 To numofcards
			' gi kort
		Next
	EndMethod
EndType
' åpne er skjerm
Graphics 640,480
Global stokk:TDeck = New TDeck
stokk.Debug()
Repeat
	Cls
	' bare vis kortstokken nå til å begynne med
	If KeyHit(KEY_SPACE)
		stokk.Shuffle()
		stokk.Debug()
	EndIf
	
	stokk._card[0].Draw(stokk.GetImage(),100,100)
	stokk._card[1].Draw(stokk.GetImage(),200,100)
	stokk._card[2].Draw(stokk.GetImage(),300,100)
	stokk._card[3].Draw(stokk.GetImage(),400,100)
	stokk._card[4].Draw(stokk.GetImage(),500,100)
		Flip
Until KeyHit(KEY_ESCAPE)
now, never mind the comments... and the code in itself might not be the best.. but look at the type layout.. hehe | 
| 
 | ||
|  Would this be a logical way to do it? Sure. However it does seem a little over-engineered. As a rule of thumb, you should never have an object, for something that can be represented as a number, or a name. A playing card, can be represented by either, so shouldn't be an object. | 
| 
 | ||
| Here is a playing card module that might give you some ideas. http://www.scottshaver2000.com/forum/viewtopic.php?t=131 | 
| 
 | ||
| I'm currently working on a video poker game. I use a card, hand, deck object. Each object has its own properties like card rank, color, value, etc. The deck object has a method for shuffling. It works very well for me and it's easy to deal to a hand, etc. I also have an evaluator object that you can pass a hand object to. This evaluator object then updates the rank of the hand. Works very well for me. | 
| 
 | ||
| Thanks for the feedback. With your help, the BegnnerBlitzMax.pdf and some Googling this is what I came up with. It's got some basic functionality, that would be easy to add more to I think. It's also my first attempt with OOP, I think I'm slowly getting my head around it. :-) If there is anything I should do differently, please let me know. '==========' ' CARDDECK ' '==========' ' - deck of cards test. Strict 'Global Deck:TList = CreateList() Global Suits:String[] = [ "clubs","diamonds","hearts","spades" ] ' Base class for anything that can hold cards (i.e. the deck, players, discard pile, the table etc.) Type THolder Field Card:TList = CreateList() Method GetCard:TCard( Number ) Local n=0 For Local c:TCard = EachIn Card n:+1 If n = Number Then Return c Next End Method Method PullCard:TCard() Local TempCard:TCard = Self.GetCard(1) Self.Card.Remove( TempCard) Return TempCard End Method Method PutCard:TCard( inCard:TCard ) Self.Card.AddLast( inCard ) End Method End Type ' Base class for the deck of cards. Type TDeck Extends THolder ' Creates a deck of cards. ' From:Int=2 -> The card to start building the deck from. Used to create decks without the lowest cards. Function Create:TDeck( From:Int=2 ) Local Deck:TDeck = New TDeck For Local Suit:String = EachIn Suits For Local n=From To 14 Deck.Card.AddLast(TCard.Create(Suit,n)) Next Next Return Deck End Function End Type ' Base class for hand of cards Type THand Extends THolder Function Create:THand( Number:Int, inDeck:TDeck ) Local TempHand:THand = New THand For Local n=1 To 5 TempHand.PutCard(inDeck.PullCard()) Next Return TempHand End Function End Type ' Base class for each playing card. Type TCard Field Suit:String ' clubs, diamonds, hearts, spades Field Value:Int ' 2..14 ( 11=jack, 12=queen, 13=king, 14=ace) Method GetSuit:String() Return Self.Suit End Method Method GetValue:Int() Return Self.Value End Method Function Create:TCard( inSuit:String, inValue ) Local Card:TCard = New TCard Card.Suit = inSuit Card.Value = inValue Return Card End Function End Type Local myDeck:TDeck = TDeck.Create() Print myDeck.GetCard(1).GetSuit() Print myDeck.GetCard(1).GetValue() Local myHand:THand = THand.Create( 5, myDeck ) Print myHand.GetCard(1).GetSuit() Print myHand.GetCard(1).GetValue() p.s. LarsG: De kommentarene dine hjalp ogsaa, selv om de ikke var paa Engelsk. :-) | 
| 
 | ||
| Oh...and btw. Is it possible to do a Constant array. Wasn't able to figure out how to make one for the suits. | 
| 
 | ||
| Some other things you might want to add(just a suggestion) are a Shuffle and a Deal method to the Deck. You could also put an Rank method in the Hand object to determine a hand ranking for evaluating who has the best hand. |