
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()