Last active
December 15, 2015 02:29
-
-
Save ecylmz/5187312 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"sort" | |
"math/rand" | |
"time" | |
"strings" | |
) | |
// Kart | |
type Card struct { | |
Suite string | |
Rank string | |
} | |
// Kartı sembol olarak ver | |
func (c *Card) Symbol() string { | |
return c.Suite[:1] + c.Rank | |
} | |
func (c *Card) RankValue() int { | |
return sort.SearchStrings(RANKS, c.Rank) | |
} | |
func (c *Card) SuiteValue() int { | |
return sort.SearchStrings(SUITES, c.Suite) | |
} | |
// Kartı sembolle göster | |
func (c Card) String() string { | |
return GLYPH[c.Symbol()] | |
} | |
// Deste | |
type Deck struct { | |
Cards []Card | |
} | |
// Desteden el çıkar | |
func (d *Deck) Hand() Hand { | |
// pop | |
hand_cards := d.Cards[0:DEFAULT_HAND_SIZE] | |
// pop sonrası kalan deste | |
d.Cards = d.Cards[DEFAULT_HAND_SIZE:] | |
return Hand{hand_cards} | |
} | |
// Desteyi karıştır | |
func (d *Deck) Shuffle() *Deck { | |
src := d.Cards | |
rand.Seed(time.Now().UnixNano()) | |
perm := rand.Perm(len(d.Cards)) | |
for i, v := range perm { | |
d.Cards[v] = src[i] | |
} | |
return d | |
} | |
// El | |
type Hand struct { | |
Cards []Card | |
} | |
func (h *Hand) Deal() Card { | |
// pop işlemi | |
card := h.Cards[len(h.Cards)-1:] | |
h.Cards = h.Cards[0:len(h.Cards)-1] | |
return card[0] | |
} | |
// Eli sembollerle göster | |
func (h Hand) String() string { | |
var cardsSymbol []string | |
for _, card := range h.Cards { | |
cardsSymbol = append(cardsSymbol, card.String()) | |
} | |
return strings.Join(cardsSymbol, " ") | |
} | |
var ( | |
SUITES []string = []string{"club", "diamondi", "heart", "spade"} | |
RANKS []string = []string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "j", "q", "k"} | |
DEFAULT_HAND_SIZE = 4 // Öntanımlı el kaç kart | |
GLYPH map[string]string = map[string]string { | |
"s1": "\U0001f0a1", "h1": "\U0001f0b1", "d1": "\U0001f0c1", "c1": "\U0001f0d1", | |
"s2": "\U0001f0a2", "h2": "\U0001f0b2", "d2": "\U0001f0c2", "c2": "\U0001f0d2", | |
"s3": "\U0001f0a3", "h3": "\U0001f0b3", "d3": "\U0001f0c3", "c3": "\U0001f0d3", | |
"s4": "\U0001f0a4", "h4": "\U0001f0b4", "d4": "\U0001f0c4", "c4": "\U0001f0d4", | |
"s5": "\U0001f0a5", "h5": "\U0001f0b5", "d5": "\U0001f0c5", "c5": "\U0001f0d5", | |
"s6": "\U0001f0a6", "h6": "\U0001f0b6", "d6": "\U0001f0c6", "c6": "\U0001f0d6", | |
"s7": "\U0001f0a7", "h7": "\U0001f0b7", "d7": "\U0001f0c7", "c7": "\U0001f0d7", | |
"s8": "\U0001f0a8", "h8": "\U0001f0b8", "d8": "\U0001f0c8", "c8": "\U0001f0d8", | |
"s9": "\U0001f0a9", "h9": "\U0001f0b9", "d9": "\U0001f0c9", "c9": "\U0001f0d9", | |
"s10": "\U0001f0aa", "h10": "\U0001f0ba", "d10": "\U0001f0ca", "c10": "\U0001f0da", | |
"sj": "\U0001f0ab", "hj": "\U0001f0bb", "dj": "\U0001f0cb", "cj": "\U0001f0db", | |
"sq": "\U0001f0ad", "hq": "\U0001f0bd", "dq": "\U0001f0cd", "cq": "\U0001f0dd", | |
"sk": "\U0001f0ae", "hk": "\U0001f0be", "dk": "\U0001f0ce", "ck": "\U0001f0de", | |
} | |
) | |
func main() { | |
// Kartları şimdi üret | |
var CARDS []Card | |
for _, suite := range SUITES { | |
for _, rank := range RANKS { | |
card := Card{suite, rank} | |
CARDS = append(CARDS, card) | |
} | |
} | |
// Yeni deste | |
d := Deck{CARDS} | |
// Desteyi karıştır | |
d.Shuffle() | |
for i := 0; i < (52 / DEFAULT_HAND_SIZE); i++ { | |
h := d.Hand() // Desteden eller | |
fmt.Println(h) | |
for j := 0; j < DEFAULT_HAND_SIZE; j++ { | |
card := h.Deal() // Ellerden tek tek kart | |
fmt.Println(card) | |
} | |
} | |
} |
Hmm...
Hocam yaptığınız değişiklikler kullanım açısından gerçekten güzel duruyor.
"String" fonksiyonunda pointer yerine value kullanmak yanlış olmaz sanırım. Sonuçta struct'taki verileri değiştirmiyoruz, verileri çekiyoruz.
Ayrıca dokümanda da tam kullandığım yönteme yanlış demiş, aklımı okumuşlar 😄
Kodu sizinkiyle güncelliyorum.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@ecylmz: Küçük bir değişiklik yaptım. Bu Gist'in forkuna bak: https://gist.github.com/roktas/5191259
Ayrıca: http://play.golang.org/p/bQ8F8bLZWU
ToString
yerineString
kullandım, Ruby'dekito_s
tadında. Bu değişiklik "consumer code"u rahatlattı, diff'i incelersen daha iyi anlayacaksın.Neden?
fmt.Println
vs bunu kullanabiliyor (tıpkı Rubyputs
gibi). Yalnız dikkat et,String
metodunda recevier olarak pointer değil value kullanmak durumunda kaldım. Dilersen pointer'lı versiyonu koruyabilirsin ama bu durumdafmt.Println(&card)
demek zorundasın. İdiyomatik olarak hangi yolu kullanmak lazım buna bakacağım.Ayrıca bu
ToString
versusString
konusu için resmi dokümantasyona da bir bakmanda yarar var: http://golang.org/doc/effective_go.html#interface-names