Jogo do Galo em C – Versão 1.02
Continuo a tentar evoluir os meus conhecimentos em C tentado criar o “meu” Jogo do Galo. No post anterior, Jogo do Galo em C – Versão 1.01 o visitante Ricardo referiu que eu deveria implementar uma função para efectuar a leitura das coordenadas para evitar ter de repetir sempre esse pedaço de código.
Confesso que ainda tenho algumas dificuldades a implementar funções, nomeadamente na definição dos argumentos e dos parâmetros, e como tal para conseguir implementar este exemplo tive de recorrer a variáveis globais, coisa que não se deve usar.
No seguimento da evolução do projecto surgiu um outro problema que foi ao apresentar a jogada, as coordenadas anteriores e a consequente jogada desaparecem do tabuleiro, e não sei como poderei contornar esta situação.
Aqui fica o código:
/************************************************ Nome: Nuno Santos Data: 02-04-2012 Projecto: Jogo do Galo_1.03 ************************************************/ #include <stdio.h> #include <stdlib.h> #define DIM 3 int x, y; int n_jogadas; void posicoes() { // Acção Jogador - Coordenadas printf("\nDigite as coordenadas do X: "); scanf("%d", &x); fflush(stdin); printf("\nDigite as coordenadas do Y: "); scanf("%d", &y); fflush(stdin); x--; y--; } int main() { char Galo [DIM][DIM] = {{' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '}}; int i, j, n; // Inicia a Matriz while(n_jogadas < DIM*DIM) { for(i = 0; i < 3; i++) { for(j = 0; j < 3; j++) { Galo[i][j] = ' '; } } posicoes(x, y); if(Galo[x][y] != ' ') { printf("\nPosicao invalida, tente novamente.\n"); } else { Galo[x][y] = 'X'; } // Apresenta a Matriz printf("\n"); for(n = 0; n < 3; n++) { printf(" %c | %c | %c ", Galo[n][0], Galo[n][1], Galo[n][2]); if(n != 2) { printf("\n---|---|---\n"); } } n_jogadas++; printf("\n"); } system("PAUSE"); }
Se fosse possível gostaria que me fossem dadas algumas dicas de como resolver estes problemas, no entanto continuarei a pesquisar sobre o assunto.
Share
Abril 2nd, 2012 at 12:41 pm
A função “posicoes()” não deve ser “void”, deve retornar um array com as posições. O corpo do “main()” deve ser reduzido e ser
criada uma função “jogar()”. E a função de leitura deveria ser renomeada para “lerposicao()” ou algo assim. É necessário estudar mais
a passagem de argumentos entre funções. Também não seria má ideia estudar os ponteiros.
E já agora, esse código foi feito em windows? Isso não presta para C. Usa Linux que tem boas ferramentas.
Abril 2nd, 2012 at 12:49 pm
Boa Tarde!
Pois, eu vou dedicar-me mais ao estudo das funções, vectores e apontadores. Sim estou a usar Windows para programar, mas estou decidido a passar para Linux Mint que já tenho instalado, pois começo a gostar da filosofia Linux.
Cumps
Abril 2nd, 2012 at 1:29 pm
Em alternativa, para ultrapassar a dificuldade de devolver dois valores na função posições, podes fazer duas chamadas a uma função que lê uma coordenada de cada vez, e a retorna. Assim em vez de chamar posições, chamarias:
posicaoX = lerCoordenada(‘X’);
posicaoY = lerCoordenada(‘Y’);
a implementação de lerCoordenada seria algo do estilo (aviso: o meu C está algo enferrujado):
int lerCoordenada(char coordenada)
{
int valor;
printf(“\nDigite as coordenadas do %c: “, coordenada);
scanf(“%d”, &valor);
fflush(stdin);
valor–; // para passar a base-0
return valor;
}
Claro está que quando estudares a passagem de parametros por referência e o scope de variáveis, tudo fica mais fácil.
Abril 2nd, 2012 at 4:05 pm
Há muito tempo atrás escrevi um jogo do Galo em C e se bem me lembro tinha uma função para fazer uma jogada pelo computador e outra para o humano(era impossível ganhar contra o computador… e se te distrai-ses perdias), tinha ainda uma função para analisar se o jogo terminava e quem ganhava se termina-se. Com estas 3 funções era so necessário criar um ciclo para as ir rodando, do género:
while(1){
humano();
if (fim_do_jogo()) break;
computador();
if (fim_do_jogo()) break;
}
No fim tornei um pouco mais complexo, podendo haver 2 jogadores humanos e alterando a ordem de quem começava. Mas já não sei desse código, se por acaso encontrar meto aqui.
Abril 2nd, 2012 at 7:34 pm
No caso de mostrar todas as jogadas, o erro está nos 2 ciclos “for”. O corpo de ambos tem de ir até à apresentação da matriz.
Abril 3rd, 2012 at 4:14 am
Viva!
Ponto 1: o 1º ciclo for q usas, a seguir ao while, é o que causa as coordenadas anteriores desaparecerem, pois o q estás a fazer é q sempre q é feita uma jogada ele volta a limpar os valores da matriz, o q não é necessário, visto q tu já inicias a matriz limpa, quando a declaras.
Ponto 2: Definitivamente, usar variáveis globais é algo a evitar, e não precisas usá-las aqui.
Não programo há muito tempo, só aprendi C à cerca de 3 anos, mas algo q aprendi q vai para além do C, é q devemos ganhar logo bons hábitos e programação.
A maneira q prograo é a de usar funções para várias tarefas, por mais simples q a tarefa seja ou por mais pequeno q o código seja. Assim sendo, os meus conselhos passam muito por aí. Isto para explicar um pouco a maneira como programo.
Uma maneira de dares a volta à questão das variáveis globais, sem usar ponteiros, é, criar uma função q vai devolver um int, e onde vais pedir para introduzir apenas um parametro da coordenada, ou seja tens uma função q é chamada 2 vezes para obteres os valores da coordenada onde o utilizador vai jogar.
Crias outra função q vai receber estes dois valores q o utilizador introduzio, e q vai verificar se nessa localização já existe alguma jogada (podes criar outra função para fazer esta verificação), e então depois preenche ou não esse local na matriz consoante a verificação feita.
Se achares pertinente, cria tb uma função em q o seu trabalho é apenas imprimir a matriz, será sempre mais fácil chamar apenas a função q criaste do q reescrever o código todo.
Outra prática q tenho é a de fazer um esboço de funções/acções necessárias em papel. Por exemplo neste caso teria algo do estilo para pedir uma jogado ao utilizador:
- pedir coordenadas
– coordenada x
– coordenada y
- verificar local
– se limpo -> colocar marca
– se não limpo -> pedir novas coordenadas
algo neste estilo. Vai te dar sempre uma ideia das acções q são necessárias e q funções escrever para q essas acções sejam realizadas.
Abril 5th, 2012 at 12:02 am
[...] meus pequenos conhecimentos em C tentado programar o Jogo do Galo. Tal como me foi indicado aqui: Jogo do Galo em C – Versão 1.02 pelos visitantes tentei passar todas as funcionalidades já programadas para funções, [...]