Advertisement

Fishy problem

Started by December 01, 2002 04:57 PM
0 comments, last by Nothingness 21 years, 11 months ago
Ok i am making a fish program that displays 5 fish in a 2d environment (i already made the 1D fish one) (also this is not graphics, just text, cout and such). The fish can move left, right, up, and down, as long as nothing is blocking it (ie another fish, or wall). So, i have one fish moving in an environment and when i get that fish moving without fault i will add the other fish movments. The problem is that,usually, when the fish moves from 0,0 to anywhere, and then back to 0,0 it draws another fish somewhere else in the matrix. I cannot figure out why it does that. Thats the usual problem, sometimes it can do that movement and nothing happens. Also i cant figure out how to tell the fish if it is surrounded not to move, because it can either be surrounded by 4 fish, or the fish could be in the corner and surround by ownly 2 fish. Once i figure that out i can add the other fish. Im gonna give the source, its kinda big. But once i get this program working fine I plan on making an entirely new program fully user based, meaning they can change the size of the matrix, how many fish, and the starting fish positions.
    
void TwoDFish()
{
	int ntimes = 0,i,j,LorR,cmove = 0;  //LorR (left or right), cmove (cant move)

	int fish1row = 0;
	int fish1col = 0;
	int fish2row = 1;
	int fish2col = 1;
	int fish3row = 2;       //intializes each fish row and column

	int fish3col = 2;
	int fish4row = 3;
	int fish4col = 3;
	int fish5row = 4;
	int fish5col = 4;
	int temp1,temp2,temp3,temp4;
	//tells how many times the fish bumped a wall or another fish

	int fish1bump = 0,fish2bump = 0,fish3bump = 0,fish4bump = 0,fish5bump = 0;
	
		
	char fmatrix[5][5] = {
		{'F','X','X','X','X'},
		{'X','A','X','X','X'},
		{'X','X','B','X','X'},         ///shows the matrix

		{'X','X','X','C','X'},
		{'X','X','X','X','D'}
		};

//random numbers each time

	srand((unsigned)time(NULL));

	//initial matrix

	cout<<"Initial matrix";
	for(i=0; i<=4; i++)
	{ 
		cout<<"\n";
		for(j =0; j<=4; j++)
		{
			cout<<fmatrix[i][j];
		}
	}
cout<<"\n";
          //start loop

        do
		{
			for(i=0; i<=4; i++)
			{
				cout<<"\n";
				for(j=0; j<=4; j++)
				{

                 
					LorR = rand() % 4;  //random between 0(right) 1(left),2(up),3(down)

			//fish 1 loop

              for(i=0; i<=4; i++)
				   {
				for(j=0; j<=4; j++)
					{
                    cout <<"\n";
					//go right

					if(LorR == 0)
					{
                      //it went right

						cout <<"Fish 1 moved right!\n";

					   //if at the end of the matrix					

					  if(fmatrix[fish1row][fish1col] == fmatrix[fish1row][4])
					  {
						  fish1bump = fish1bump + 1;
						  fmatrix[fish1row][fish1col] = 'F';
						  fish1col = 4;
					  }
                      //if not at the end of the matrix perform the right switch

					  else
					  {
                          //make sure there is not a fish next to it, if so make fish do another move

						  if(fmatrix[fish1row][fish1col + 1] != 'X')
						  {
							  do
							  { 
								 LorR = rand() % 4;   //try to move a new direction

								 cmove = cmove + 1;   //add to cant move

							  }while(LorR = 0);
						  fish1bump = fish1bump + 1;
						  }
						  else
						  {
						  temp1 = fmatrix[fish1row][fish1col];
						  fmatrix[fish1row][fish1col + 1] = 'F';
						  fmatrix[fish1row][fish1col] =temp1;
						  fmatrix[fish1row][fish1col] = 'X';
						  fish1col = fish1col + 1;
						  
						  }
					  }
					ntimes = ntimes + 1;  //add number of rotations

					}//close big if

					//go left

					if(LorR == 1)
					{
					   //it went left

						cout <<"Fish 1 moved Left!\n";

						//check to see if at beg of matrix

						if(fmatrix[fish1row][fish1col] ==  fmatrix[fish1row][0])
					   {
						   fish1bump = fish1bump + 1;
						   fmatrix[fish1row][fish1col] = 'F';
						   fish1col = 0;
						}
						//if not at end of matrix perform the right switch

						else
						{
							//make sure there is not a fish next to it, if so make fish do another move

							if(fmatrix[fish1row][fish1col - 1] != 'X')
							{
								do
								{
								  	LorR = rand() % 4;   //try a new direction

									cmove = cmove + 1;  //add to cant move

								}while(LorR = 1);
							 fish1bump = fish1bump + 1;
							}
							//if not perform right switch

							else
							{
								temp1 = fmatrix[fish1row][fish1col];
								fmatrix[fish1row][fish1col - 1] = 'F';
								fmatrix[fish1row][fish1col] = temp1;
								fmatrix[fish1row][fish1col] = 'X';
								fish1col = fish1col + 1;
							
							}
						}
					ntimes = ntimes + 1;   //add to number of rotations

					}//close big if

				//go up		

				if(LorR == 2)
				   {
					   //it went up

						cout <<"Fish 1 moved up!\n";

					    //check to see if at top of matrix

					   	if(fmatrix[fish1row][fish1col] ==  fmatrix[0][fish1col])
						{
						   fish1bump = fish1bump + 1;
						   fmatrix[fish1row][fish1col] = 'F';
						   fish1row = 0;
					   }
						//if not at top of matrix perform right switch

						else
						{
							//make sure ther is not a fish above it, if so make fish do another move

							if(fmatrix[fish1row - 1][fish1col]  != 'X')
							{
								do
								{
									LorR = rand() % 4;   //try a new direction

									cmove = cmove + 1;     //add to cant move

								}while (LorR = 2);
								fish1bump = fish1bump + 1;
							}
							//if not perform right switch

							else
							{
								temp1 = fmatrix[fish1row][fish1col];
								fmatrix[fish1row - 1][fish1col] = 'F';
								fmatrix[fish1row][fish1col] = temp1;
								fmatrix[fish1row][fish1col] = 'X';
								fish1row = fish1row - 1;
								  
							} 
						}
				ntimes = ntimes + 1;   //add to number of rotations

				}//close big if

				//go down

				  if(LorR == 3)
				   {
					  //it went down

						cout <<"Fish 1 moved Down!\n";
 
					  //check to see if at bottom of matrix

					   	if(fmatrix[fish1row][fish1col] ==  fmatrix[4][fish1col])
					   {
						   fish1bump = fish1bump + 1;
						   fmatrix[fish1row][fish1col] = 'F';
						   fish1row = 4;
					   }
				  	
				        //if not at bottom of matrix perform right switch

						else
						{
							//make sure ther is not a fish above it, if so make fish do another move

							if(fmatrix[fish1row + 1][fish1col]  != 'X')
							{
								do
								{
									LorR = rand() % 4;       //try a new direction

									cmove = cmove + 1;  //add to cant move

								}while (LorR = 3);
								fish1bump = fish1bump + 1;
							}
							//if not perform right switch

							else
							{
								temp1 = fmatrix[fish1row][fish1col];
								fmatrix[fish1row + 1][fish1col] = 'F';
								fmatrix[fish1row][fish1col] = temp1;
								fmatrix[fish1row][fish1col] = 'X';
								fish1row = fish1row + 1;
						  
							}

						}
				  ntimes = ntimes + 1;  //add to number of rotations

				  }//close big if


				  //if fish cant move stay where it is

				  if(cmove == 4)
				  {
					  fmatrix[fish1row][fish1col] = fmatrix[fish1row][fish1col];
				  }
              
                     //show matrix

				  for(i = 0; i<=4; i++)
				  {
					  cout<<"\n";
					  for(j = 0; j<=4; j++)
					  {
						  cout<<fmatrix[i][j];
					  }
				  }
		 
          }//close for 2 i loop

          }// close for 2 j loop

	}//close for big i loop

}//close for big j loop

}while(ntimes != 10);

}
   
[edited by - Nothingness on December 1, 2002 6:00:25 PM]
Ok, first off, don't base the fish positions off of the matrix. Group each fish into a struct at least, class at best, and use an array, as opposed to variables for each fish. Maybe even a vector, although that may be a little advanced.

I didn't check this for errors, but you get the idea...

struct FISH{    int x; // instead of 'column'    int y; // instead of 'row'    int bumps; // # times fish has bumped into something    // any other members...}  


then later, in your code, you can go:

#define MAX_FISH 5FISH fishies[MAX_FISH] 


... and then to reference the fish, you just go:

fishies[4].x = 4;fishies[4].y = 4;.... etc, etc ... 


Now if you wanted to do this really nice, you would make each fish a class, and include a collusion-testing member... but we'll keep it simple. Just have some sort of function like:

#define NORTH 0#define EAST 1#defi... etc.bool Move(FISH &f1, int moveDirection, const FISH * const fishes, int maxFishes, int tankWidth, int tankHeight){    FISH f1move = f1; // where the fish will be if it moves    switch(moveDirection)    {    case NORTH:        f1move.x--;        break;    case EAST:        f1move.x++;        break;    ... etc. etc. etc.    }        if((f1move.x > width) || (f1move.x > height) ||       (f1move.x < 0) || (f1move.x < 0))        return false;    for(int i = 0; i < maxFishes; i++)    {        if((f1move.X == fishes.x) && (f1move.Y == fishes.Y))            {            ++f1.bumps; // fish bumped into another fish            return false;            }    }    f1 = f1move; // move ok    return true;} 


Anyway, hope that helps. When you render, copy the original, fishless matrix, and then on the copy, add the fish. That's the cleanest way to do it. Hope this helped you out. Keep in mind my code may need some tweaking, but it should give you some ideas.


[edited by - Beowulf_ on December 1, 2002 6:45:31 PM]

This topic is closed to new replies.

Advertisement