Poucas aulas atrás o professor de programação lançou-nos o desafio de fazer o jogo do galo, eu achei um pouco complicado de fazer.
#include <iomanip>
#include <iostream>
#include <string>
using namespace std;
typedef struct{
char pos[3][3];
}GALO;
void limpar_tabuleiro(GALO *g){
int l,c;
for(l=0;l<3;l++)
for(c=0;c<3;c++)
(*g).pos[l][c]=' ';
}
void mostrar(GALO g){
cout<<"+---+---+---+"<<endl;
cout<<"| "<<g.pos[0][0]<<" | "<<g.pos[0][1]<<" | "<<g.pos[0][2]<<" |"<<endl;
cout<<"+---+---+---+"<<endl;
cout<<"| "<<g.pos[1][0]<<" | "<<g.pos[1][1]<<" | "<<g.pos[1][2]<<" |"<<endl;
cout<<"+---+---+---+"<<endl;
cout<<"| "<<g.pos[2][0]<<" | "<<g.pos[2][1]<<" | "<<g.pos[2][2]<<" |"<<endl;
cout<<"+---+---+---+"<<endl;
}
bool vazio(GALO p){
bool vazio=true;
int l,c;
//verificar se o tabuleiro está vazio
for(l=0;l<3;l++)
for(c=0;c<3;c++)
if(p.pos[l][c]!=' ')
vazio=false;
return vazio;
}
bool vitoriax(GALO p){
//verificar vitória das x
if( (p.pos[0][0]=='x'&&p.pos[0][1]=='x'&&p.pos[0][2]=='x')||
(p.pos[1][0]=='x'&&p.pos[1][1]=='x'&&p.pos[1][2]=='x')||
(p.pos[2][0]=='x'&&p.pos[2][1]=='x'&&p.pos[2][2]=='x')||
(p.pos[0][0]=='x'&&p.pos[1][0]=='x'&&p.pos[2][0]=='x')||
(p.pos[1][0]=='x'&&p.pos[1][1]=='x'&&p.pos[1][2]=='x')||
(p.pos[2][0]=='x'&&p.pos[2][1]=='x'&&p.pos[2][2]=='x')||
(p.pos[0][0]=='x'&&p.pos[1][1]=='x'&&p.pos[2][2]=='x')||
(p.pos[2][0]=='x'&&p.pos[1][1]=='x'&&p.pos[0][2]=='x'))
return true;
else return false;
}
bool vitoriao(GALO p){
//verificar vitória das o
if( (p.pos[0][0]=='o'&&p.pos[0][1]=='o'&&p.pos[0][2]=='o')||
(p.pos[1][0]=='o'&&p.pos[1][1]=='o'&&p.pos[1][2]=='o')||
(p.pos[2][0]=='o'&&p.pos[2][1]=='o'&&p.pos[2][2]=='o')||
(p.pos[0][0]=='o'&&p.pos[1][0]=='o'&&p.pos[2][0]=='o')||
(p.pos[1][0]=='o'&&p.pos[1][1]=='o'&&p.pos[1][2]=='o')||
(p.pos[2][0]=='o'&&p.pos[2][1]=='o'&&p.pos[2][2]=='o')||
(p.pos[0][0]=='o'&&p.pos[1][1]=='o'&&p.pos[2][2]=='o')||
(p.pos[2][0]=='o'&&p.pos[1][1]=='o'&&p.pos[0][2]=='o'))
return true;
else return false;
}
bool empateox(GALO p){
//verificar empate
int l,c;
int ocupados=0;
for(l=0;l<3;l++)
for(c=0;c<3;c++)
if(p.pos[l][c]!=' ')
ocupados++;
if(ocupados==9)
return true;
else return false;
}
char vez(GALO g){
int l,c;
int o=0,x=0;
for(l=0;l<3;l++)
for(c=0;c<3;c++)
switch(g.pos[l][c]){
case 'x':x++;break;
case 'o':o++;break;
}
if(x==o)
return 'e';
else if(x>o)
return 'o';
else
return 'x';
}
void jogar(GALO *p ,int posicao,char caracter){
switch(posicao){
case 1:(*p).pos[0][0]=caracter;break;
case 2:(*p).pos[0][1]=caracter;break;
case 3:(*p).pos[0][2]=caracter;break;
case 4:(*p).pos[1][0]=caracter;break;
case 5:(*p).pos[1][1]=caracter;break;
case 6:(*p).pos[1][2]=caracter;break;
case 7:(*p).pos[2][0]=caracter;break;
case 8:(*p).pos[2][1]=caracter;break;
case 9:(*p).pos[2][2]=caracter;break;
}
}
int main(){
GALO galo;
char vez;
int posicao;
limpar_tabuleiro(&galo);
vez='x';
do{
cout<<"Vai jogar o "<<vez<<"\n";
mostrar(galo);
cout<<"Indique a posição onde pretende jogar: ";cin>>posicao;
jogar(&galo,posicao,vez);
if(vez=='x')
vez='o';
else vez='x';
}while(!vitoriax(galo)&&!vitoriao(galo)&&!empateox(galo));
mostrar(galo);
if(empateox(galo))
cout<<"O jogo terminou com um empate técnico!\n";
else if(vitoriax(galo))
cout<<"Vitória do x\n";
else cout<<"Vitória do o\n";
return 0;
}
As posições que o programa pede vão de 1 a 9 sendo 1, 2 ,3 da 1º linha, 4, 5, 6 2º linha, 7, 8, 9 da 3ºlinha.