# Logic doesn't equal

• 11-14-2001
Logic doesn't equal
Listed below is the complete set of code for a problem.
It is the classic turtle graphics problem. PenUp, PenDown, Turn Left, Turn Right, Move, print Array.

The problem occurs during the boundary checking in a two dimensional array. The program works except for boundary checking area. The code has been commented out and marked.

In some cases the right / East and west boundary was not exceeded but the program jumped into the if > limit.

Also, the South and West boundary equations are posing a problem. My eyes are fuzzy from looking at this code.

Any Ideas?

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

const int PenUp = 1;
const int PenDown = 2;
const int TurnRight = 3;
const int TurnLeft = 4;
const int Move = 5;
const int PrintGrid = 6;
const int Stop = 9;
const int East = 0;
const int South = 1;
const int West = 2;
const int North = 3;
const int Max = 100; /* the maximum number of commands */
const int BoardSize = 20;
const char DrawChar = '*';
const char BlankChar = ' ';

void getCommands(int [][2]);
int turnRight(int &);
int turnLeft(int &);
bool movePen(bool, int [][BoardSize], int, int);
void printArray(int [][BoardSize]);

main()
{
int floor[BoardSize][BoardSize] = {{0,0}},
command, direction = East,
commandArray[Max][2] = {0,0}, distance, count = 0;
bool error_flag = false,
pen_is_down = false;

getCommands(commandArray);
command = commandArray[count][0];

while (command != Stop && !(error_flag)) {

switch (command) {

case PenUp:
pen_is_down = false;
break;

case PenDown:
pen_is_down = true;
break;

case TurnRight:
turnRight ( direction);
break;

case TurnLeft:
turnLeft( direction );
break;

case Move:
distance = commandArray[count][1];
movePen (pen_is_down, floor, direction, distance);
break;

case PrintGrid:
printArray (floor);
break;
}
command = commandArray[++count][0];
}
return 0;
}

void getCommands(int commands[][2])
{
int rowmarker = 0, cmd;
char letter;

do{
cout << "Enter command (" << Stop <<" to end input): ";
cin >> cmd;
commands[rowmarker][0] = cmd;
if (cmd == Move){
letter = cin.get(); /* gobble the comma */
cin >> commands[rowmarker][1];
}
rowmarker++;
}while((cmd != Stop) && (rowmarker < Max));
if(cmd != Stop) {
cout << "Too many commands!!\n";
cout << "Last command changed to " << Stop << endl;
commands[Max - 1][0] = Stop;
}
letter = cin.get();
}

int turnRight(int &d)
{
++d;
if (d==4)
d = 0;
return d;
}

int turnLeft(int &d)
{
if (d == 0)
d = 3;
else
--d;
return d;
}

bool movePen(bool down, int a[][BoardSize], int dir , int dist)
{
int floor[BoardSize][BoardSize] = {{0,0}};
static int row = 0;
static int column = 0;
static bool error_flag = false;
int i;

switch (dir){

case East:

// Code doesn't work

if ( column + dist > BoardSize ){ // code to prevent traveling beyond boundaries
cout << "You have exceeded the right side limits of the grid!\n";
printArray (floor);
error_flag = true;
break;}

++column; // this line makes turtle step into next box
if (down != false ) {
for ( i = 1 ; i <= dist; ++i ){
if ( a [ row ][column] == BlankChar )
a [ row ][column] = BlankChar;
else a [ row ][column] = DrawChar;
++ column;
}
}
else {
for ( i = 1; i <= dist; ++i ){
if ( a [ row ][column] == DrawChar )
a [ row ][column] = DrawChar;
else a [ row ][column] = BlankChar;
++ column;
}
}
--column; // this line brings him back
break;

case West:

/* CODE WON"T WORK
if ( column-dist <= -1 ){ // code to prevent traveling beyond boundaries
cout << column + dist << "\n";
cout << "You have exceeded the left side limits of the grid!\n";
printArray (floor);
error_flag = true;
break;}
*/

--column;
if ( down ) {
for ( i = 0; i < dist; ++i ){
if ( a [ row ][column] == BlankChar )
a [ row ][column] = BlankChar;
else a [ row ][column] = DrawChar;
--column;}
}
else {
for ( i = 0; i < dist; ++i ){
if ( a [ row ][column] == DrawChar )
a [row][column] = DrawChar;
else a [ row ][column] = BlankChar;
--column;}
}
++column;
break;

case South:

/* CODE WON'T WORK
if ( row+dist >= 21 ){ // code to prevent traveling beyond edge
cout << row + dist << "\n";
cout << "You have exceeded the right side limits of the grid!\n";
printArray (floor);
error_flag = true;
break;}
*/
++row;
if ( down ) {
for ( i = 0; i < dist; ++i ){
if ( a [ row ][column] == BlankChar )
a [ row ][column] = BlankChar;
else a [ row ][column] = DrawChar;
++row;}
}
else {
for ( i = 0; i < dist; ++i ){
if ( a [ row ][column] == DrawChar )
a [ row ][column] = DrawChar;
else a [ row ][column] = BlankChar;
++row;}
}
--row;
break;

case North:

/* CODE WON"T WORK
if ( column-dist <0 ){ // code to prevent traveling beyond edge
cout << row - dist << "\n";
cout << "You have exceeded the right side limits of the grid!\n";
printArray (floor);
error_flag = true;
break;}
*/
--row;
if ( down ) {
for ( i = 0; i < dist; ++i ){
if ( a [ row ][column] == BlankChar )
a [ row ][column] = BlankChar;
else a [ row ][column] = DrawChar;
--row;}
}
else {
for ( i = 0; i < dist; ++i ){
if ( a [ row ][column] == DrawChar )
a [ row ][column] = DrawChar;
else a [ row ][column] = BlankChar;
--row;}
}
++row;
break;
}
return down;
}

void printArray(int a[][BoardSize]){
int i,j;

for (i =0; i < BoardSize; i++){
for (j = 0 ; j < BoardSize; j++){
if (a[i][j] == 32)
cout << BlankChar;
else if ( a[i][j] == 42)
cout << DrawChar;
else cout << a[i][j];}
cout << "\n";}

}
• 11-14-2001
Salem
> if ( row+dist >= 21 ){ // code to prevent traveling beyond edge
Well this bit at least steps off the edge of the array
should be
> BoardSize

Personally, I'd look at writing a function which moves in a given direction just one step, and returns true/false depending on whether that move was successful.
Move 'n' steps can just call it in a loop until all the moves are done, or it returns false.
• 11-14-2001