Actually added the program this time; I'm thick
This commit is contained in:
parent
d06c26f400
commit
a9609089fc
1 changed files with 304 additions and 0 deletions
304
BuggySim.c
Normal file
304
BuggySim.c
Normal file
|
@ -0,0 +1,304 @@
|
|||
/*
|
||||
* Imagination Developer Day 2014 Buggy Challenge Simulator
|
||||
* © 2014 Ben Goldsworthy
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <time.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define BLACK 0
|
||||
#define WHITE 1
|
||||
|
||||
#define END 1
|
||||
#define TJUNCTION 2
|
||||
#define CROSSROAD 3
|
||||
#define LEFTTURN 4
|
||||
#define RIGHTTURN 5
|
||||
#define STRAIGHTROAD 6
|
||||
#define DEADEND 7
|
||||
#define CHECKAGAINBLOCK1 8
|
||||
#define CHECKAGAINBLOCK2 9
|
||||
#define CHECKAGAINBLOCK3 10
|
||||
|
||||
#define LEFTPATH 0
|
||||
#define RIGHTPATH 1
|
||||
#define STRAIGHTPATH 2
|
||||
#define PREVPATH 3
|
||||
|
||||
#define NOTTAKEN 0
|
||||
#define TAKEN 1
|
||||
#define NONE 2
|
||||
|
||||
#define LEFT 0
|
||||
#define RIGHT 1
|
||||
#define STRAIGHT 2
|
||||
#define PREVNONE 3
|
||||
|
||||
#define MIDDLE2BLACKLEFTANDRIGHTWHITE (Pin1 == WHITE) && (Pin4 == WHITE) && (Pin2 == BLACK || Pin3 == BLACK)
|
||||
#define ALL4BLACK (Pin1 == BLACK) && (Pin2 == BLACK) && (Pin2 == BLACK) && (Pin4 == BLACK)
|
||||
#define ALL4WHITE (Pin1 == WHITE) && (Pin2 == WHITE) && (Pin3 == WHITE) && (Pin4 == WHITE)
|
||||
#define LEFT3BLACKRIGHT1WHITE (((Pin1 == BLACK) && (Pin2 == BLACK)) && (Pin4 == WHITE)) || (((Pin1 == BLACK) && (Pin3 == BLACK)) && (Pin4 == WHITE))
|
||||
#define LEFT1WHITERIGHT3BLACK (((Pin4 == BLACK) && (Pin2 == BLACK)) && (Pin1 == WHITE)) || ((Pin4 == BLACK) && (Pin3 == BLACK)) && (Pin1 == WHITE)
|
||||
|
||||
void MoveForward(int seconds) {
|
||||
for (int i; i < seconds; i++) {
|
||||
printf("Action: Driving Forward for %d seconds\n", i);
|
||||
}
|
||||
}
|
||||
|
||||
void RotateLeft() {
|
||||
printf("Action: Rotating 90° Left\n");
|
||||
}
|
||||
|
||||
void RotateRight() {
|
||||
printf("Action: Rotating 90° Right\n");
|
||||
}
|
||||
|
||||
int DetectJunction(int Pin1, int Pin2, int Pin3, int Pin4, bool secondCheck, int secondCheckBlock) {
|
||||
if (!secondCheck) {
|
||||
if (MIDDLE2BLACKLEFTANDRIGHTWHITE) {
|
||||
return STRAIGHTROAD;
|
||||
} else if (ALL4BLACK) {
|
||||
printf("Thought: \"I've hit a perpendicular path, but cannot tell if it is a T-junction, crossroads or the end of the maze...\"\n");
|
||||
printf("Action: Inching Forward\n");
|
||||
return CHECKAGAINBLOCK1;
|
||||
} else if (LEFT3BLACKRIGHT1WHITE) {
|
||||
printf("Thought: \"I've hit a left path, but cannot tell if it is a left turn or a T-junction...\"\n");
|
||||
printf("Action: Inching Forward\n");
|
||||
return CHECKAGAINBLOCK2;
|
||||
} else if (LEFT1WHITERIGHT3BLACK) {
|
||||
printf("Thought: \"I've hit a right path, but cannot tell if it is a right turn or a T-junction...\"\n");
|
||||
printf("Action: Inching Forward\n");
|
||||
return CHECKAGAINBLOCK3;
|
||||
} else if (ALL4WHITE) {
|
||||
return DEADEND;
|
||||
}
|
||||
} else if (secondCheck) {
|
||||
if (secondCheckBlock == 0) {
|
||||
if (ALL4BLACK) {
|
||||
return END;
|
||||
} else if (ALL4WHITE) {
|
||||
return TJUNCTION;
|
||||
} else if (MIDDLE2BLACKLEFTANDRIGHTWHITE) {
|
||||
return CROSSROAD;
|
||||
}
|
||||
} else if (secondCheckBlock == 1) {
|
||||
if (ALL4WHITE) {
|
||||
return LEFTTURN;
|
||||
} else if (MIDDLE2BLACKLEFTANDRIGHTWHITE) {
|
||||
return TJUNCTION;
|
||||
}
|
||||
} else if (secondCheckBlock == 2) {
|
||||
if (LEFT1WHITERIGHT3BLACK) {
|
||||
return RIGHTTURN;
|
||||
} else if (MIDDLE2BLACKLEFTANDRIGHTWHITE) {
|
||||
return TJUNCTION;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool BeenHereBefore(int juncPrev) {
|
||||
if (juncPrev == PREVNONE)
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
}
|
||||
|
||||
int main() {
|
||||
int Pin1, Pin2, Pin3, Pin4;
|
||||
int jNum = 0;
|
||||
int jUnwind[100][4];
|
||||
int direction;
|
||||
bool secondCheck = false;
|
||||
int secondCheckBlock = 0;
|
||||
int entry;
|
||||
|
||||
for (int y = 0; y <= 100; y++) {
|
||||
jUnwind[y][PREVPATH] = PREVNONE;
|
||||
}
|
||||
|
||||
srand(time(NULL));
|
||||
for (int x = 0; x < 50; x++)
|
||||
printf("*");
|
||||
printf("\n* Imagination Developer Day 2014 Buggy Simulator *\n");
|
||||
for (int x = 0; x < 50; x++)
|
||||
printf("*");
|
||||
|
||||
for (;;) {
|
||||
printf("\n0 = Straight\n1 = Perpendicular\n2 = All White\n3 = Left Turn\n4 = Right Turn\n\n> ");
|
||||
scanf("%d", &entry);
|
||||
printf("\n");
|
||||
switch(entry)
|
||||
{
|
||||
case 0:
|
||||
Pin1 = 1;
|
||||
Pin2 = 0;
|
||||
Pin3 = 0;
|
||||
Pin4 = 1;
|
||||
break;
|
||||
case 1:
|
||||
Pin1 = 0;
|
||||
Pin2 = 0;
|
||||
Pin3 = 0;
|
||||
Pin4 = 0;
|
||||
break;
|
||||
case 2:
|
||||
Pin1 = 1;
|
||||
Pin2 = 1;
|
||||
Pin3 = 1;
|
||||
Pin4 = 1;
|
||||
break;
|
||||
case 3:
|
||||
Pin1 = 0;
|
||||
Pin2 = 0;
|
||||
Pin3 = 0;
|
||||
Pin4 = 1;
|
||||
break;
|
||||
case 4:
|
||||
Pin1 = 1;
|
||||
Pin2 = 0;
|
||||
Pin3 = 0;
|
||||
Pin4 = 0;
|
||||
break;
|
||||
default:
|
||||
printf("ERROR: Defalt Case Accessed\n");
|
||||
break;
|
||||
}
|
||||
|
||||
switch(DetectJunction(Pin1, Pin2, Pin3, Pin4, secondCheck, secondCheckBlock))
|
||||
{
|
||||
case END:
|
||||
printf("Thought: \"I have reached the end, and can finally die\"\n");
|
||||
return 0;
|
||||
case TJUNCTION:
|
||||
printf("Thought: \"I'm at a T-Junction...\"\n");
|
||||
if (BeenHereBefore(jUnwind[jNum][PREVPATH])) {
|
||||
printf("Thought: \"I have been here previously...\"\n");
|
||||
if (jUnwind[jNum][PREVPATH] == LEFT) {
|
||||
printf("Thought: \"I went left last time, so I must turn 90° left to face my original direction...\"\n");
|
||||
RotateLeft();
|
||||
} else if (jUnwind[jNum][PREVPATH] == RIGHT) {
|
||||
printf("Thought: \"I went right last time, so I must turn 90° right to face my original direction...\"\n");
|
||||
RotateRight();
|
||||
}
|
||||
direction = rand() % 2;
|
||||
while (jUnwind[jNum][direction] == TAKEN) {
|
||||
direction = rand() % 2;
|
||||
}
|
||||
} else {
|
||||
jUnwind[jNum][LEFTPATH] = jUnwind[jNum][RIGHTPATH] = NOTTAKEN;
|
||||
direction = rand() % 2;
|
||||
}
|
||||
jUnwind[jNum][direction] = TAKEN;
|
||||
if (direction == LEFT) {
|
||||
printf("Thought: \"I shall take a left...\"\n");
|
||||
jUnwind[jNum++][PREVPATH] = LEFT;
|
||||
RotateLeft();
|
||||
} else if (direction == RIGHT) {
|
||||
printf("Thought: \"I shall take a right...\"\n");
|
||||
jUnwind[jNum++][PREVPATH] = RIGHT;
|
||||
RotateRight();
|
||||
}
|
||||
secondCheck = false;
|
||||
break;
|
||||
case CROSSROAD:
|
||||
printf("Thought: \"I am at a crossroads...\"\n");
|
||||
printf("%d\n", jUnwind[jNum][PREVPATH]);
|
||||
if (BeenHereBefore(jUnwind[jNum][PREVPATH])) {
|
||||
printf("Thought: \"I have been here previously...\"\n");
|
||||
if (jUnwind[jNum][PREVPATH] == LEFT) {
|
||||
printf("Thought: \"I went left last time, so I must turn 90° left to face my original direction...\"\n");
|
||||
RotateLeft();
|
||||
} else if (jUnwind[jNum][PREVPATH] == RIGHT) {
|
||||
printf("Thought: \"I went right last time, so I must turn 90° right to face my original direction...\"\n");
|
||||
RotateRight();
|
||||
} else if (jUnwind[jNum][PREVPATH] == STRAIGHT) {
|
||||
printf("Thought: \"I went straight last time, so I must turn 180° to face my original direction...\"\n");
|
||||
RotateLeft();
|
||||
RotateLeft();
|
||||
}
|
||||
direction = rand() % 3;
|
||||
while (jUnwind[jNum][direction] == TAKEN) {
|
||||
direction = rand() % 3;
|
||||
}
|
||||
} else {
|
||||
jUnwind[jNum][LEFTPATH] = jUnwind[jNum][RIGHTPATH] = jUnwind[jNum][STRAIGHTPATH] = NOTTAKEN;
|
||||
direction = rand() % 3;
|
||||
}
|
||||
|
||||
jUnwind[jNum][direction] = TAKEN;
|
||||
if (direction == LEFT) {
|
||||
printf("Result: Going Left\n");
|
||||
jUnwind[jNum++][PREVPATH] = LEFT;
|
||||
RotateLeft();
|
||||
} else if (direction == RIGHT) {
|
||||
printf("Result: Going Right\n");
|
||||
jUnwind[jNum++][PREVPATH] = RIGHT;
|
||||
RotateRight();
|
||||
} else if (direction == STRAIGHT) {
|
||||
printf("Result: Going Straight\n");
|
||||
jUnwind[jNum++][PREVPATH] = STRAIGHT;
|
||||
MoveForward(1);
|
||||
}
|
||||
secondCheck = false;
|
||||
break;
|
||||
case LEFTTURN:
|
||||
printf("Thought: \"I am at a left turn...\"\n");
|
||||
RotateLeft();
|
||||
secondCheck = false;
|
||||
break;
|
||||
case RIGHTTURN:
|
||||
printf("Thought: \"I am at a right turn...\"\n");
|
||||
RotateRight();
|
||||
secondCheck = false;
|
||||
break;
|
||||
case STRAIGHTROAD:
|
||||
printf("Thought: \"I am on a straight...\"\n");
|
||||
MoveForward(3);
|
||||
secondCheck = false;
|
||||
break;
|
||||
case DEADEND:
|
||||
printf("Thought: \"I am at a dead end...\"\n");
|
||||
jNum--;
|
||||
RotateLeft();
|
||||
RotateLeft();
|
||||
secondCheck = false;
|
||||
break;
|
||||
case CHECKAGAINBLOCK1:
|
||||
printf("Thought: \"I should check again... (Block 1)\"\n");
|
||||
secondCheck = true;
|
||||
secondCheckBlock = 0;
|
||||
break;
|
||||
case CHECKAGAINBLOCK2:
|
||||
printf("Thought: \"I should check again... (Block 2)\"\n");
|
||||
secondCheck = true;
|
||||
secondCheckBlock = 1;
|
||||
break;
|
||||
case CHECKAGAINBLOCK3:
|
||||
printf("Thought: \"I should check again... (Block 3)\"\n");
|
||||
secondCheck = true;
|
||||
secondCheckBlock = 2;
|
||||
break;
|
||||
default:
|
||||
printf("ERROR: Default case accessed\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in a new issue