Skip to content

Instantly share code, notes, and snippets.

@ecylmz
Last active December 15, 2015 02:29
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ecylmz/5187312 to your computer and use it in GitHub Desktop.
Save ecylmz/5187312 to your computer and use it in GitHub Desktop.
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)
}
}
}
@ecylmz
Copy link
Author

ecylmz commented Mar 18, 2013

@roktas
Copy link

roktas commented Mar 18, 2013

@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 yerine String kullandım, Ruby'deki to_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ı Ruby puts gibi). Yalnız dikkat et, String metodunda recevier olarak pointer değil value kullanmak durumunda kaldım. Dilersen pointer'lı versiyonu koruyabilirsin ama bu durumda fmt.Println(&card) demek zorundasın. İdiyomatik olarak hangi yolu kullanmak lazım buna bakacağım.

Ayrıca bu ToString versus String konusu için resmi dokümantasyona da bir bakmanda yarar var: http://golang.org/doc/effective_go.html#interface-names

@ecylmz
Copy link
Author

ecylmz commented Mar 18, 2013

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