-
Notifications
You must be signed in to change notification settings - Fork 0
/
dracula.c
121 lines (113 loc) · 3.91 KB
/
dracula.c
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// dracula.c
// Implementation of your "Fury of Dracula" Dracula AI
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "DracView.h"
#include "Game.h"
#include "Map.h"
#include "Places.h"
#include "Queue.h"
#include "Set.h"
typedef enum DRACULA_MESSAGE {
PLACING_TRAP,
PLACING_VAMPIRE,
HIDING,
DOUBLE_BACKING,
NOTHING
} DraculaMessage;
char *givePresetMessage(DracView gameState, DraculaMessage code);
void decideDraculaMove(DracView gameState) {
Round roundNum = giveMeTheRound(gameState);
//LocationID GLocation = whereIs(gameState, PLAYER_LORD_GODALMING);
//LocationID SLocation = whereIs(gameState, PLAYER_DR_SEWARD);
//LocationID HLocation = whereIs(gameState, PLAYER_VAN_HELSING);
//LocationID MLocation = whereIs(gameState, PLAYER_MINA_HARKER);
LocationID DLocation = whereIs(gameState, PLAYER_DRACULA);
if (roundNum == 0) {
registerBestPlay("FR", givePresetMessage(gameState, 6));
} else {
// Creating an empty set which will be filled with all legal moves by Dracula in current state
Set options = newSet();
// connections[] contains all locations Dracula can reach in one round minus the ones currently in his trail
int numConnections = 0;
LocationID *connections = whereCanIgo(gameState, &numConnections, TRUE, TRUE);
int numOptions = numConnections;
int i;
for (i = 0; i < numConnections; i++) {
setAdd(options, connections[i]);
}
if (doneHide(gameState) == FALSE && idToType(DLocation) != SEA) {
setAdd(options, HIDE);
numOptions++;
}
if (doneDoubleBack(gameState) == FALSE) {
setAdd(options, DOUBLE_BACK_1);
numOptions++;
if (roundNum >= 2) {
setAdd(options, DOUBLE_BACK_2);
numOptions++;
}
if (roundNum >= 3) {
setAdd(options, DOUBLE_BACK_3);
numOptions++;
}
if (roundNum >= 4) {
setAdd(options, DOUBLE_BACK_4);
numOptions++;
}
if (roundNum >= 5) {
setAdd(options, DOUBLE_BACK_5);
numOptions++;
}
}
if (numOptions == 0) {
setAdd(options, TELEPORT);
numOptions++;
}
LocationID * optionsArray = copySetToArray(options);
srand(time(NULL));
int choiceIndex = rand() % numOptions;
int messageCode = rand() % 5;
char * choice;
if (optionsArray[choiceIndex] >= MIN_MAP_LOCATION && optionsArray[choiceIndex] <= MAX_MAP_LOCATION) {
choice = idToAbbrev(optionsArray[choiceIndex]);
} else if (optionsArray[choiceIndex] == HIDE) {
choice = "HI";
} else if (optionsArray[choiceIndex] == DOUBLE_BACK_1) {
choice = "D1";
} else if (optionsArray[choiceIndex] == DOUBLE_BACK_2) {
choice = "D2";
} else if (optionsArray[choiceIndex] == DOUBLE_BACK_3) {
choice = "D3";
} else if (optionsArray[choiceIndex] == DOUBLE_BACK_4) {
choice = "D4";
} else if (optionsArray[choiceIndex] == DOUBLE_BACK_5) {
choice = "D5";
} else if (optionsArray[choiceIndex] == TELEPORT) {
choice = "TP";
}
registerBestPlay(choice, givePresetMessage(gameState, messageCode));
free(optionsArray);
disposeSet(options);
free(connections);
}
}
// Returns a witty message depending on game features.
// As Dracula, this is pretty useless, but it'll be funny to read later.
char *givePresetMessage(DracView gameState, DraculaMessage code) {
switch (code) {
case 0:
return "Quiet as a bat.";
case 1:
return "Where is she?!";
case 2:
return "Bats have nine lives.";
case 3:
return "If you hit me, you'll be charged for bat-tery.";
case 4:
return "You know I'm bat, I'm bat, I'm really really bat.";
default:
return "Mwuhahahaha";
}
}