Ir ao conteúdo
  • Cadastre-se
João Augusto Gomes Ribeiro

C++ Problema com o jogo da velha

Recommended Posts

Bom eu estou fazendo um programa do jogo da velha e estou com um problema na hora de fazer o programa declarar se: a posição escolhida já foi escolhida antes ,ou caso a posição seja maior que o numero de casas, e para fazer o programa empatar(que é quando nem o jogador que controla"X" e nem o jogador que controla "O" ganhou).

O código:

#include <iostream>
using namespace std;
void mostrar();
int pos[9],velha[3][3],o,p,r,c,s;
string aux="O";
bool g,preencher=false;
void X_ou_O(){
	if(aux=="O"){
	aux = "X";
	}else{
	if(aux=="X"){
	aux = "O";
	}
	}
}
void terminou_velha(){
	g = false;
	//horizontal
	if(velha[0][0]==velha[0][1]&&velha[0][1]==velha[0][2]){
	g = true;
	}else{
	if(velha[1][0]==velha[1][1]&&velha[1][1]==velha[1][2]){
	g = true;
	}else{
	if(velha[2][0]==velha[2][1]&&velha[2][1]==velha[2][2]){
	g = true;
	}else{
	//vertical
	if(velha[0][0]==velha[1][0]&&velha[1][0]==velha[2][0]){
	g = true;
	}else{
	if(velha[0][1]==velha[1][1]&&velha[1][1]==velha[2][1]){
	g = true;
	}else{
	if(velha[0][2]==velha[1][2]&&velha[1][2]==velha[2][2]){
	g = true;
	}else{
	//diagonal
	if(velha[0][0]==velha[1][1]&&velha[1][1]==velha[2][2]){
    g = true;
    }else{
    if(velha[0][2]==velha[1][1]&&velha[1][1]==velha[2][0]){
	g = true;
    }
	}
	}
	}
	}
	}
	}
	}
}
void jogada_invalida(){
	for(o=0;o<3;o++){
        for(p=0;p<3;p++){
	}
	}
	if(pos[r]>9){
	preencher = true;
	}
}
int main(){
	for(o=0;o<3;o++){
		for(p=0;p<3;p++){
		c = c + 1;
		velha[o][p] = c;
		}
		}
	mostrar();
	for(r=0;r<9;r++){
	X_ou_O();
	jogada_invalida();
	if(preencher==true){
	cout << " JOGADA INVALIDA " << endl;
	cout << " +----+-----+----+" << endl;
	cout << " Digite uma posicao para colocar {" << aux << "} de novo" << endl;
	cin >> pos[r];
	system("cls");
	}else{
	if(g==false){
	cout << "voce vai colocar {" << aux << "} " << "em que posicao" << endl;
	cin >> pos[r];
	system("cls");
	}else{
	if(g==true){
	cout << " JOGO ENCERRADO!!!!!!	" << endl;
	system("pause");
	return 0;
	}
	}
	}
	cout << " +----+-----+----+" << endl;
	for(o=0;o<3;o++){
        for(p=0;p<3;p++){
            if(pos[r] != velha[o][p]){
                if(velha[o][p] > 9)cout << " [ " << char (velha[o][p]) << "] ";
                else cout << " [ " <<(velha[o][p]) << "] ";
            }else{
            velha[o][p] = (int)aux[0];
            cout << " [ " << char ( velha[o][p] ) << "] ";
			}
	}
	cout << endl;
		cout << " +----+-----+----+" << endl;
	}
	terminou_velha();
	}
		system ("pause");
	return 0;
}

void mostrar(){
	cout << " +----+-----+----+" << endl;
	for(o=0;o<3;o++){
		for(p=0;p<3;p++){
			cout << " [ " << velha[o][p] << "] " ;
		}
	cout << endl;
	cout << " +----+-----+----+" << endl;
	}
	}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá. Vamos por partes.

Tem alguns erros no seu código q precisam ser resolvidos p que seu código funcione.

Logo no início do código você cria a variável aux com tipo string. Em C++ não se compara strings com o ==. Para isso tem a função compare. Então ficaria assim suas comparações no início do código:

 

void X_ou_O()
{
	if(!aux.compare("O"))
	{
		aux = "X";
	}
	else
	{
		if(!aux.compare("X"))
		{
			aux = "O";
		}
	}
}

Mas isso é só uma parte do seu código que teria que ajustar. No código tem várias partes onde se encontram erros.

Mas, por enquanto, vou só passar a questão de como comparar strings em C++. Nunca compare strings em C++ usando o ==. Use a função compare() como passei acima, ok?

Vou dar uma olhada melhor no seu código para daí poder ajudar mais

Mas já poderia adiantar que quando você solicita o jogada para o usuário você pode usar uma variável do tipo int mesmo, e não um vetor como está fazendo.

Logo q der retorno

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está muito indeciso, pois trata o objeto velha como sendo int[ ], char[ ] ou string[ ]. Tem casting para os três tipos. E alguns até implícitos, ou sei lá o que.

int pos[9],velha[3][3],o,p,r,c,s;
...
void mostrar(){
	cout << " +----+-----+----+" << endl;
	for(o=0;o<3;o++){
		for(p=0;p<3;p++){
			cout << " [ " << velha[o][p] << "] " ;
		}
	cout << endl;
	cout << " +----+-----+----+" << endl;
	}

O fragmento acima por exemplo olha a  loucura que é C++: velha é tipo int(*objeto)[3] e está sendo impresso naturalmente por meio de downcasting implícito. Já abaixo o que vemos

if(velha[o][p] > 9)cout << " [ " << char (velha[o][p]) << "] ";

é o mesmo procedimento, em tese, pois é downcasting só que explícito; Daí advêm a inconsistência. Responda-me por curiosidade qual o motivo quer tanto que velha seja int(*)[3]  e não char(*)[3]?  

 

Já da parte lógica eu não gosto muito, pois existe tantas maneiras de fazer  mesma coisa que perde a graça.

Porém o tema do poste é lógica (99% poster no fórum C\C++ é de lógica) para os problemas citados eu pensei apenas neste:

Em 12/04/2018 às 22:22, João Augusto Gomes Ribeiro disse:

fazer o programa empatar(que é quando nem o jogador que controla"X" e nem o jogador que controla "O" ganhou).

 

Pensei se o jogo vence quem tem 3 símbolos seguidos bastaria somar individualmente linhas e colunas

Exemplo:

x x x      Para esse caso se você percorrer somando a primeira linhas o

x o o      resultado da soma vai ser x+x+x, poder ser o+o+o basta então  

o o x      comparar a soma com duas constante VENCEX e VENCEO se

for diferente das duas essa linha daria empate o resultado e ignorado e

parte para o próximo teste. No exemplo a soma vai ser igual a VENCEX.

Só não lembro agora o valor de x na tabela ANSI mais acho que você entendeu.

 

Ah, realize o teste apenas para as conexões, sou seja, os vizinhos de X

Se X escolher 0-linha, 1-coluna então os V vizinhos são  linha e a coluna a qual X pertence 

V x V 

-  V -

-  V -

Isso vai adicionar, mais complexidade caso você queira isso.

Morrendo de sono já, se a ideia foi ruim... coloco culpa na melatonina 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d pode sim comparar strings com o operador ==, dentro da classe string o operador == possui uma função de sobrecarga no operador == que retorna para a função compare, em outras palavras, não possui diferença usar a função compare ou o operador ==.

 

Isso não se aplica para strings da linguagem C(comparação entre dois char* ou dois const char*).

 

Basicamente seria isso:
 

bool operator==(const char* str)
{
     return (this->compare(str) == 0);
}

 

Fonte:

https://stackoverflow.com/questions/9158894/differences-between-c-string-and-compare

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá. Não vou discordar disso q você me disse sobre comparação de strings em C++, pois já me deparei com uma explicação bem parecida com essa que você deu de sobrecarga no operador  ==. Não estudei sobre isso ainda. Devo admitir que preciso estudar melhor isso.

Creio que me precipitei na resposta q dei sobre comparação de strings em C++ aqui nesse post

Valeu pela referência que passou. Vou dar uma olhada com bastante calma no post do link q você passou. Obrigado!

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×