Ir ao conteúdo

Posts recomendados

Postado

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
Postado

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

Postado

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
Postado

@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
Postado

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!

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...