Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdlib>
- #include <cmath>
- #include <iostream>
- #include "bot.h"
- using namespace std;
- bool isTree(Dwarf & dwarf, int r, int c);
- bool isNextToPineTree(Dwarf & dwarf, int r, int c);
- void moveToClosestPineTree(Dwarf & dwarf, int r, int c, ostream &log);
- double calcDist(int r1, int r2, int c1, int c2);
- string isNextToFence(Dwarf & dwarf, int r, int c);
- void moveToClosestFence(Dwarf & dwarf, int r, int c, ostream &log);
- bool isEmpty(Dwarf & dwarf, int r, int c);
- bool adjFence(Dwarf & dwarf, int r, int c);
- void buildFence(Dwarf & dwarf, int r, int c, string dir, ostream &log);
- const int MAX_ROWS = 40;
- const int MAX_COLS = 40;
- const int MAX_NUM = 10;
- int ROWS; // global variables
- int COLS;
- int NUM;
- bool buildMode;
- /* onStart:
- An Initialization procedure called at the start of the game.
- You can use it to initialize certain global variables, or do
- something else before the actual simulation starts.
- Parameters:
- rows: number of rows
- cols: number of columns
- num: number of dwarfs
- log: a cout-like log */
- void onStart(int rows, int cols, int num, std::ostream &log) {
- log << "Start!" << endl; // Print a greeting message
- ROWS = rows; // Save values in global variables
- COLS = cols;
- NUM = num;
- buildMode = false;
- }
- /* onAction:
- A procedure called each time an idle dwarf is choosing
- their next action.
- Parameters:
- dwarf: dwarf choosing an action
- day: day (1+)
- hours: number of hours in 24-hour format (0-23)
- minutes: number of minutes (0-59)
- log: a cout-like log */
- void onAction(Dwarf & dwarf, int day, int hours, int minutes, ostream &log) {
- int r = dwarf.row();
- int c = dwarf.col();
- if (dwarf.lumber() < 375 && buildMode == false) {
- // Look if there is a tree on the right from the dwarf
- if (dwarf.look(r, c+1) == PINE_TREE) { // Right
- // If there is a pine tree, chop it
- dwarf.start_chop(EAST);
- return;
- } else if (dwarf.look(r, c-1) == PINE_TREE) { // Left
- // If there is a pine tree, chop it
- dwarf.start_chop(WEST);
- return;
- } else if (dwarf.look(r+1, c) == PINE_TREE) { // Down
- // If there is a pine tree, chop it
- dwarf.start_chop(SOUTH);
- return;
- } else if (dwarf.look(r-1, c) == PINE_TREE) { // Up
- // If there is a pine tree, chop it
- dwarf.start_chop(NORTH);
- return;
- } else {
- // Otherwise, move to the closest tree
- moveToClosestPineTree(dwarf, r, c, log);
- return;
- }
- }
- if (buildMode == false) {
- if (dwarf.name() == 0) {
- if (isEmpty(dwarf, r, c + 1)) { // Right
- log << "Build fence" << endl;
- dwarf.start_build(EAST);
- } else if (isEmpty(dwarf, r, c-1)) { // Left
- log << "Build fence" << endl;
- dwarf.start_build(WEST);
- } else if (isEmpty(dwarf, r+1, c)) { // Down
- log << "Build fence" << endl;
- dwarf.start_build(SOUTH);
- } else { // Up
- log << "Build fence" << endl;
- dwarf.start_build(NORTH);
- }
- buildMode = true;
- return;
- }
- }
- if (buildMode == true) {
- string dir = isNextToFence(dwarf, r, c);
- log << dwarf.name() << " " << dir << endl;
- buildFence(dwarf, r, c, dir, log);
- }
- return;
- }
- bool isNextToPineTree(Dwarf & dwarf, int r, int c) {
- return (dwarf.look(r, c+1) == PINE_TREE ||
- dwarf.look(r, c-1) == PINE_TREE ||
- dwarf.look(r+1, c) == PINE_TREE ||
- dwarf.look(r-1, c) == PINE_TREE);
- }
- double calcDist(int r1, int r2, int c1, int c2) {
- // Distance formula
- return (abs(r1-r2) + abs(c1-c2));
- }
- void moveToClosestPineTree(Dwarf & dwarf, int r, int c, ostream &log) {
- int minDist = -1;
- int rr = 0;
- int cc = 0;
- for (int row = 0; row < ROWS; row++) {
- for (int col = 0; col < COLS; col++) {
- if (isEmpty(dwarf, row, col) && isNextToPineTree(dwarf, row, col)) {
- // Find distance
- int tmpDist = calcDist(r, row, c, col);
- // Check if distance is less than current min distance
- if (minDist == -1 || tmpDist < minDist) {
- minDist = tmpDist;
- rr = row;
- cc = col;
- }
- }
- }
- }
- log << "Walk to " << rr << " " << cc << endl;
- dwarf.start_walk(rr, cc);
- return;
- }
- string isNextToFence(Dwarf & dwarf, int r, int c) {
- if (adjFence(dwarf, r, c+1)) {
- return "EAST";
- } else if (adjFence(dwarf, r, c-1)) {
- return "WEST";
- } else if (adjFence(dwarf, r+1, c)) {
- return "SOUTH";
- } else if (adjFence(dwarf, r-1, c)) {
- return "NORTH";
- } else {
- return "NONE";
- }
- }
- bool adjFence(Dwarf & dwarf, int r, int c) {
- if (isEmpty(dwarf, r, c)) {
- return (dwarf.look(r, c+1) == FENCE ||
- dwarf.look(r, c-1) == FENCE ||
- dwarf.look(r+1, c) == FENCE ||
- dwarf.look(r-1, c) == FENCE);
- }
- return false;
- }
- void moveToClosestFence(Dwarf & dwarf, int r, int c, ostream &log) {
- int minDist = -1;
- int rr = 0;
- int cc = 0;
- for (int row = 0; row < ROWS; row++) {
- for (int col = 0; col < COLS; col++) {
- if (isEmpty(dwarf, row, col) && isNextToFence(dwarf, row, col) != "NONE") {
- // Find distance
- int tmpDist = calcDist(r, row, c, col);
- // Check if distance is less than current min distance
- if (minDist == -1 || tmpDist < minDist) {
- minDist = tmpDist;
- rr = row;
- cc = col;
- }
- }
- }
- }
- log << "Walk to " << rr << " " << cc << endl;
- dwarf.start_walk(rr, cc);
- }
- bool isEmpty(Dwarf & dwarf, int r, int c) {
- return dwarf.look(r, c) == EMPTY;
- }
- void buildFence(Dwarf & dwarf, int r, int c, string dir, ostream &log) {
- if (dir == "EAST") {
- log << "Build fence" << endl;
- dwarf.start_build(EAST);
- return;
- } else if (dir == "WEST") {
- log << "Build fence" << endl;
- dwarf.start_build(WEST);
- return;
- } else if (dir == "SOUTH") {
- log << "Build fence" << endl;
- dwarf.start_build(SOUTH);
- return;
- } else if (dir == "NORTH") {
- log << "Build fence" << endl;
- dwarf.start_build(NORTH);
- return;
- } else {
- // Otherwise, move to the closest fence
- moveToClosestFence(dwarf, r, c, log);
- return;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement