Csönge Levente Webes portfólió

Ipari informatikai technikus

#Ceglédi SZC Bem József Műszaki Technikum és Szakképző Iskola, Csönge Levente, Horváth Ignác, Varga Roland, Felkészítő tanár: Szoboszlai Szabolcs

#Szükséges alap függvények
import math
def tavolsag(búvárrobot_x,búvárrobot_y,búvárrobot_z,i):#Két pont közötti távolság
    return math.sqrt((búvárrobot_x-használható_gyöngyök[i][0])**2+(búvárrobot_y-használható_gyöngyök[i][1])**2+(búvárrobot_z-használható_gyöngyök[i][2])**2)

def arany(búvárrobot_x,búvárrobot_y,búvárrobot_z,i):#Legjobb arányszámmal rendelkező gyöngy a robothoz mérve
    if tavolsag(búvárrobot_x,búvárrobot_y,búvárrobot_z,i)>0:    
        return gyöngyök[i][-1]/tavolsag(búvárrobot_x,búvárrobot_y,búvárrobot_z,i)
    else:
        return 0
def origo_robot(búvárrobot_x,búvárrobot_y,búvárrobot_z):#Origo és a robot közötti távolság
    return math.sqrt((búvárrobot_x-0)**2+(búvárrobot_y-0)**2+(búvárrobot_z-0)**2)

#Adatok bekérése
hosszúsag=int(input("Add meg a medence hosszúságát(x):"))
szélesség=int(input("Add meg a medence szélességet(y):"))
mélység=int(input("Add meg a medence mélységét(z):"))
sebesség=float(input("Add meg a búvárrobot sebességét(v):"))
idő=float(input("Add meg az időt(t):"))
max_út=idő*sebesség

#Gyöngyök koordinátájának és értékeinek beolvasása
gyöngyök=[]
with open('gyongyok.txt', 'r', encoding='utf=8') as forrás:
    for sor in forrás:
        sor=sor.strip().split(";")
        gyöngyök.append(sor)
for i in range(len(gyöngyök)):#Szóköz eltávolítása
    gyöngyök[i].remove(gyöngyök[i][4])
gyöngyök.remove(gyöngyök[0])
for i in range(len(gyöngyök)):#Számmá alakítás
    for k in range(len(gyöngyök[i])):
        gyöngyök[i][k]=int(gyöngyök[i][k])
gyöngyök_koordinátái=[] #Koordináták és értékek külön választása
gyöngyök_értékei=[]
for i in range(len(gyöngyök)):
    gyöngyök_koordinátái.append(gyöngyök[i][:3])
    gyöngyök_értékei.append(gyöngyök[i][-1])
használható_gyöngyök= [] # Felhasználható gyöngyök kiválasztása a medence paramétereihez igazítva
használható_értékek=[]
indexek=[]
for i in range(len(gyöngyök_koordinátái)):#Utat is nézzük
    if (max_út/2>=(origo_robot(gyöngyök_koordinátái[i][0],gyöngyök_koordinátái[i][1],gyöngyök_koordinátái[i][2]))) and (gyöngyök_koordinátái[i][0] <= hosszúsag) and (gyöngyök_koordinátái[i][1] <= szélesség) and (gyöngyök_koordinátái[i][2] <= mélység):        
        használható_értékek.append(gyöngyök_értékei[i])
        használható_gyöngyök.append(gyöngyök_koordinátái[i])
értékek=[]
for i in range(len(használható_értékek)):#Értékek elmentése
    értékek.append(használható_értékek[i])

#Búvárrobot aktuális pozíciója
búvárrobot_x, búvárrobot_y, búvárrobot_z=0, 0, 0
út=[[0, 0, 0]]#Az útban már alapból megvan a kezdőpont koordinátája
megtett_táv=0
érték_számláló=0
origó_távolság=0
while len(használható_gyöngyök) !=0:#Arányokat nézzük, hogy melyik a legkedvezőbb gyöngy a robot számára
    arányok=[]
    for i in range(len(használható_gyöngyök)):
        arányok.append(arany(búvárrobot_x,búvárrobot_y,búvárrobot_z,i))
    legjobb_arány=max(arányok)     
    for i in range(len(arányok)):
        if arányok[i]==legjobb_arány:
            index=i
            break
    x=búvárrobot_x 
    y=búvárrobot_y
    z=búvárrobot_z
    megtett_táv+=tavolsag(búvárrobot_x,búvárrobot_y,búvárrobot_z,i)
    búvárrobot_x, búvárrobot_y, búvárrobot_z=használható_gyöngyök[index][0], használható_gyöngyök[index][1], használható_gyöngyök[index][2] #A robot koordinátája felveszi az aktuális gyöngy koordinátáját
    if ((megtett_táv+origo_robot(búvárrobot_x,búvárrobot_y,búvárrobot_z))) >= max_út: #Ha nincs idő a legjobb arányra akkor visza lép az előző koordinátára
        megtett_táv=megtett_táv-(tavolsag(x,y,z,i))
        használható_gyöngyök.remove(használható_gyöngyök[index])#Törli a gyöngy koordinátáját és értékét
        használható_értékek.remove(használható_értékek[index])
        búvárrobot_x=x 
        búvárrobot_y=y
        búvárrobot_z=z
        #Mindezek nélkül a kitörölt gyöngy nélkül újraszámolja a legkedvezőbb gyögyöt addig amíg nem talál olyat amit még fel bírna venni a maradék időben 
    else:#Ha minden jó akkor pedig hozzárendeli az úthoz a döntését
        érték_számláló+=használható_értékek[index] 
        út.append(használható_gyöngyök[index])
        használható_gyöngyök.remove(használható_gyöngyök[index])
        használható_értékek.remove(használható_értékek[index])        
megtett_táv+=origo_robot(búvárrobot_x,búvárrobot_y,búvárrobot_z)
búvárrobot_x,búvárrobot_y,búvárrobot_z=0,0,0 
út.append([0, 0, 0])#Visszatér a kezdeti pontba és ezt az útba is elmenti

#A feladatban kért adatok kiírása
print("Az összegyűjtött gyöngyök száma:",len(értékek))
print("Összegyűjtött érték:",érték_számláló)
print("Végpozíció:",búvárrobot_x,búvárrobot_y,búvárrobot_z)

#Grafikus megjelenítés
az_út_koordinátái=[] #Csak x,y koordináták kiválogatása, mert az ábrázolás 2D-ben fut le
for i in range(len(út)):
    az_út_koordinátái.append(út[i][:2])
robot_mozgása=az_út_koordinátái[1:-1]
robot_mozgása.append([0,0])
felvehető_gyöngyök=[]
for i in range(len(robot_mozgása)):
    felvehető_gyöngyök.append(robot_mozgása[i])

import pygame
pygame.init()
clock = pygame.time.Clock()

# Megjelenítés
ablak_szélessége, ablak_magassága = 960, 540
ablak = pygame.display.set_mode((ablak_szélessége, ablak_magassága))
pygame.display.set_caption("Búvárrobot")

# Színek
háttér_szín = (0, 38, 255)
gyöngyök_színe = (255, 216, 0)
búvár_színe = (255, 0, 0)
fehér = (255, 255, 255)
fekete = (0, 0, 0)

# Medence mérete
téglalap_szélesség, téglalap_magasság = hosszúsag * 5, szélesség * 5
téglalap_x = (ablak_szélessége - téglalap_szélesség) // 2
téglalap_y = (ablak_magassága - téglalap_magasság) // 2

# Búvárrobot pozíciója
búvárrobot_x, búvárrobot_y = téglalap_x, téglalap_y
értékek.append(0)

# --- START GOMB ---
font = pygame.font.SysFont(None, 40)
start_gomb = pygame.Rect(20, 20, 120, 50)  # bal felső sarok
start_szöveg = font.render("Start", True, fekete)

# Animáció állapot
animacio_indul = False
index = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN and not animacio_indul:
            if start_gomb.collidepoint(event.pos):
                animacio_indul = True  # ha rákattintottunk a gombra, indul az animáció

    ablak.fill(háttér_szín)

    # Medence kirajzolása
    pygame.draw.rect(ablak, fehér, (téglalap_x, téglalap_y, téglalap_szélesség, téglalap_magasság), 2)

    if animacio_indul and index < len(robot_mozgása):
        # Robot léptetése
        búvárrobot_x, búvárrobot_y = téglalap_x + robot_mozgása[index][0] * 5, téglalap_y + robot_mozgása[index][1] * 5
        értékek[index] = 0

        # Gyöngyök kirajzolása
        for i in range(len(felvehető_gyöngyök)):
            pygame.draw.circle(ablak, gyöngyök_színe,
                               (téglalap_x + felvehető_gyöngyök[i][0] * 5, téglalap_y + felvehető_gyöngyök[i][1] * 5),
                               értékek[i], 30)
        # Robot kirajzolása
        pygame.draw.circle(ablak, búvár_színe, (búvárrobot_x, búvárrobot_y), 20)

        index += 1
        clock.tick(idő / len(értékek))
    else:
        # Ha még nem indult el -> Start gomb rajzolása
        pygame.draw.rect(ablak, fehér, start_gomb)
        ablak.blit(start_szöveg, (start_gomb.x + 20, start_gomb.y + 10))

    pygame.display.flip()

pygame.quit()