1

I am trying to make a clone copy of a tiktok rock, paper, scissors filter (link provided) but for some reason the first ball always seems to be gigantic compared to the rest, and it's also outside of the frame. This is not a consistent problem, but very irritating when it happens. Here is the TikTok Filter: https://www.tiktok.com/@rockpaperscissorsbattle/video/7178441127375195397 Gigantic Ball

I tried to use a function that checks if a ball has already spawned in the coordinates (which are randomly picked) to then pick other coordinates. This works on every other ball that isn't the first one.

Here is my code provided:

import pygame, random, math, sys
from pygame.locals import *
pygame.init()

WIDTH = 800
HEIGHT = 600
FELLES_STØRRELSE = 50
FPS = 60

win = pygame.display.set_mode([WIDTH, HEIGHT])
pygame.display.set_caption("Rock, Paper, Scissors")
font = pygame.font.SysFont("arialblack", 50)

#Bilder
stein_bilde = pygame.image.load("stein.png").convert_alpha()
saks_bilde = pygame.image.load("saks.png").convert_alpha()
papir_bilde = pygame.image.load("papir.png").convert_alpha()
start_img = pygame.image.load("start.png").convert_alpha()
exit_img = pygame.image.load("exit.png").convert_alpha()

#Bilder i riktig størrelse
scaled_stein = pygame.transform.scale(stein_bilde, (FELLES_STØRRELSE, FELLES_STØRRELSE))
scaled_saks = pygame.transform.scale(saks_bilde, (FELLES_STØRRELSE, FELLES_STØRRELSE))
scaled_papir = pygame.transform.scale(papir_bilde, (FELLES_STØRRELSE, FELLES_STØRRELSE))

class Button:
    def __init__(self, x, y, image, scale):
        width = image.get_width()
        height = image.get_height()
        self.image = pygame.transform.scale(image, (int(width * scale), int(height * scale)))
        self.rect = self.image.get_rect()
        self.rect.topleft = (x, y)
        self.clicked = False

    def draw(self, screen):
        action = False
        #get mouse position
        pos = pygame.mouse.get_pos()

        #check mouseover and clicked conditions
        if self.rect.collidepoint(pos):
            if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False:
                self.clicked = True
                action = True

        if pygame.mouse.get_pressed()[0] == 0:
            self.clicked = False

        #draw button on screen
        screen.blit(self.image, (self.rect.x, self.rect.y))

        return action

#Kaller Button klassen
start_button = Button(125, 225, start_img, 1)
exit_button = Button((800 - exit_img.get_width() - 125), 225, exit_img, 1)

antall_baller = 5

class Ball:
    def __init__(self, scaled_bilde, tracker):
        self.scaled_bilde = scaled_bilde
        self.tracker = tracker
        self.radius = FELLES_STØRRELSE // 2
        self.x_vel = 2
        self.y_vel = 2
        self.spawnBall()
    
    def spawnBall(self):
        while True:
            self.x = random.randint((self.radius + 5), (WIDTH - FELLES_STØRRELSE - 5))
            self.y = random.randint((self.radius + 5), (HEIGHT - FELLES_STØRRELSE - 5))
            for ball in everyone:
                if ball is self:
                    continue
                xAvstand2 = (self.x - ball.x)**2
                yAvstand2 = (self.y - ball.y)**2
                avstand = math.sqrt(xAvstand2 + yAvstand2)
                if avstand < self.radius + ball.radius:
                    break
            else:
                if self.x < self.radius or self.x > WIDTH - self.radius or self.y < self.radius or self.y > HEIGHT - self.radius:
                    continue
                else:
                    break

    def drawBall(self):
        win.blit(self.scaled_bilde, (self.x, self.y))

    def moveBall(self):
        self.x += self.x_vel
        if self.x <= 0:
            self.x_vel = -self.x_vel
        if self.x >= WIDTH - self.scaled_bilde.get_width():
            self.x_vel = -self.x_vel
            
        self.y += self.y_vel
        if self.y <= 0:
            self.y_vel = -self.y_vel
        if self.y >= HEIGHT - self.scaled_bilde.get_height():
            self.y_vel = -self.y_vel

everyone = []
stein = [Ball(stein_bilde, "STEIN") for i in range(antall_baller)]
everyone += stein
saks = [Ball(scaled_saks, "SAKS") for i in range(antall_baller)] 
everyone += saks
papir = [Ball(scaled_papir, "PAPIR") for i in range(antall_baller)]
everyone += papir
random.shuffle(everyone)

def chaseBall(objekter):
    for i, objekt in enumerate(objekter):
        for j, objekt2 in enumerate(objekter[i+1:]):
            xAvstand2 = (objekt.x - objekt2.x)**2
            yAvstand2 = (objekt.y - objekt2.y)**2
            avstand = math.sqrt(xAvstand2 + yAvstand2)

            if avstand < objekt.radius + objekt2.radius:
                if objekt.tracker == "STEIN" and objekt2.tracker == "PAPIR":
                    objekt.scaled_bilde = pygame.transform.scale(papir_bilde, (50, 50))
                    objekt.tracker = "PAPIR"
                    objekt.x_vel = -objekt.x_vel
                    objekt.y_vel = -objekt.y_vel
                    objekt2.x_vel = -objekt.x_vel
                    objekt2.y_vel = -objekt.y_vel
                elif objekt2.tracker == "STEIN" and objekt.tracker == "PAPIR":
                    objekt2.scaled_bilde = pygame.transform.scale(papir_bilde, (50, 50))
                    objekt2.tracker = "PAPIR"
                    objekt.x_vel = -objekt.x_vel
                    objekt.y_vel = -objekt.y_vel
                    objekt2.x_vel = -objekt.x_vel
                    objekt2.y_vel = -objekt.y_vel

                if objekt.tracker == "SAKS" and objekt2.tracker == "STEIN":
                    objekt.scaled_bilde = pygame.transform.scale(stein_bilde, (50, 50))
                    objekt.tracker = "STEIN"
                    objekt.x_vel = -objekt.x_vel
                    objekt.y_vel = -objekt.y_vel
                    objekt2.x_vel = -objekt.x_vel
                    objekt2.y_vel = -objekt.y_vel
                elif objekt2.tracker == "SAKS" and objekt.tracker == "STEIN":
                    objekt2.scaled_bilde = pygame.transform.scale(stein_bilde, (50, 50))
                    objekt2.tracker = "STEIN"
                    objekt.x_vel = -objekt.x_vel
                    objekt.y_vel = -objekt.y_vel
                    objekt2.x_vel = -objekt.x_vel
                    objekt2.y_vel = -objekt.y_vel

                if objekt.tracker == "PAPIR" and objekt2.tracker == "SAKS":
                    objekt.scaled_bilde = pygame.transform.scale(saks_bilde, (50, 50))
                    objekt.tracker = "SAKS"
                    objekt.x_vel = -objekt.x_vel
                    objekt.y_vel = -objekt.y_vel
                    objekt2.x_vel = -objekt.x_vel
                    objekt2.y_vel = -objekt.y_vel
                elif objekt2.tracker == "PAPIR" and objekt.tracker == "SAKS":
                    objekt2.scaled_bilde = pygame.transform.scale(saks_bilde, (50, 50))
                    objekt2.tracker = "SAKS"
                    objekt.x_vel = -objekt.x_vel
                    objekt.y_vel = -objekt.y_vel
                    objekt2.x_vel = -objekt.x_vel
                    objekt2.y_vel = -objekt.y_vel
                print(f"{objekt.tracker} og {objekt2.tracker}")

def drawGrid():
    blockSize = 25 #Set the size of the grid block
    for x in range(0, WIDTH, blockSize):
        for y in range(0, HEIGHT, blockSize):
            rect = pygame.Rect(x, y, blockSize, blockSize)
            pygame.draw.rect(win, (255, 255, 255), rect, 1)

def draw_menu():
    img = font.render("Rock, Paper, Scissors", True, (255, 255, 255))

    win.fill((0, 0, 0))
    win.blit(img, ((WIDTH - img.get_width()) // 2, 50))

def main():
    run = True
    clock = pygame.time.Clock()

    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
        
        clock.tick(FPS)
        draw_menu()

        if start_button.draw(win):
            play()
        if exit_button.draw(win):
            run = False

        pygame.display.update()
    
    pygame.quit()

def draw_play():
    global stein

    win.fill((0, 0, 0))
    drawGrid()
    for idx, val in enumerate(stein):
        val.drawBall()
        saks[idx].drawBall()
        papir[idx].drawBall()

def play():
    run = True
    clock = pygame.time.Clock()
    global stein

    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
                sys.exit()
        
        clock.tick(FPS)
        draw_play()
        for idx, val in enumerate(stein):
            val.moveBall()
            saks[idx].moveBall()
            papir[idx].moveBall()

        chaseBall(everyone)

        pygame.display.update()

    pygame.quit()

if __name__ == '__main__':
    main()
DiWaso
  • 19
  • 1

0 Answers0