Advertisement
pro-themes

Dwarves Part B

May 5th, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.23 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <cmath>
  3. #include <iostream>
  4. #include "bot.h"
  5.  
  6. using namespace std;
  7.  
  8. bool isTree(Dwarf & dwarf, int r, int c);
  9. bool isNextToPineTree(Dwarf & dwarf, int r, int c);
  10. void moveToClosestPineTree(Dwarf & dwarf, int r, int c, ostream &log);
  11. double calcDist(int r1, int r2, int c1, int c2);
  12. string isNextToFence(Dwarf & dwarf, int r, int c);
  13. void moveToClosestFence(Dwarf & dwarf, int r, int c, ostream &log);
  14. bool isEmpty(Dwarf & dwarf, int r, int c);
  15. bool adjFence(Dwarf & dwarf, int r, int c);
  16. void buildFence(Dwarf & dwarf, int r, int c, string dir, ostream &log);
  17.  
  18. const int MAX_ROWS = 40;
  19. const int MAX_COLS = 40;
  20. const int MAX_NUM = 10;
  21.  
  22. int ROWS; // global variables
  23. int COLS;
  24. int NUM;
  25. bool buildMode;
  26.  
  27. /* onStart:
  28. An Initialization procedure called at the start of the game.
  29. You can use it to initialize certain global variables, or do
  30. something else before the actual simulation starts.
  31. Parameters:
  32. rows: number of rows
  33. cols: number of columns
  34. num: number of dwarfs
  35. log: a cout-like log */
  36.  
  37. void onStart(int rows, int cols, int num, std::ostream &log) {
  38. log << "Start!" << endl; // Print a greeting message
  39.  
  40. ROWS = rows; // Save values in global variables
  41. COLS = cols;
  42. NUM = num;
  43. buildMode = false;
  44. }
  45.  
  46. /* onAction:
  47. A procedure called each time an idle dwarf is choosing
  48. their next action.
  49. Parameters:
  50. dwarf: dwarf choosing an action
  51. day: day (1+)
  52. hours: number of hours in 24-hour format (0-23)
  53. minutes: number of minutes (0-59)
  54. log: a cout-like log */
  55.  
  56. void onAction(Dwarf & dwarf, int day, int hours, int minutes, ostream &log) {
  57. int r = dwarf.row();
  58. int c = dwarf.col();
  59.  
  60. if (dwarf.lumber() < 375 && buildMode == false) {
  61. // Look if there is a tree on the right from the dwarf
  62. if (dwarf.look(r, c+1) == PINE_TREE) { // Right
  63. // If there is a pine tree, chop it
  64. dwarf.start_chop(EAST);
  65. return;
  66. } else if (dwarf.look(r, c-1) == PINE_TREE) { // Left
  67. // If there is a pine tree, chop it
  68. dwarf.start_chop(WEST);
  69. return;
  70. } else if (dwarf.look(r+1, c) == PINE_TREE) { // Down
  71. // If there is a pine tree, chop it
  72. dwarf.start_chop(SOUTH);
  73. return;
  74. } else if (dwarf.look(r-1, c) == PINE_TREE) { // Up
  75. // If there is a pine tree, chop it
  76. dwarf.start_chop(NORTH);
  77. return;
  78. } else {
  79. // Otherwise, move to the closest tree
  80. moveToClosestPineTree(dwarf, r, c, log);
  81. return;
  82. }
  83. }
  84.  
  85. if (buildMode == false) {
  86. if (dwarf.name() == 0) {
  87. if (isEmpty(dwarf, r, c + 1)) { // Right
  88. log << "Build fence" << endl;
  89. dwarf.start_build(EAST);
  90. } else if (isEmpty(dwarf, r, c-1)) { // Left
  91. log << "Build fence" << endl;
  92. dwarf.start_build(WEST);
  93. } else if (isEmpty(dwarf, r+1, c)) { // Down
  94. log << "Build fence" << endl;
  95. dwarf.start_build(SOUTH);
  96. } else { // Up
  97. log << "Build fence" << endl;
  98. dwarf.start_build(NORTH);
  99. }
  100. buildMode = true;
  101. return;
  102. }
  103. }
  104.  
  105. if (buildMode == true) {
  106. string dir = isNextToFence(dwarf, r, c);
  107. log << dwarf.name() << " " << dir << endl;
  108. buildFence(dwarf, r, c, dir, log);
  109. }
  110. return;
  111. }
  112.  
  113. bool isNextToPineTree(Dwarf & dwarf, int r, int c) {
  114. return (dwarf.look(r, c+1) == PINE_TREE ||
  115. dwarf.look(r, c-1) == PINE_TREE ||
  116. dwarf.look(r+1, c) == PINE_TREE ||
  117. dwarf.look(r-1, c) == PINE_TREE);
  118. }
  119.  
  120. double calcDist(int r1, int r2, int c1, int c2) {
  121. // Distance formula
  122. return (abs(r1-r2) + abs(c1-c2));
  123. }
  124.  
  125. void moveToClosestPineTree(Dwarf & dwarf, int r, int c, ostream &log) {
  126. int minDist = -1;
  127. int rr = 0;
  128. int cc = 0;
  129.  
  130. for (int row = 0; row < ROWS; row++) {
  131. for (int col = 0; col < COLS; col++) {
  132. if (isEmpty(dwarf, row, col) && isNextToPineTree(dwarf, row, col)) {
  133. // Find distance
  134. int tmpDist = calcDist(r, row, c, col);
  135. // Check if distance is less than current min distance
  136. if (minDist == -1 || tmpDist < minDist) {
  137. minDist = tmpDist;
  138. rr = row;
  139. cc = col;
  140. }
  141. }
  142. }
  143. }
  144.  
  145. log << "Walk to " << rr << " " << cc << endl;
  146. dwarf.start_walk(rr, cc);
  147. return;
  148. }
  149.  
  150. string isNextToFence(Dwarf & dwarf, int r, int c) {
  151. if (adjFence(dwarf, r, c+1)) {
  152. return "EAST";
  153. } else if (adjFence(dwarf, r, c-1)) {
  154. return "WEST";
  155. } else if (adjFence(dwarf, r+1, c)) {
  156. return "SOUTH";
  157. } else if (adjFence(dwarf, r-1, c)) {
  158. return "NORTH";
  159. } else {
  160. return "NONE";
  161. }
  162. }
  163.  
  164. bool adjFence(Dwarf & dwarf, int r, int c) {
  165. if (isEmpty(dwarf, r, c)) {
  166. return (dwarf.look(r, c+1) == FENCE ||
  167. dwarf.look(r, c-1) == FENCE ||
  168. dwarf.look(r+1, c) == FENCE ||
  169. dwarf.look(r-1, c) == FENCE);
  170. }
  171. return false;
  172. }
  173.  
  174. void moveToClosestFence(Dwarf & dwarf, int r, int c, ostream &log) {
  175. int minDist = -1;
  176. int rr = 0;
  177. int cc = 0;
  178.  
  179. for (int row = 0; row < ROWS; row++) {
  180. for (int col = 0; col < COLS; col++) {
  181. if (isEmpty(dwarf, row, col) && isNextToFence(dwarf, row, col) != "NONE") {
  182. // Find distance
  183. int tmpDist = calcDist(r, row, c, col);
  184. // Check if distance is less than current min distance
  185. if (minDist == -1 || tmpDist < minDist) {
  186. minDist = tmpDist;
  187. rr = row;
  188. cc = col;
  189. }
  190. }
  191. }
  192. }
  193.  
  194. log << "Walk to " << rr << " " << cc << endl;
  195. dwarf.start_walk(rr, cc);
  196. }
  197.  
  198. bool isEmpty(Dwarf & dwarf, int r, int c) {
  199. return dwarf.look(r, c) == EMPTY;
  200. }
  201.  
  202. void buildFence(Dwarf & dwarf, int r, int c, string dir, ostream &log) {
  203. if (dir == "EAST") {
  204. log << "Build fence" << endl;
  205. dwarf.start_build(EAST);
  206. return;
  207. } else if (dir == "WEST") {
  208. log << "Build fence" << endl;
  209. dwarf.start_build(WEST);
  210. return;
  211. } else if (dir == "SOUTH") {
  212. log << "Build fence" << endl;
  213. dwarf.start_build(SOUTH);
  214. return;
  215. } else if (dir == "NORTH") {
  216. log << "Build fence" << endl;
  217. dwarf.start_build(NORTH);
  218. return;
  219. } else {
  220. // Otherwise, move to the closest fence
  221. moveToClosestFence(dwarf, r, c, log);
  222. return;
  223. }
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement