import pygame import random import pytweening def Tween(value, endValue, step): result =…
- User
import pygame import random import pytweening
def Tween(value, endValue, step): result = [] for i in range(step+1): t = i / step interpolated_value = pytweening.easeOutSine(t) * (endValue - value) + value result.append(interpolated_value) return result
Pygame initialisatie
pygame.init()
Laad het bord afbeelding
bord_afbeelding = pygame.image.load("./Media/Fotos/bord.png")
Laad de achtergrondmuziek
achtergrond_muziek = pygame.mixer.Sound("./Media/Muziek/Test.mp3") pygame.mixer.music.load('./Media/Muziek/Test.mp3')
Coördinaten van de vakjes op het bord
vakjes = [ [784, 888], [678, 888], [587, 888], [487, 888], [382, 888], [275, 888], [166, 888], [63, 888], [63, 800], [166, 800], [275, 800], [382, 800], [487, 800], [587, 800], [678, 800], [678, 707], [587, 707], [487, 707], [382, 707], [275, 707], [166, 707], [63, 707], [63, 605], [166, 605], [275, 605], [382, 605], [487, 605], [587, 605], [678, 605], [678, 493], [587, 493], [487, 493], [382, 493], [275, 493], [166, 493], [63, 493], [63, 379], [166, 379], [275, 379], [382, 379], [487, 379], [587, 379], [678, 379], [678, 275], [587, 275], [487, 275], [382, 275], [275, 275], [166, 275], [63, 275], [63, 173], [166, 173], [275, 173], [382, 173], [487, 173], [587, 173], [678, 173], [678, 70], [587, 70], [487, 70], [382, 70], [275, 70], [166, 70], [63, 70] ]
Aantal Spelers
spelers = 3
def setPlayers(aantal): global spelers, posities spelers = aantal
posities = [0] * spelerssetPlayers(spelers)
Houdt bij wie aan de beurt is (0 = speler1, 1 = speler2, etc)
beurt = 0
Houdt de dobbelsteenworp bij
worp = 0
Afmetingen van het venster
screen_width = 1005 screen_height = 953 WINDOW_SIZE = [screen_width, screen_height] screen = pygame.display.set_mode(WINDOW_SIZE)
Titel van het spel
pygame.display.set_caption("Ankers en Kanonnen!")
Speciale posities voor de ankers en kanonnen
special_positions = { 3:17, 20:33, 28:42, 40:46, 47:61, 58:45, 48:34, 32:16, 25:11, }
Functie om aan te geven of er naar een speciaal vakje moet worden gegaan
def handle_special_position(position): for x in special_positions: index = x if position == index: value = special_positions[x] return True, value return False, None
Laad alle dobbelsteen afbeeldingen
dice_images = {} for i in range(1, 7): dice_images[i] = pygame.image.load(f"dice\dice{i}.png")
Functie om een dobbelsteen van een bepaald nummer te laten zien op een plek op het scherm
def RollDiceAtPosition(x, y, number): # Selecteer de juiste dobbelsteen afbeelding dice_image = dice_images[number]
# Laat de dobbelsteen foto zien dice_rect = dice_image.get_rect(center=(x, y)) screen.blit(dice_image, dice_rect) pygame.display.flip() pygame.time.delay(100)Oneindige loop totdat het kruisje wordt geklikt om het af te sluiten
done = False
Klok voor de framerate
clock = pygame.time.Clock()
define colors
WHITE = (255, 255, 255) BLACK = (0, 0, 0) BLUE = (0, 0, 255) GREEN = (0, 255, 0)
define fonts
font = pygame.font.SysFont(None, 32)
define button class
class Button: def init(self, rect, text, text_color, bg_color, font): self.rect = pygame.Rect(rect) self.text = text self.text_color = text_color self.bg_color = bg_color self.font = font self.rendered_text = self.font.render(self.text, True, self.text_color) self.rendered_text_rect = self.rendered_text.get_rect(center=self.rect.center)
def draw(self, surface): pygame.draw.rect(surface, self.bg_color, self.rect) surface.blit(self.rendered_text, self.rendered_text_rect) def contains_point(self, point): return self.rect.collidepoint(point)define buttons
button_option_4_players = [] for i in range(4): rect = (screen_width/2 - 200 + 100*i, screen_height/2 - 125, 100, 50) text = f"{i+1} player{'s' if i != 0 else ''}" button = Button(rect, text, WHITE, GREEN, font) button_option_4_players.append(button)
play_button = Button((screen_width/2 - 100, screen_height/2 + 25, 200, 50), "Play", WHITE, BLUE, font) players_label = Button((screen_width/2 - 100, screen_height/2 - 200, 200, 50), "Players", WHITE, BLACK, font)
def toonMenu(): # set up the loop running = True while running: # handle events for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.MOUSEBUTTONUP: pos = pygame.mouse.get_pos() if play_button.contains_point(pos): print("Play button clicked!") running = False for button in button_option_4_players: if button.contains_point(pos): setPlayers(int(button.text[0])) for b in button_option_4_players: b.bg_color = GREEN button.bg_color = BLUE
# draw the screen screen.fill(BLACK) for button in button_option_4_players: button.draw(screen) play_button.draw(screen) players_label.draw(screen) # update the screen pygame.display.flip() # tick the clock clock.tick(60)toonMenu()
def update_screen(): # ---------- Teken de graphics (nog buiten beeld) ----------
screen.fill((255,255,255)) # Begint met een witte achtergrond bordrect = bord_afbeelding.get_rect() # Vraag afmetingen (rectange) van het bordplaatje op screen.blit(bord_afbeelding, bordrect) # Teken het bord # Teken pionnen als gekleurde cirkels op de coordinaten van de vakjes waar ze staan: spelerkleuren = [(255, 0, 0), (0, 0, 255), (0, 255, 0), (0, 0, 0)] #Rood, Blauw, Groen, Zwart for x in range(spelers): spelerx = vakjes[posities[x]][0] + x*3 spelery = vakjes[posities[x]][1] + x*3 spelerkleur = spelerkleuren[x] pygame.draw.circle(screen, spelerkleur, (spelerx, spelery), 10) # Kies lettergrootte myfont = pygame.font.SysFont(None, 25) # Teken laatste worp op het scherm text = "Laatste worp: " + str(worp) label = myfont.render(text, 1, (204, 0, 0)) screen.blit(label, (750, 730)) # Teken de speler die aan de beurt is op het scherm text = "Aan de beurt: " + str(beurt + 1) label = myfont.render(text, 1, (255, 153, 0)) screen.blit(label, (750, 700)) # ---------- Ververs het beeldscherm met de nieuwe graphics ---------- clock.tick(60) # Limiet op 60 Frames per seconde pygame.display.flip() # Ververs het beeldscherm met de bijgewerkte versie---------- Hoofdloop van het programma ----------
while not done: # ---------- Check gebeurtenissen (zoals muiskliks etc) ----------
for event in pygame.event.get(): if event.type == pygame.QUIT: # Het kruisje is aangeklikt done = True # Het spel moet eindigen dus we zetten done op True elif event.type == pygame.KEYDOWN: # er is een toets ingedrukt, we kijken welke en ondernemen actie if event.key == pygame.K_SPACE: # De spatie knop is ingedrukt. We willen nu de dobbelsteen gooien en de pion bewegen worp = random.randint(1,6) # De dobbelsteen worp (1-6) RollDiceAtPosition(800, 800, worp) Tween(posities[beurt], posities[beurt] + worp, 10) posities[beurt] += worp # Verzet de pion # Als de speler op een speciale positie aankomt dan word hij aan het einde van die ladder of slang gezet isSpecial, endPosition = handle_special_position(posities[beurt]) if isSpecial: update_screen() # time.sleep(1) #instead of using the time.sleep above and then teleporting the pawn, we want to instead make it tween posities[beurt] = endPosition # Als de speler over het laatste vakje heen gaat dan zal de speler naar het laatste vakje gaan if posities[beurt] > 63: verschil = posities[beurt]-63 posities[beurt] = 63-verschil if posities[beurt] == 63: # Als iemand heeft gewonnen dan toonMenu() # Zet de spelers weer op het beginvakje for x in range(0,spelers,1): posities[x] = 0 # Geef de beurt weer aan speler 1 beurt = 0 else: # Geef de beurt door aan de volgende speler if beurt < (spelers-1): #spelers is min 1 gedaan omdat de beurt begint op 0 beurt += 1 else: beurt = 0 update_screen()---------- Afsluiting ----------
pygame.quit()
Addons [[
# [✔] Visuele dobbelsteen # [✔] Meerdere Spelers # [✔] Menu # [✔] Settings # [✔] Karakters lopen terug als ze verder gaan dan het einde # [+] De karakters worden getweend in een smooth movement ipv geteleporteerd # [+] Popups (Wie heeft de game gewonnen, In game events zoals kannon of anker) # [+] Muziek en sound-effects # [+] Nieuw bord en karakters]]
FIX DEZE CODE ZODAT HET ALLEMAAL WERKT VOORAL DE TWEEN
- Assistant
import pygame import random import pytweening
def Tween(from_val, to_val, duration): steps = int(duration/1000*60) values = [] for i in range(steps): ratio = i / steps value = from_val + ratio * (to_val - from_val) rounded = round(value) values.append(rounded) return values
Pygame initialisatie
pygame.init()
Laad het bord afbeelding
bord_afbeelding = pygame.image.load("./Media/Fotos/bord.png")
Laad de achtergrondmuziek
achtergrond_muziek = pygame.mixer.Sound("./Media/Muziek/Test.mp3") pygame.mixer.music.load('./Media/Muziek/Test.mp3')
Coördinaten van de vakjes op het bord
vakjes = [ [784, 888], [678, 888], [587, 888], [487, 888], [382, 888], [275, 888], [166, 888], [63, 888], [63, 800], [166, 800], [275, 800], [382, 800], [487, 800], [587, 800], [678, 800], [678, 707], [587, 707], [487, 707], [382, 707], [275, 707], [166, 707], [63, 707], [63, 605], [166, 605], [275, 605], [382, 605], [487, 605], [587, 605], [678, 605], [678, 493], [587, 493], [487, 493], [382, 493], [275, 493], [166, 493], [63, 493], [63, 379], [166, 379], [275, 379], [382, 379], [487, 379], [587, 379], [678, 379], [678, 275], [587, 275], [487, 275], [382, 275], [275, 275], [166, 275], [63, 275], [63, 173], [166, 173], [275, 173], [382, 173], [487, 173], [587, 173], [678, 173], [678, 70], [587, 70], [487, 70], [382, 70], [275, 70], [166, 70], [63, 70] ]
Aantal Spelers
spelers = 3
def setPlayers(aantal): global spelers, posities spelers = aantal
posities = [0] * spelerssetPlayers(spelers)
Houdt bij wie aan de beurt is (0 = speler1, 1 = speler2, etc)
beurt = 0
Houdt de dobbelsteenworp bij
worp = 0
Afmetingen van het venster
screen_width = 1005 screen_height = 953 WINDOW_SIZE = [screen_width, screen_height] screen = pygame.display.set_mode(WINDOW_SIZE)
Titel van het spel
pygame.display.set_caption("Ankers en Kanonnen!")
Speciale posities voor de ankers en kanonnen
special_positions = { 3:17, 20:33, 28:42, 40:46, 47:61, 58:45, 48:34, 32:16, 25:11, }
Functie om aan te geven of er naar een speciaal vakje moet worden gegaan
def handle_special_position(position): for x in special_positions: index = x if position == index: value = special_positions[x] return True, value return False, None
Laad alle dobbelsteen afbeeldingen
dice_images = {} for i in range(1, 7): dice_images[i] = pygame.image.load(f"dice\dice{i}.png")
Functie om een dobbelsteen van een bepaald nummer te laten zien op een plek op het scherm
def RollDiceAtPosition(x, y, number): # Selecteer de juiste dobbelsteen afbeelding dice_image = dice_images[number]
# Laat de dobbelsteen foto zien dice_rect = dice_image.get_rect(center=(x, y)) screen.blit(dice_image, dice_rect) pygame.display.flip() pygame.time.delay(100)Oneindige loop totdat het kruisje wordt geklikt om het af te sluiten
done = False
Klok voor de framerate
clock = pygame.time.Clock()
define colors
WHITE = (255, 255, 255) BLACK = (0, 0, 0) BLUE = (0, 0, 255) GREEN = (0, 255, 0)
define fonts
font = pygame.font.SysFont(None, 32)
define button class
class Button: def init(self, rect, text, text_color, bg_color, font): self.rect = pygame.Rect(rect) self.text = text self.text_color = text_color self.bg_color = bg_color self.font = font self.rendered_text = self.font.render(self.text, True, self.text_color) self.rendered_text_rect = self.rendered_text.get_rect(center=self.rect.center)
def draw(self, surface): pygame.draw.rect(surface, self.bg_color, self.rect) surface.blit(self.rendered_text, self