1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
-- Fortgeschrittene Funktionale Programmierung,
-- LMU, TCS, Wintersemester 2015/16
-- Steffen Jost, Alexander Isenko
--
-- Übungsblatt 11. 13.01.2016
--
-- Teilaufgabe
-- A11-4a TemplateHaskell
--
-- Im Modul GameUnits sind einige
-- Kreaturen definiert, und eine Funktion,
-- um zwei gegeneinander Kämpfen zu lassen,
-- wie in Übungsblatt 7 bereits verwendet.
--
-- Es ist nervig, jedes Mal die komplette Figur einzugeben,
-- weshalb wir Konstanten definieren möchten, etwa so:
{-
units =
[ unit{ name = "Scout", str= 5 }
, unit{ name = "Crow", str= 5, hit=1, flyer=True }
, unit{ name = "Orc", str=20, hit=1 }
]
scout = units !! 0
crow = units !! 1
orc = units !! 2
-}
-- Es ist jedoch schwierig, dies konsistent zu halten!
-- Schreiben Sie innerhalb des Moduls GameUnit eine
-- Funktion, welche die entsprechende Konstanten-Deklaration
-- für alle Einheiten der stockUnitList automatisch generiert,
-- so dass der folgende Code danach funktioniert!
-- Hinweis: Dazu benötigen Sie vermutlich
-- aus Modul Language.Haskell.TH folgende Definitionen
-- ValD, VarP, NormalB, newName und QuasiQuoting
--
{-# LANGUAGE TemplateHaskell #-}
import GameUnits
$(stockUnitShortcuts)
main = do
dobattle orc elf
dobattle orc elf
dobattle elf dwarf
dobattle elf dwarf
dobattle elf dwarf
dobattle elf dwarf
dobattle :: Unit -> Unit -> IO ()
dobattle att def = do
putStrLn $ "Attacker: " ++ name att
putStrLn $ "Defender: " ++ name def
winner <- battle att def
putStrLn $ "Winner: " ++ show winner
putStrLn "---"
|