Segítene valaki ebben a haskell feladatban ?
A beadandómnak az egyik feladatát sehogy sem tudom megoldani. Tudna valaki segíteni benne ?
Plants vs. Zombies
A feladat összefoglaló leírása
A feladat során egy leegyszerűsített verzióját fogjuk a Plants vs Zombies játéknak implementálni. A játékban egy 5 soros pályán zombik masíroznak jobbról balra, míg a játékos növények lerakávásval próbálja megvédeni magát. A zombik nyernek, ha egy zombi elér a pálya bal oldalára. A játékos nyer, ha az összes zombi meghal. A játék során Napokat kell gyűjteni, amellyvel új növényeket lehet venni. Az eredeti videójátékkal kapcsolatban egyéb információ a Wikipédián olvasható.
Feladat:
Zombik mozgása és támadása
A zombik minden kör alatt a sebességüknek megfelelő mezőt mennek előre, amennyiben tudnak. Ha egy zombi nem tud előre menni, mert a mezőn, amin áll, van egy növény, akkor a zombi beleharap a növénybe és csökkenti az életponját 1-gyel és továbbra is azon a mezőn marad. Ez alól csak a Vaulting zombi a kivétel: ha még a sebessége 2, akkor az első növényt átugorja és halad tovább, viszont a sebessége 1-re csökken.
Definiáljuk a performZombieActions függvényt amely a modell összes zombijára elvégzi a fent említett megfelelő műveletet. Ha egy zombi eljutna a jatéktér végére, adjunk vissza Nothing-ot! A függvénynek nem kell kitörölnie a halott növényeket!
Segtíség: Segíthet egy olyan segédfüggvény implementálása, amely egy adott koordinátájú növény életponját csökkenti 1-gyel.
Kód :
import Data.List
type Coordinate = (Int, Int)
type Sun = Int
data Plant = Peashooter Int | Sunflower Int | Walnut Int | CherryBomb Int deriving (Show, Eq)
data Zombie = Basic Int Int | Conehead Int Int | Buckethead Int Int | Vaulting Int Int deriving (Show, Eq)
data GameModel = GameModel Sun [(Coordinate, Plant)] [(Coordinate, Zombie)] deriving (Show, Eq)
defaultPeashooter :: Plant
defaultPeashooter = Peashooter 3
defaultSunflower :: Plant
defaultSunflower = Sunflower 2
defaultWalnut :: Plant
defaultWalnut = Walnut 15
defaultCherryBomb :: Plant
defaultCherryBomb = CherryBomb 2
basic :: Zombie
basic = Basic 5 1
coneHead :: Zombie
coneHead = Conehead 10 1
bucketHead :: Zombie
bucketHead = Buckethead 20 1
vaulting :: Zombie
vaulting = Vaulting 7 2
-- Növény -1 életpont
minusone :: Plant -> Plant
minusone (Peashooter b) = (Peashooter (b-1))
minusone (Sunflower b) = (Sunflower (b-1))
minusone (Walnut b) = (Walnut (b-1))
minusone (CherryBomb b) = (CherryBomb (b-1))
-- Növény -1 életpont listában
minus :: [(Coordinate, Plant)] -> [(Coordinate, Plant)]
minus [] = []
minus ((a,b):xs) = ((a, (minusone b)): minus xs)
performZombieActions :: GameModel -> Maybe GameModel
performZombieActions ??????
Tesztesetek :
performZombieActions (GameModel 0 [] [((0,0), coneHead)]) == Nothing
performZombieActions (GameModel 0 [] [((0,1), coneHead)]) == Just (GameModel 0 [] [((0,0), coneHead)])
performZombieActions (GameModel 0 [((0,1), defaultWalnut)] [((0,1), coneHead)]) == Just (GameModel 0 [((0,1), Walnut 14)] [((0,1), coneHead)])
performZombieActions (GameModel 0 [((0,1), defaultWalnut)] [((0,1), vaulting)]) == Just (GameModel 0 [((0,1), defaultWalnut)] [((0,0), Vaulting 7 1)])
performZombieActions (GameModel 0 [((4,2),Sunflower 5)] [((a,b),c)|a<-[0,2,4],b<-[2,3,7,11],c<-[coneHead,basic,bucketHead,vaulting]])==Just (GameModel 0 [((4,2),Sunflower 2)] [((0,1),Conehead 10 1),((0,1),Basic 5 1),((0,1),Buckethead 20 1),((0,0),Vaulting 7 2),((0,2),Conehead 10 1),((0,2),Basic 5 1),((0,2),Buckethead 20 1),((0,1),Vaulting 7 2),((0,6),Conehead 10 1),((0,6),Basic 5 1),((0,6),Buckethead 20 1),((0,5),Vaulting 7 2),((0,10),Conehead 10 1),((0,10),Basic 5 1),((0,10),Buckethead 20 1),((0,9),Vaulting 7 2),((2,1),Conehead 10 1),((2,1),Basic 5 1),((2,1),Buckethead 20 1),((2,0),Vaulting 7 2),((2,2),Conehead 10 1),((2,2),Basic 5 1),((2,2),Buckethead 20 1),((2,1),Vaulting 7 2),((2,6),Conehead 10 1),((2,6),Basic 5 1),((2,6),Buckethead 20 1),((2,5),Vaulting 7 2),((2,10),Conehead 10 1),((2,10),Basic 5 1),((2,10),Buckethead 20 1),((2,9),Vaulting 7 2),((4,2),Conehead 10 1),((4,2),Basic 5 1),((4,2),Buckethead 20 1),((4,1),Vaulting 7 1),((4,2),Conehead 10 1),((4,2),Basic 5 1),((4,2),Buckethead 20 1),((4,1),Vaulting 7 1),((4,6),Conehead 10 1),((4,6),Basic 5 1),((4,6),Buckethead 20 1),((4,5),Vaulting 7 2),((4,10),Conehead 10 1),((4,10),Basic 5 1),((4,10),Buckethead 20 1),((4,9),Vaulting 7 2)])





A ChatGPT-be beraktam a kérdésed és megoldásnak ezt dobta ki. Ötletem sincs, hogy jó-e. Nem ismerem a haskell-t és a feladatot sem olvastam el. Biztos vagyok benne, hogy vannak hibák a kódba. Menj fel az oldalra és megtudod kérni az AI-t, hogy javítsa a kódodat, ha adott exception feljön vagy pedig csak nem értelmezte megfelelően a feladatot. Szerintem ott hamarabb is kapsz megoldást mint itt.
import Data.Maybe
data Zombie = Zombie { zombieCoords :: (Int, Int), zombieSpeed :: Int } deriving (Show, Eq)
data Plant = Plant { plantCoords :: (Int, Int), plantHealth :: Int } deriving (Show, Eq)
performZombieActions :: [Zombie] -> [(Int, Int)] -> Maybe [(Int, Int)]
performZombieActions zombies plants =
if any (\z -> zombieCoords z == (0, snd $ zombieCoords z)) zombies
then Nothing
else Just $ map (\z -> let (x, y) = zombieCoords z in
if x < 0
then (x + zombieSpeed z, y)
else if x >= length plants || plantHealth (getPlantAtCoords plants (x, y)) == 0
then (x - zombieSpeed z, y)
else if zombieSpeed z == 2
then (x - 1, y)
else (x, y)) zombies
getPlantAtCoords :: [(Int, Int)] -> (Int, Int) -> (Int, Int)
getPlantAtCoords plants coords = fromJust $ lookup coords plants
main = do
let zombies = [Zombie (1, 1) 2, Zombie (2, 1) 1]
let plants = [(1, 1), (2, 1)]
print $ performZombieActions zombies plants -- Just [(1,1), (1,1)]
print $ performZombieActions [Zombie (0, 1) 1] [(1,1)] -- Nothing
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!