Kezdőoldal » Számítástechnika » Programozás » Segítene valaki ebben a...

Segítene valaki ebben a haskell feladatban ?

Figyelt kérdés

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



2022. dec. 14. 14:35
 1/2 anonim ***** válasza:
Mi a kérdés?
2022. dec. 14. 16:15
Hasznos számodra ez a válasz?
 2/2 anonim ***** válasza:

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.


[link]


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

2022. dec. 14. 20:07
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!