so i guess there must be some sort of an error in my logic but on line 119 i started a counter that only goes up when a pair is made in the game. Since there are a total of 8 pairs, i set that when the counter is 8 the bool nullexists turns false. when it is false it should skip the while loop and output that you have won.

Any ideas on what is actually wrong here? I did check and the counter is going up at the correct times

here is the code

``````//*******************************************************************************************************************
// Homework 5
//
//
//
//
// This program is a matching game.  The user uses a cordinant system to select
// cards on a 4x4 board.
// Input:			the user inputs the cordinants of the cards they want to flip
// Processing: 		the program randomly generates pairs of cards in random locations
//					on the 4x4 board.  it also adjusts the user input so that the
//					cordinants match with the matrix counting system.
// Output: 			the game board, the cards fliped, if they match, and the next board piece
//*******************************************************************************************************************

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
char comma;
int row1, row1a, column1, column1a, row2, row2a, column2, column2a, cards[4][4], cards_unflipped[4][4] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} , counter(0), g(0);
bool nullexists = true;
srand((unsigned)time(NULL));

//fill board with pairs
bool makeNext = false;
memset(cards, 0, sizeof(cards));
srand(time(NULL));

for( int i = 1; i < 9; i++ )
{
makeNext = false;
while(!makeNext)
{
int x1, y1, x2, y2;
x1 = rand()%4;
y1 = rand()%4;
x2 = rand()%4;
y2 = rand()%4;
if( (x1 != x2 || y1 != y2) && (cards[x1][y1] == 0 && cards[x2][y2] == 0) )
{
cards[x1][y1] = i;
cards[x2][y2] = i;
makeNext = true;;
}
}
}

// initial display board
cout<<"    1 2 3 4\n";
cout<<"  ";
for (int i=0; i<=8; i++)
{
cout<<"-";
}

cout<<endl;

for (int r=0; r<4; r++)
{
cout<<r+1<<" | ";
for (int c=0; c<4; c++)
{
cout<<cards_unflipped[r][c]<<" ";
}
cout<<endl;
}

//Game Loop --------------------------------------------------------------------------------
while (nullexists = true)

{
//selection of cards
cout << "Please select the first card row and column seperated by a comma.\n";
cin >> row1a >> comma >> column1a;

cout<<"Please select the second card row and column seperated by a comma.\n";
cin>>row2a>>comma>>column2a;

// adjusting for matrix cordinants
row1 = row1a - 1;
row2 = row2a - 1;
column1 = column1a - 1;
column2 = column2a - 1;

// make sure that the cordinants are on the board
if (row1a > 4 || row2a > 4 || column1a > 4 || column2a > 4 || row1a < 1 || row2a < 1 || column1a < 1 || column2a < 1)
{
cout << "please pick cordinants on the board." << endl <<endl;

cout << "Please select the first card row and column seperated by a comma.\n";
cin >> row1a >>comma >> column1a;

cout << "Please select the second card row and column seperated by a comma.\n";
cin >> row2a >> comma >> column2a;

}

// cards chosen
cout << "The cards you picked were " << cards[row1][column1] << " and " << cards[row2][column2] << endl;

if (cards[row1][column1]== cards[row2][column2])

{
cards_unflipped[row1][column1] = cards[row1][column1];
cards_unflipped[row2][column2] = cards[row2][column2];

counter = counter++;
if (counter == 8)
{
bool nullexists = false;
}

if (bool nullexists = false)
{
cout << " Congrats, You Won!" << endl;
break;
}

cout << "Press n to continue." << endl;
while (1)
{
if (getchar() == 'n')
{
break;
}
}

// move to blank screen
for (g=0; g <= 20; g++)
{
cout << endl;
}

//reveal the flipped cards
cout<<"    1 2 3 4\n";
cout<<"  ";
for (int i=0; i<=8; i++)
{
cout<<"-";
}
cout<<endl;
for (int r=0; r<4; r++)
{
cout<<r+1<<" | ";
for (int c=0; c<4; c++)
{

cout<<cards_unflipped[r][c]<<" ";
}
cout<<endl;
}

}

else
{

cards_unflipped[row1][column1] = cards[row1][column1];
cards_unflipped[row2][column2] = cards[row2][column2];

//reveal the flipped cards
cout<<"    1 2 3 4\n";
cout<<"  ";
for (int i=0; i<=8; i++)
{
cout<<"-";
}
cout<<endl;
for (int r=0; r<4; r++)
{
cout<<r+1<<" | ";
for (int c=0; c<4; c++)
{
cout<<cards_unflipped[r][c]<<" ";
}

cout<<endl;
}

// pause for user to look at the cards they flipped
cout << "Press n to continue." << endl;
while (1)
{
if (getchar() == 'n')
{
break;
}
}

//reset flipped cards

cards_unflipped[row1][column1] = 0;
cards_unflipped[row2][column2] = 0;

// move to blank screen

for (g=0; g <= 20; g++)
{
cout << endl;
}

//reveal the flipped cards
cout<<"    1 2 3 4\n";
cout<<"  ";
for (int i=0; i<=8; i++)
{
cout<<"-";
}
cout<<endl;
for (int r=0; r<4; r++)
{
cout<<r+1<<" | ";
for (int c=0; c<4; c++)
{
cout<<cards_unflipped[r][c]<<" ";
}
cout<<endl;
}

}

}

//GAME LOOP END -------------------------------------------------------------------------------

cout << "You Won!" << endl;

return 0;
}``````

## All 12 Replies

It might have something to do with `while (nullexists = true)` . Do you mean `==` ?

Ahh that must be it thanks!

Heres another thing.
You are making the variable bool nullexists up at the top and then when you are doing anything with it you remake a new bool variable with the same name.

Line numbers are based off first post.

Line 26: `bool nullexists = true;` This is fine.

Line 78: `while(nullexists = true)` change to -> `while(nullexists == true)` Line 121: `bool nullexists = false;` change to -> `nullexists = false;` Line 124: `if(bool nullexists = false)` change to -> `if(nullexists == false)` Here is another way of writing "if(a == true)" and "if(a == false)". `if(a)` <- if it is true `if(!a)` <- if it is false
This works for bool variables.

You even have it from the code I provided with "makeNext".

nope still a no go, any other ideas?

I'm not saying that will fix it I'm just saying thats a problem with your code. I don't really like trying to fix up code that is poorly formatted but I'll give this a try since I helped you with part of it already.

thanks sfuo, i apparently need to brush up on my boolean

I got it to break the loop and quit the program but if you pick a card that has already got picked it will flip it back to 0.

The two things that I wanna ask you are:
1- Are you allowed to use functions?
2- Can I rewrite this for you and add comments showing you how to have a better structure?

ya sry that was the only problem, i missed your post before sry bout that

sufo, that would be great, yes we are allowed functions. I do have to turn it in shortly but im going to turn in my own work. It would be nice to see what i should be doing differently.

Yeah submit what you have because it works I will just post pretty much the same thing but with using functions and I'll clean up some parts.

6 hours later I'm back!
Sorry, I got side tracked but anyways I managed to finished a version using functions (I could have made it using a class but I decided not to).
This is half as many lines as the other version you have.

``````#include <iostream>

using namespace std;

struct CARD
{
bool isFlipped;
int value;
};

void makeCardSet(CARD cards[4][4])
{
bool makeNext = false;
srand(time(NULL));

for( int i = 0; i < 4; i++ )
for( int c = 0; c < 4; c++ )
cards[i][c].value = 0;

for( int i = 1; i < 9; i++ )
{
makeNext = false;
while(!makeNext)
{
int x1, y1, x2, y2;
x1 = rand()%4;
y1 = rand()%4;
x2 = rand()%4;
y2 = rand()%4;
if( (x1 != x2 || y1 != y2) && (cards[x1][y1].value == 0 && cards[x2][y2].value == 0) )
{
cards[x1][y1].value = i;
cards[x1][y1].isFlipped = false;
cards[x2][y2].value = i;
cards[x2][y2].isFlipped = false;
makeNext = true;
}
}
}
}

void display(CARD cards[4][4])
{
cout << endl << "  1 2 3 4" << endl;
for( int i = 0; i < 4; i++ )
{
cout << i+1 << " ";
for( int c = 0; c < 4; c++ )
if( cards[i][c].isFlipped == true )
cout << cards[i][c].value << " ";
else
cout << "0 ";
cout << endl;
}
cout << endl;
}

int main()
{
bool done = false, valid;
int row[2], col[2], pairs = 0;
char divider;
CARD cards[4][4];

makeCardSet(cards);

while(!done)
{
display(cards);
for( int i = 0; i < 2; i++ )
{
cout << "Input row and column you would like to flip (ex 2,1):" << endl;
do
{
valid = false;
cin >> row[i] >> divider >> col[i];
if( row[i] <= 0 || row[i] > 4 || col[i] <= 0 || col[i] > 4 )
cout << "Input numbers within the grid!" << endl;
else if( cards[row[i]-1][col[i]-1].isFlipped )
cout << "That card is already flipped!" << endl;
else if( i == 1 && row[1] == row[0]+1 && col[1] == col[0]+1 )
cout << "You just picked that card!" << endl;
else
valid = true;
}while(!valid);

row[i]--;
col[i]--;

if( i == 0 )
cout << "You flipped a " << cards[row[i]][col[i]].value << "!" << endl;

}
cards[row[0]][col[0]].isFlipped = true;
cards[row[1]][col[1]].isFlipped = true;

display(cards);

if( cards[row[0]][col[0]].value != cards[row[1]][col[1]].value )
{
cards[row[0]][col[0]].isFlipped = false;
cards[row[1]][col[1]].isFlipped = false;
cout << "Not a match!" << endl;
}
else
{
pairs++;
cout << "You found a pair!" << endl;

if( pairs == 8 )
{
done = true;
cout << "You Won!" << endl;
}
}

system("PAUSE"); //change this to some other thing if you aren't using windows
for( int i = 0; i < 25; i++ )
cout << endl;
}

return 0;
}``````

yes that is a lot cleaner. Thanks for writing this out for me. Im going to look it over in more detail in a bit, right now, study for exam!

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, learning, and sharing knowledge.