arrays 3opeenrij

Status
Niet open voor verdere reacties.

bengoet

Gebruiker
Lid geworden
17 okt 2008
Berichten
10
Hey,

Ik probeer een soort 3 op een rij spelletje te maken dmv multiple array.
De bedoeling is dat mijn 'speelveld' er zo uit ziet:

1 2 3
4 5 6
7 8 9

de speler die aan beurt is met dan een een nummer kiezen en daar wordt een 'x' of een 'o' gezet afhankelijk van wie aan de beurt is.

dit is men multiple array:
char matrix[3][3] = {{'1','2','3'},{'4','5','6'},{'7','8','9'}};

dit is een deel van de code waar mijn fout zit:
Code:
for(i=0;i<3;i++)
{
	for(j=0;j<3;j++)
	{	
		if(matrix[i][j]=input)
		{
			matrix[i][j]=teken;
			cout << matrix[i][j]<<' ';
		}
		else 
			cout << matrix[i][j]<<' ';
	}
	cout <<endl;
}

wanneer de input bijvoorbeeld 5 is, is het de bedoeling dat op de plaats van 5 het teken komt van de speler.
wanneer ik debug merk ik echter dat if(matrix[j]=input) nooit TRUE is ( hij gaat altijd naar else) maar bij waarde voor matrix[j] krijg ik ..'5' , ik snap niet wat er hier mis is
 
Om te vergelijken dien je == te gebruiken, dus een dubbel gelijkheidsteken ipv een enkel

[EDIT]
ohja.. als je iets uitvoert wanneer je voorwaarde zowel juist als fout is, kan je dit evengoed buiten de test zetten:
Code:
if (matrix[i][j] == input) {
        matrix[i][j] = teken;
}
cout << matrix[i][j] << ' ';
[/EDIT]
 
Laatst bewerkt:
jah haddek eerst ook maar dan werkte het niet dus wat verschillende dingen geprobeerd.

Heb het nu terug veranderd naar wat jij zegt maar hij doet het nog niet.
Nu heb ik om te verstaan wat ik fout deed gedubegged (of hoe je het ook schrijft :D)

als ik voor input 8 heb ingegeven heeft matrix[j] als value 56 '8', (is die 56 mss de plaats in het geheugen ofzo)

en matrix is wel char en input is int
 
Die 56 is de ASCII-waarde van het cijfer 8.

Ik had ook enkel naar een programmeerfout gekeken, niet naar een logicafout.
Enkele mogelijke dingen om je verder op weg te zetten met betrekking tot invoer.
  • Hou bij of de zet aan x of o is door een boolean. Wanneer deze true is, is x aan zet, anders o. Na elke zet geef je deze boolean zijn tegengestelde waarde:
    Code:
    bool xzet = true;
    if (xzet) {
            //er moet een x geplaatst worden
    } else {
            //er moet een o geplaatst worden
    }
    xzet = !xzet; //het uitroepteken betekent 'NIET', xzet krijgt een tegengestelde waarde
  • Als je dingen vergelijkt, vergelijk dan geen appelen met peren, en dus ook niet zomaar char met int. Maak eerst beide van hetzelfde type en vergelijk dan.
  • Om de plaats te berekenen vanaf het ingegeven cijfer (int), kan je gebruik maken van een integerdeling en modulo(de rest bij deling)
    Code:
    int invoer=7;
    int i = invoer/3; // 2
    int j = invoer%3; // 1
    //de plaats is dan
    matrix[i][j]; //het kan zijn dat de berekening voor i en j moet omgewisseld worden
 
-mijn zet houd ik bij dmv een andere functie, ik zal de hele code hieronder bijplaatsten

-ik weet niet hoe ik één van de twee (matrix[j] of input) van type kan veranderen.
als ik de matrix verander naar int geeft hij nog veel meer fouten
opm: mag ik de type bijvoorbeeld veranderen met static_cast<int>?

-aan de methode van deling en rest had ik ook gedacht maar ik kon het niet zo goed uitwerken, als we vb cijfer 6 pakken dan krijgen we:

int invoer=6;
int i = invoer/3; // 2 = 3de rij
int j = invoer%3; // 0 = 1ste kollom

6 zou dan op plaats 2,0 moeten komen en dit klopt niet aangezien die op 1,2 (2de rij, 3de kollom moet komen
tenzij ik je verkeerd begrijp

dus heb ik naar een andere manier gezocht.


de hele code:

Code:
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cmath>
using namespace std;

void drukmatrix(char matrix[][3])
{
	int i, j;
	cout <<"Tic-Tac-Toe:"<<endl;
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
			cout << matrix[i][j]<<' ';
		cout <<endl;
	}
}

void verwerkinput(int input, char teken, int matrix[][3])
{
	int i, j;
	system("CLS");				//gebruikt om hetgeen in scherm staat weg te vegen
	cout <<"Tic-Tac-Toe:"<<endl;
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{	
			if(matrix[i][j]==input)
			{
				matrix[i][j]=teken;
			}
			cout << matrix[i][j] << ' ';
		}
		cout <<endl;
	}
}

void input(char matrix[][3])
{
	int input,speler,beurt;
	char teken;
	for (beurt=1;beurt<10;beurt++)
	{
		if((beurt%2)==0)
		{
			speler = 2;
			teken = 'X';
		}
		else
		{
			speler = 1;
			teken = 'O';
		}
		cout <<"Speler "<<speler<<" gelieve het nummer in te geven waar u een "<<teken<<" wilt zetten."<<endl;
		do{
			cin >> input;
			if ((input>9) || (input<=0))
				cout <<input<<" is geen geldige keuze, gelieve een getal van 1 tot 9 in te geven."<<endl;
		}while ((input>9) || (input<=0));	
		verwerkinput(input,teken,matrix);
	}
}

	
		

void main()
{
	int matrix[3][3] = {{'1','2','3'},{'4','5','6'},{'7','8','9'}}; 
	drukmatrix(matrix);
	input(matrix);
}

thx voor de replies :D
 
Je kunt de locatie op het board ook via een andere methode verkrijgen, en het is ook nog korter ook:

Code:
#include <cstdlib>
#include <iostream>

const unsigned int N = 9;

void PrintBoard(const char board[])
{
    for(unsigned int i = 1; i <= N; i++)
        std::cout << board[i-1] << (i%3 == 0 ? '\n' : ' ');                
}

void VerwerkInput(const unsigned int input, const char teken, char board[])
{
    if(input > N | input == 0)
        return;  
    
    board[input-1] = teken;
    PrintBoard(board);  
}

int main(int argc, char *argv[])
{
    char board[N] = { 35, 35, 35,
                             35, 35, 35,
                             35, 35, 35 }; // ASCII 35 = # ; gewoon zodat er tenminste iets geprint wordt
    VerwerkInput(3, '*', board);

    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Laatst bewerkt:
het is wel een vaste opdracht dus we moeten eigenlijk het schema met de getallen gebruiken :(

1 2 3
4 5 6
7 8 9

en de gebruiker moet dan een getal selecteren en daar komt dan het teken

ook ben ik nog maar pas bezig met c++ en snap ik niet alle dingen uit jouw code

het zou zoits moeten zijn als mijn code, ik snap alleen niet waarom hij het getal niet vervangt door het teken in mijn schema :(
 
Oke, geen probleem hoor. Ik heb je huidige code even aangepast, als je iets niet begrijpt dan hoor ik het wel. :)

Code:
void drukmatrix(const char matrix[][3]) // met const geef je aan dat deze waarde niet gewijzigd mag worden
{
    cout << "Tic-Tac-Toe:\n";
    
    unsigned int i, j;  // een unsigned int kan geen negatief getal bevatten
    for(i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
            cout << matrix[i][j] << ' ';
            
        cout << '\n';
    }
}
        
void verwerkinput(const unsigned int input, const char teken, char matrix[][3])
{
    system("CLS");
         
    if(input > 9 || input == 0) 
        return;  
    
    unsigned int i = (input-1)/3, j = (input-1) - i * 3;
    matrix[i][j] = teken;
    
    drukmatrix(matrix);    
}   

void input(char matrix[][3])
{
    char teken[2] = { 'X', 'O' };
    unsigned int speler = 0;
    
    for(unsigned int beurt = 0; beurt < 9; beurt++)
    {                
        unsigned int input = 0; 
        while(!(input > 0 && input < 10))
        {  
            cout << "Speler " << speler+1 << "gelieve het nummer in te geven waar u een " 
                 << speler+1  << " wilt zetten.\n";                                
            cin >> input;
        }
        
        verwerkinput(input, teken[speler], matrix);
        speler ^= 1;  // 1 ^ 1 == 0 en 0 ^ 1 == 1
    }            
}

(er wordt wel geen rekening meegehouden of de locatie al bezet is)
 
bedankt voor alle moeite :D de code werkt

het enigste wat ik niet zo goed snap is de
char teken[2] = { 'X', 'O' }; die je gebruikt , ik zie nergens waar je bijvoorbeeld zegt nu moet het een X zijn of nu een O , of neemt die gewoon achter elkaar een element uit de array?

hoe kan ik dit dan aanpassen dat het teken er komt te staan:
Code:
cout << "Speler " << speler+1 << "gelieve het nummer in te geven waar u een " 
<< speler+1 << " wilt zetten.\n";
die laatste speler+1 moet dan iets van teken ofzo zijn, maar als ik er teken schrijf krijg ik iets raar op mijn scherm

En als ik een stukje code wil invoegen om te zien of de locatie al bezet is, dan krijg ik hetzelfde probleem als op het begin :(
Code:
void verwerkinput(const unsigned int input, const char teken, char matrix[][3])
{
	system("CLS");				//gebruikt om hetgeen in scherm staat weg te vegen
 
	if(input > 9 || input == 0) 
        return;  
    
    unsigned int i = (input-1)/3, j = (input-1) - i * 3;
    for (unsigned int k=1;k<10;k++)                          // om één voor één te zien of matrix[i][j] overeenkomt met een getal
		if (matrix[i][j]==k)
		{
			cout << "Hier is al iets ingevuld\n";
			return;
		}

	matrix[i][j]= teken;
    
    drukmatrix(matrix);  
}
 
Laatst bewerkt:
het enigste wat ik niet zo goed snap is de
char teken[2] = { 'X', 'O' }; die je gebruikt , ik zie nergens waar je bijvoorbeeld zegt nu moet het een X zijn of nu een O , of neemt die gewoon achter elkaar een element uit de array?

teken[0] = 'X' en teken[1] = 'O'. Omdat de waarde van de variabele speler steeds wisselt van 0 naar 1, zorgt teken[speler] er dus steeds voor dat de waarde 'X' of 'O' is.


hoe kan ik dit dan aanpassen dat het teken er komt te staan:
Code:
cout << "Speler " << speler+1 << "gelieve het nummer in te geven waar u een " 
<< speler+1 << " wilt zetten.\n";
die laatste speler+1 moet dan iets van teken ofzo zijn, maar als ik er teken schrijf krijg ik iets raar op mijn scherm

Omdat jij in jouw voorbeeld de speler weergeeft als 'speler 1' en 'speler 2', en speler steeds de waarde 0 of 1 heeft, verhoog ik de variabele hier met 1 om het gewenste resultaat te krijgen. Als je het teken van de speler wilt weergeven dan volstaat 'teken[speler]' om deze waarde te krijgen.
 
En als ik een stukje code wil invoegen om te zien of de locatie al bezet is, dan krijg ik hetzelfde probleem als op het begin

Je kunt 'void verwerkinput()' vervangen door 'bool verwerkinput()' en dan false returnen wanneer deze waarde al bezet is.

Code:
bool verwerkinput(const unsigned int input, const char teken, char matrix[][3])
{
    system("CLS");
    unsigned int i = (input-1)/3, j = (input-1) - i * 3;
     
    if(input > 9 || input == 0 || matrix[i][j] == teken) 
        return false;      

    matrix[i][j] = teken;    
    drukmatrix(matrix);    

    return true;
}

Wanneer je de nu functie aanroept levert deze dus een boolean waarde af(true/false) die aangeeft of het verwerken gelukt is.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan