Ako netko ima iskustva u ovakvim igrama, zanima me i kako je najbolje riješiti problematiku klikanja karti ?
Ovo je moj kod za sada, budući da sam početnik vjerovatno će vam biti dosta nepregledan.
Code:
from Tkinter import *
from PIL import Image, ImageTk
import random
#Velicina ekrana
HEIGHT = 960
WIDTH = 1280
#Dimenzije karata
CARD_SIZE = (73, 98)
CARD_BACK_SIZE = (71, 96)
#Koordinate pozicija
PLAYING_POS = (WIDTH/2,HEIGHT/2)
DECK_POS = (WIDTH-100,HEIGHT/2)
PLAYER_POS = (WIDTH/4,HEIGHT-150)
KOMP_POS = (WIDTH/4,200)
KOMP2_POS = (130,HEIGHT/4)
KOMP3_POS = (WIDTH-130,HEIGHT/4)
PLAYER_POS2 = (WIDTH/2,HEIGHT-100)
KOMP_POS2 = (WIDTH/4,100)
KOMP2_POS2 = (80,HEIGHT/4)
KOMP3_POS2 = (WIDTH-80,HEIGHT/4)
PLAYER_POS3 = (WIDTH/2,HEIGHT-100)
KOMP_POS3 = (WIDTH/4,100)
KOMP2_POS3 = (80,HEIGHT/4)
KOMP3_POS3 = (WIDTH-80,HEIGHT/4)
#Karte
SUITS = ['C', 'S', 'H', 'D']
RANKS = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
VALUES = {'2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, 'J':10, 'Q':11, 'K':12, 'A':13, '10':14}
#Ostale varijable
klik=0
counter=4
thrown_cards=[]
class Cards:
def __init__(self,suit,rank):
self.suit = suit
self.rank = rank
self.karta = None
def get_suit(self):
return self.suit
def get_rank(self):
return self.rank
def __str__(self):
return self.suit + self.rank
def draw(self,position):
CARD = Image.open ("cards.png")
box = [RANKS.index(self.rank) * CARD_SIZE[0], SUITS.index(self.suit) * CARD_SIZE[1], CARD_SIZE[0] * (RANKS.index(self.rank)+1) , CARD_SIZE[1] * (SUITS.index(self.suit)+1)]
cropped = CARD.crop(box)
self.karta = ImageTk.PhotoImage(cropped)
canvas.create_image(position, image=self.karta)
def draw_back(self,position):
CB=Image.open("card_back.png")
self.karta = ImageTk.PhotoImage(CB)
canvas.create_image(position, image=self.karta)
class Deck:
def __init__(self):
self.deck_list = []
# standard 52 card deck
global SUITS
global RANKS
for s in SUITS:
for r in RANKS:
self.deck_list.append(Cards(s, r))
def shuffle(self):
return random.shuffle(self.deck_list)
def deal_card(self):
return self.deck_list.pop(0)
def draw(self):
for c in self.deck_list:
c.draw_back(DECK_POS)
class Hand:
def __init__(self ):
self.card_list=[]
self.card_list2=[]
self.card_list3=[]
def add_card(self,card):
self.card_list.append(card)
game_deck.draw()
def add_card2(self,card):
self.card_list2.append(card)
def add_card3(self,card):
self.card_list3.append(card)
def choose_card(self):
global VALUES,izbor
self.choices=[]
if len(self.card_list) > 0:
for c in self.card_list:
if ( VALUES.get(c.get_rank()) >= thrown_cards[-1] ) or c.get_rank()== "2":
self.choices.append(c)
izbor = random.choice(self.choices)
elif len(self.card_list) == 0 and len(self.card_list2) > 0:
for c in self.card_list:
if VALUES.get(c.get_rank()) >= thrown_cards[-1] or c.get_rank()== "2":
self.choices.append(c)
izbor = random.choice(choices)
elif len(self.card_list) == 0 and len(self.card_list2) == 0 and len(self.card_list3) > 0:
izbor = random.choice(self.card_list3)
self.choices.append(izbor)
def throw_card(self):
global thrown_cards
if len(self.choices) == 0 :
self.card_list.append(thrown_cards)
thrown_cards=[]
elif len(self.choices) == 1 and ( choices[0].get_rank() < thrown_cards[-1] or choices[0].get_rank() != 2):
thrown_cards.append(izbor)
self.card_list.append(thrown_cards)
thrown_cards=[]
else:
is_valid(izbor)
if self.card_list > 0:
self.card_list.pop(self.card_list.index(izbor))
elif self.card_list == 0 and self.card_list2 >0:
self.card_list2.pop(self.card_list2.index(izbor))
else:
self.card_list3.pop(self.card_list3.index(izbor))
def draw(self,position):
pos = list(position)
for c in self.card_list:
c.draw(pos)
pos[0] += CARD_SIZE[0]/3
def draw2(self,position):
pos = list(position)
for c in self.card_list3:
c.draw(pos)
pos[0] += CARD_SIZE[0]/3
def draw3(self,position):
pos = list(position)
for c in self.card_list2:
c.draw3(pos)
pos[0] += CARD_SIZE[0]/3
def click(event):
global klik,counter
klik = (event.x-PLAYER_POS[0]-36) //(CARD_SIZE[0]//3)
if (len(player_hand.card_list) == 0) and (len(player_hand.card_list2) == 0) and (HEIGHT-148 < event.y < HEIGHT-52):
is_valid(player_hand.card_list3[klik])
if valid:
player_hand.card_list3.pop(klik)
player_hand.draw2(PLAYER_POS3)
elif (len(player_hand.card_list) == 0) and (len(player_hand.card_list2) > 0) and (HEIGHT-148 < event.y < HEIGHT-52):
is_valid(player_hand.card_list2[klik])
if valid:
player_hand.card_list2.pop(klik)
player_hand.draw3(PLAYER_POS2)
elif (HEIGHT-198 < event.y < HEIGHT-102):
is_valid(player_hand.card_list[klik])
if valid:
player_hand.card_list.pop(klik)
player_hand.draw(PLAYER_POS)
if len(player_hand.card_list) < 3 and len(game_deck.deck_list)>0:
player_hand.add_card(game_deck.deal_card())
player_hand.draw(PLAYER_POS)
counter +=1
root.after(1500,turn)
def start():
global game_deck,player_hand,komp_hand,komp2_hand,komp3_hand,card_list,thrown_cards
canvas.delete(ALL)
#Shuffle the deck
game_deck = Deck()
game_deck.shuffle()
#Create players hands
player_hand = Hand()
komp_hand = Hand()
komp2_hand = Hand()
komp3_hand = Hand()
thrown_cards=[]
#add three cards to each hand
player_hand.add_card(game_deck.deal_card())
player_hand.add_card(game_deck.deal_card())
player_hand.add_card(game_deck.deal_card())
player_hand.add_card2(game_deck.deal_card())
player_hand.add_card2(game_deck.deal_card())
player_hand.add_card2(game_deck.deal_card())
player_hand.add_card3(game_deck.deal_card())
player_hand.add_card3(game_deck.deal_card())
player_hand.add_card3(game_deck.deal_card())
komp_hand.add_card(game_deck.deal_card())
komp_hand.add_card(game_deck.deal_card())
komp_hand.add_card(game_deck.deal_card())
komp_hand.add_card2(game_deck.deal_card())
komp_hand.add_card2(game_deck.deal_card())
komp_hand.add_card2(game_deck.deal_card())
komp_hand.add_card3(game_deck.deal_card())
komp_hand.add_card3(game_deck.deal_card())
komp_hand.add_card3(game_deck.deal_card())
komp2_hand.add_card(game_deck.deal_card())
komp2_hand.add_card(game_deck.deal_card())
komp2_hand.add_card(game_deck.deal_card())
komp2_hand.add_card2(game_deck.deal_card())
komp2_hand.add_card2(game_deck.deal_card())
komp2_hand.add_card2(game_deck.deal_card())
komp2_hand.add_card3(game_deck.deal_card())
komp2_hand.add_card3(game_deck.deal_card())
komp2_hand.add_card3(game_deck.deal_card())
komp3_hand.add_card(game_deck.deal_card())
komp3_hand.add_card(game_deck.deal_card())
komp3_hand.add_card(game_deck.deal_card())
komp3_hand.add_card2(game_deck.deal_card())
komp3_hand.add_card2(game_deck.deal_card())
komp3_hand.add_card2(game_deck.deal_card())
komp3_hand.add_card3(game_deck.deal_card())
komp3_hand.add_card3(game_deck.deal_card())
komp3_hand.add_card3(game_deck.deal_card())
#Draw players card
player_hand.draw(PLAYER_POS)
player_hand.draw2(PLAYER_POS2)
komp_hand.draw(KOMP_POS2)
komp2_hand.draw(KOMP2_POS2)
komp3_hand.draw(KOMP3_POS2)
def turn():
global counter
canvas.delete(ALL)
if counter % 4 == 1:
komp_hand.choose_card()
komp_hand.throw_card()
if len(game_deck.deck_list) > 0:
komp_hand.add_card(game_deck.deal_card())
counter += 1
elif counter % 4 == 2:
komp2_hand.choose_card()
komp2_hand.throw_card()
if len(game_deck.deck_list) > 0:
komp2_hand.add_card(game_deck.deal_card())
counter += 1
elif counter %4 == 3:
komp3_hand.choose_card()
komp3_hand.throw_card()
if len(game_deck.deck_list) > 0:
komp3_hand.add_card(game_deck.deal_card())
counter += 1
root.after(1500,turn)
def is_valid(card):
global VALUES,thrown_cards,valid
if len(thrown_cards)>0:
if VALUES.get(card.get_rank()) >= thrown_cards[-1] or card.get_rank()== 2:
card.draw([640,480])
thrown_cards.append(card)
valid = True
else:
message = "Not a valid card !!"
valid = False
else:
card.draw([640,480])
thrown_cards.append(card)
valid = True
root=Tk()
root.bind("<Button-1>",click)
canvas=Canvas(root,height=HEIGHT,width=WIDTH)
canvas.pack()
menubar=Menu(root)
filemenu=Menu(menubar,tearoff=0)
filemenu.add_command(label="New Game", command = start)
menubar.add_cascade(label="File",menu=filemenu)
root.config(menu=menubar)
kajla = Game
root.mainloop()
from Tkinter import *
from PIL import Image, ImageTk
import random
#Velicina ekrana
HEIGHT = 960
WIDTH = 1280
#Dimenzije karata
CARD_SIZE = (73, 98)
CARD_BACK_SIZE = (71, 96)
#Koordinate pozicija
PLAYING_POS = (WIDTH/2,HEIGHT/2)
DECK_POS = (WIDTH-100,HEIGHT/2)
PLAYER_POS = (WIDTH/4,HEIGHT-150)
KOMP_POS = (WIDTH/4,200)
KOMP2_POS = (130,HEIGHT/4)
KOMP3_POS = (WIDTH-130,HEIGHT/4)
PLAYER_POS2 = (WIDTH/2,HEIGHT-100)
KOMP_POS2 = (WIDTH/4,100)
KOMP2_POS2 = (80,HEIGHT/4)
KOMP3_POS2 = (WIDTH-80,HEIGHT/4)
PLAYER_POS3 = (WIDTH/2,HEIGHT-100)
KOMP_POS3 = (WIDTH/4,100)
KOMP2_POS3 = (80,HEIGHT/4)
KOMP3_POS3 = (WIDTH-80,HEIGHT/4)
#Karte
SUITS = ['C', 'S', 'H', 'D']
RANKS = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
VALUES = {'2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, 'J':10, 'Q':11, 'K':12, 'A':13, '10':14}
#Ostale varijable
klik=0
counter=4
thrown_cards=[]
class Cards:
def __init__(self,suit,rank):
self.suit = suit
self.rank = rank
self.karta = None
def get_suit(self):
return self.suit
def get_rank(self):
return self.rank
def __str__(self):
return self.suit + self.rank
def draw(self,position):
CARD = Image.open ("cards.png")
box = [RANKS.index(self.rank) * CARD_SIZE[0], SUITS.index(self.suit) * CARD_SIZE[1], CARD_SIZE[0] * (RANKS.index(self.rank)+1) , CARD_SIZE[1] * (SUITS.index(self.suit)+1)]
cropped = CARD.crop(box)
self.karta = ImageTk.PhotoImage(cropped)
canvas.create_image(position, image=self.karta)
def draw_back(self,position):
CB=Image.open("card_back.png")
self.karta = ImageTk.PhotoImage(CB)
canvas.create_image(position, image=self.karta)
class Deck:
def __init__(self):
self.deck_list = []
# standard 52 card deck
global SUITS
global RANKS
for s in SUITS:
for r in RANKS:
self.deck_list.append(Cards(s, r))
def shuffle(self):
return random.shuffle(self.deck_list)
def deal_card(self):
return self.deck_list.pop(0)
def draw(self):
for c in self.deck_list:
c.draw_back(DECK_POS)
class Hand:
def __init__(self ):
self.card_list=[]
self.card_list2=[]
self.card_list3=[]
def add_card(self,card):
self.card_list.append(card)
game_deck.draw()
def add_card2(self,card):
self.card_list2.append(card)
def add_card3(self,card):
self.card_list3.append(card)
def choose_card(self):
global VALUES,izbor
self.choices=[]
if len(self.card_list) > 0:
for c in self.card_list:
if ( VALUES.get(c.get_rank()) >= thrown_cards[-1] ) or c.get_rank()== "2":
self.choices.append(c)
izbor = random.choice(self.choices)
elif len(self.card_list) == 0 and len(self.card_list2) > 0:
for c in self.card_list:
if VALUES.get(c.get_rank()) >= thrown_cards[-1] or c.get_rank()== "2":
self.choices.append(c)
izbor = random.choice(choices)
elif len(self.card_list) == 0 and len(self.card_list2) == 0 and len(self.card_list3) > 0:
izbor = random.choice(self.card_list3)
self.choices.append(izbor)
def throw_card(self):
global thrown_cards
if len(self.choices) == 0 :
self.card_list.append(thrown_cards)
thrown_cards=[]
elif len(self.choices) == 1 and ( choices[0].get_rank() < thrown_cards[-1] or choices[0].get_rank() != 2):
thrown_cards.append(izbor)
self.card_list.append(thrown_cards)
thrown_cards=[]
else:
is_valid(izbor)
if self.card_list > 0:
self.card_list.pop(self.card_list.index(izbor))
elif self.card_list == 0 and self.card_list2 >0:
self.card_list2.pop(self.card_list2.index(izbor))
else:
self.card_list3.pop(self.card_list3.index(izbor))
def draw(self,position):
pos = list(position)
for c in self.card_list:
c.draw(pos)
pos[0] += CARD_SIZE[0]/3
def draw2(self,position):
pos = list(position)
for c in self.card_list3:
c.draw(pos)
pos[0] += CARD_SIZE[0]/3
def draw3(self,position):
pos = list(position)
for c in self.card_list2:
c.draw3(pos)
pos[0] += CARD_SIZE[0]/3
def click(event):
global klik,counter
klik = (event.x-PLAYER_POS[0]-36) //(CARD_SIZE[0]//3)
if (len(player_hand.card_list) == 0) and (len(player_hand.card_list2) == 0) and (HEIGHT-148 < event.y < HEIGHT-52):
is_valid(player_hand.card_list3[klik])
if valid:
player_hand.card_list3.pop(klik)
player_hand.draw2(PLAYER_POS3)
elif (len(player_hand.card_list) == 0) and (len(player_hand.card_list2) > 0) and (HEIGHT-148 < event.y < HEIGHT-52):
is_valid(player_hand.card_list2[klik])
if valid:
player_hand.card_list2.pop(klik)
player_hand.draw3(PLAYER_POS2)
elif (HEIGHT-198 < event.y < HEIGHT-102):
is_valid(player_hand.card_list[klik])
if valid:
player_hand.card_list.pop(klik)
player_hand.draw(PLAYER_POS)
if len(player_hand.card_list) < 3 and len(game_deck.deck_list)>0:
player_hand.add_card(game_deck.deal_card())
player_hand.draw(PLAYER_POS)
counter +=1
root.after(1500,turn)
def start():
global game_deck,player_hand,komp_hand,komp2_hand,komp3_hand,card_list,thrown_cards
canvas.delete(ALL)
#Shuffle the deck
game_deck = Deck()
game_deck.shuffle()
#Create players hands
player_hand = Hand()
komp_hand = Hand()
komp2_hand = Hand()
komp3_hand = Hand()
thrown_cards=[]
#add three cards to each hand
player_hand.add_card(game_deck.deal_card())
player_hand.add_card(game_deck.deal_card())
player_hand.add_card(game_deck.deal_card())
player_hand.add_card2(game_deck.deal_card())
player_hand.add_card2(game_deck.deal_card())
player_hand.add_card2(game_deck.deal_card())
player_hand.add_card3(game_deck.deal_card())
player_hand.add_card3(game_deck.deal_card())
player_hand.add_card3(game_deck.deal_card())
komp_hand.add_card(game_deck.deal_card())
komp_hand.add_card(game_deck.deal_card())
komp_hand.add_card(game_deck.deal_card())
komp_hand.add_card2(game_deck.deal_card())
komp_hand.add_card2(game_deck.deal_card())
komp_hand.add_card2(game_deck.deal_card())
komp_hand.add_card3(game_deck.deal_card())
komp_hand.add_card3(game_deck.deal_card())
komp_hand.add_card3(game_deck.deal_card())
komp2_hand.add_card(game_deck.deal_card())
komp2_hand.add_card(game_deck.deal_card())
komp2_hand.add_card(game_deck.deal_card())
komp2_hand.add_card2(game_deck.deal_card())
komp2_hand.add_card2(game_deck.deal_card())
komp2_hand.add_card2(game_deck.deal_card())
komp2_hand.add_card3(game_deck.deal_card())
komp2_hand.add_card3(game_deck.deal_card())
komp2_hand.add_card3(game_deck.deal_card())
komp3_hand.add_card(game_deck.deal_card())
komp3_hand.add_card(game_deck.deal_card())
komp3_hand.add_card(game_deck.deal_card())
komp3_hand.add_card2(game_deck.deal_card())
komp3_hand.add_card2(game_deck.deal_card())
komp3_hand.add_card2(game_deck.deal_card())
komp3_hand.add_card3(game_deck.deal_card())
komp3_hand.add_card3(game_deck.deal_card())
komp3_hand.add_card3(game_deck.deal_card())
#Draw players card
player_hand.draw(PLAYER_POS)
player_hand.draw2(PLAYER_POS2)
komp_hand.draw(KOMP_POS2)
komp2_hand.draw(KOMP2_POS2)
komp3_hand.draw(KOMP3_POS2)
def turn():
global counter
canvas.delete(ALL)
if counter % 4 == 1:
komp_hand.choose_card()
komp_hand.throw_card()
if len(game_deck.deck_list) > 0:
komp_hand.add_card(game_deck.deal_card())
counter += 1
elif counter % 4 == 2:
komp2_hand.choose_card()
komp2_hand.throw_card()
if len(game_deck.deck_list) > 0:
komp2_hand.add_card(game_deck.deal_card())
counter += 1
elif counter %4 == 3:
komp3_hand.choose_card()
komp3_hand.throw_card()
if len(game_deck.deck_list) > 0:
komp3_hand.add_card(game_deck.deal_card())
counter += 1
root.after(1500,turn)
def is_valid(card):
global VALUES,thrown_cards,valid
if len(thrown_cards)>0:
if VALUES.get(card.get_rank()) >= thrown_cards[-1] or card.get_rank()== 2:
card.draw([640,480])
thrown_cards.append(card)
valid = True
else:
message = "Not a valid card !!"
valid = False
else:
card.draw([640,480])
thrown_cards.append(card)
valid = True
root=Tk()
root.bind("<Button-1>",click)
canvas=Canvas(root,height=HEIGHT,width=WIDTH)
canvas.pack()
menubar=Menu(root)
filemenu=Menu(menubar,tearoff=0)
filemenu.add_command(label="New Game", command = start)
menubar.add_cascade(label="File",menu=filemenu)
root.config(menu=menubar)
kajla = Game
root.mainloop()