Problema con tris

di Anonimizzato23786 il
34 risposte
Buongiorno a tutti,
ho un problema nella realizzazione di un programma in C, il tris: quando l'utente inserisce le coordinate dove piazzare la sua X, il ciclo va in loop e continua a chiedere le coordinate, non segue gli altri passaggi. Qualcuno sa come aiutarmi?
#include<stdio.h>
#include<math.h>
#include<time.h>
int main()
{
	int i, j, win, a, stop;					// xu, yu: coordinate che inserisce l'utente	xpc, ypc: coordinate generate dal pc
	char m[3][3];
	
	srand(time(NULL));
	
	printf("TRIS\nX : utente\nO : computer\n\n");
	
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{
			m[i][j]=' ';
			printf(" %c |", m[i][j]);
		}
		printf("\n------------\n");
	}
	
	system("pause");
	
	win=2;
	while(win==2)
	{
		system("cls");
		
		do
		{
			do														//inserimento utente
			{
				printf("Inserire la coordinata di riga: ");
				scanf("%d", &i);	
			} while((i<0)||(i>2));
			
			do
			{
				printf("Inserire la coordinata di colonna: ");
				scanf("%d", &j);
			} while((j<0)||(j>2));
		} while((m[i][j]!='X')&&(m[i][j]!='O'));				//controllo se le coordinate sono libere
		
		m[i][j]='X';
		
		for(a=0;a<0;a++)						//ripetizione del ciclo una sola volta
		{								
			for(i=0;i<3;i++)									
			{
				for(j=0;j<3;j++)
				{
					if(m[i][j]=='O')							//vittoria pc
					{
						if(m[(i+1)%3][j]=='O')					//controllo da parte del pc se ci sono due O sulla stessa riga ed ha quindi possibilità di vincere
						{
							if(m[(i+2)%3][j]=' ')				//controllo se lo spazio in cui devo inserire la O è libero
							{				
								m[(i+2)%3][j]='O';
								win=0;
							}
						}
						
						else if(m[i][(j+1)%3]=='O')					//controllo da parte del pc se ci sono due O sulla stessa colonna ed ha quindi possibilità di vincere
						{
							if(m[i][(j+1)%3]=' ')				//controllo se lo spazio in cui devo inserire la O è libero
							{				
								m[i][(j+1)%3]='O';
								win=0;
							}
						}
					}
					
					else if((m[i][j]=='O')&&(i=j))					//controllo da parte del pc se ci sono due O sulla stessa diagonale ed ha quindi possibilità di vincere
					{
						if(m[(i+1)%3][(j+1)%3]=='O')
						{
							if(m[(i+1)%3][(j+1)%3]=' ')				//controllo se lo spazio in cui devo inserire la O è libero
							{				
								m[(i+1)%3][(j+1)%3]='O';
								win=0;
							}
						}
					}
					
					else if(m[i][j]=='X')
					{
						if(m[(i+1)%3][j]=='X')					//controllo da parte del pc se ci sono due X sulla stessa riga e deve quindi bloccare l'utente
						{
							if(m[(i+2)%3][j]=' ')
							{
								m[(i+2)%3][j]='O';				//controllo se lo spazio in cui devo inserire la O è libero
							}	
						}
						
						else if(m[i][(j+1)%3]=='X')					//controllo da parte del pc se ci sono due X sulla stessa colonna e deve quindi bloccare l'utente
						{
							if(m[i][(j+2)%3]=' ')
							{
								m[i][(j+2)%3]='O';					//controllo se lo spazio in cui devo inserire la O è libero
							}
						}
					}
					
					else if((m[i][j]=='X')&&(i=j))					//controllo da parte del pc se ci sono due X sulla stessa diagonale e deve quindi bloccare l'utente
					{
						if(m[(i+1)%3][(j+1)%3]=='X')
						{
							if(m[(i+2)%3][(j+2)%3]='O')
							{
								m[(i+2)%3][(j+2)%3]='O';			//controllo se lo spazio in cui devo inserire la O è libero
							}
						}
					}
				}
			}
			
			if(stop)												//se pc non deve impedire vittoria o vincere muove a caso controllando che non ci siano già O o X
			{
				do
				{
					i=rand()%3;
					j=rand()%3;
				} while((m[i][j]!='X')&&(m[i][j]!='O'));
				
				m[i][j]='O';
			}
		}
	
		for(i=0;i<3;i++)											//stampa della matrice
		{
			for(j=0;j<3;j++)
			{
				printf(" %c |", m[i][j]);
			}
			printf("\n------------\n");
		}
		
		if(win==0)
		{
			printf("\n\nChe peccato! PC ha vinto!");
		}
		else if(win==1)
		{
			printf("\n\nComplimenti! Hai vinto!");
		}
	}
	
	printf("\n\n\n\n");
	system("pause");
	return 0;
}

Non ci sono funzioni esterne al main perchè non ancora fatte, ogni altro suggerimento è ben accetto.
Grazie a tutti in anticipo

34 Risposte

  • Cosa inserisci da tastiera?
  • Inserisco le coordinate dove mettere la X, l'inserimento dell'utente (tra 0 e 2)
  • Deve essere

    } while (m[j] != ' '); //controllo se le coordinate sono libere
  • Quale sarebbe il problema? Ho provato a toglierlo ma non cambia nulla
    Il problema è che mi fa inserire le coordinate (riga/colonna) all'infinito
  • Hai letto il mio post precedente? Che c'è scritto?
  • oregon ha scritto:


    Deve essere

    } while (m[j] != ' '); //controllo se le coordinate sono libere


    Questo? sì certo
  • E cosa non ti è chiaro? Cosa hai fatto? Hai cambiato la linea del tuo codice con quella proposta?
  • oregon ha scritto:


    E cosa non ti è chiaro? Cosa hai fatto? Hai cambiato la linea del tuo codice con quella proposta?
    bhe non ho molto capito il senso...dovrei fare un controllo, se non c'è niente eseguo il codice dentro (cioè scrivo la O) altrimenti passo via senza fare nulla... Il while in teoria non dovrebbe servire
    Questo per quanto ne so io, se sbaglio correggimi che imparo
  • Trovato un errore piuttosto sciocco... deve essere "==" non =
  • Continua a non funzionare anche con il while
  • No niente ... tra apici c'è uno spazio

    ' '

    Quindi metti

    } while (m[j] != ' ');

    nel tuo while ed elimina la

    system("CLS");

    almeno temporaneamente per vedere il risultato.
  • oregon ha scritto:


    No niente ... tra apici c'è uno spazio

    ' '

    Quindi metti

    } while (m[j] != ' ');

    nel tuo while ed elimina la

    system("CLS");

    almeno temporaneamente per vedere il risultato.



    Ok quindi via la system cls
    Lo spazio è voluto perché la matrice è riempita di spazi, quindi se non ci sono X e O c'è uno spazio e posso sovrascriverlo
  • Ho capito che lo spazio è voluto e proprio per questo ti ho suggerito di cambiare le condizioni che avevi scritto nella while (che erano sbagliate) con quelle che ti propongo io (corrette). E' la terza volta che te lo dico.
  • oregon ha scritto:


    Ho capito che lo spazio è voluto e proprio per questo ti ho suggerito di cambiare le condizioni che avevi scritto nella while (che erano sbagliate) con quelle che ti propongo io (corrette). E' la terza volta che te lo dico.

    Ok scusami, non avevo ben capito
    Questo pomeriggio sistemo e ti aggiorno
    Grazie
Devi accedere o registrarti per scrivere nel forum
34 risposte