Jump to content
jk13

Funçoes para jogo

Recommended Posts

jk13

Precisava de ajuda para criar algumas funçoes para um jogo chamado Go

É a primeira vez que estou a programar e comecei com um curso que tem C/C++ e no final do curso temos de entregar um trabalho final que é um jogo funcional, para isso temos que partir jogo do galo (que tem o codigo em baixo) que é dado como modelo, do qual partimos e temos de obter o nosso jogo.

Eu ja fiz varias tentativas, mas ainda nao consegui criar uma função que permita ao utilizador passar, caso queira nao veja movimentos favoraveis na jogada.

Pensei em varias maneira e a melhor ate agora foi a de quando o utilizador utiliza as coordenadas x=10 e y=10 a jogada passa automaticamente para o outro jogador, mas ainda nao consegui fazer uma funçao que funcionasse... :confused:

Por isso se alguem me puder dar uma ajuda e ajudar m a criar uma funçao para isto agradecia :)

#include <stdio.h>  //input-output - necessario para scanf e printf
#include <stdlib.h> //standard lib contém função PAUSE

#define N 3

short int tabul[N][N];  // tabuleiro do Jogo do Galo (3x3) com inteiros 0- vazio, 1-peça jog1, 2-peça jog2

int tipo_jogo(void);
void inicia_tabul(void);
void mostra_tabul(void);
void jogada(int n, int jog, int tipo);
void jogada_Humano(int jog);
void jogada_PC(int jog, int n);
int fim_jogo(int n);
int avalia_tabul(int jog);
void finaliza(int ti, int jog, char venc);
bool movimento_valido(int x, int j, int jog);
void executa_movimento(int x, int y, int jog);

// Função principal (main) do jogo - contém o ciclo central do jogo
int main(void)
{
 int fim, n, jog, tipo;

 printf("Jogo do Galo - MIEEIC Humano vs PC\n");
 tipo = tipo_jogo();
 fim = -1; n = 0; jog = 0;
 inicia_tabul();

 do {
   n++;
   if (jog==1) jog = 2; else jog = 1;   //troca jogador
   printf("Jogada No: %d  Jogador: %d  - Av: %d\n", n, jog, avalia_tabul(jog));
   mostra_tabul();                   // mostra o tabuleiro no ecran
   jogada(n, jog, tipo);            
   fim = fim_jogo(n);  
 } while(fim==-1);  

 finaliza(tipo,jog,fim);

 system("PAUSE");
 return 0;
}

// Inicializa o Tabuleiro colocando-o todo vazio ' '
void inicia_tabul(void)
{
 int i, j;

 for(i=0; i<3; i++)
   for(j=0; j<3; j++)
      tabul[i][j] = 0;                  
}


// Pede ao utlizador que escolha um dos 4 modos de jogo possiveis
// Modos de jogo: 1-Hum/Hum 2-Hum/PC 3-PC/Hum 4-PC/PC
int tipo_jogo(void)
{
   int ti;
   printf("Escolha um modo de jogo: \n");
   printf("1-Hum/Hum 2-Hum/PC 3-PC/Hum 4-PC/PC\n");
   scanf("%d",&ti);
   return ti;
}


// Finaliza o jogo indicando quem venceu ou se foi empate
void finaliza(int ti, int jog, char venc)
{
    if (venc==0) printf("Empate!!!\n");
    else if (venc==1 && ti<3 || venc==2 && (ti==1 || ti==3))
       printf("Humano (Jogador: %d) Venceu!!!\n", jog);
       else printf("A Maquina (Jogador: %d ) Venceu!!!\n", jog);
    mostra_tabul();
}


// Dependendo do modo de jogo e do numero da jogada pede uma jogada ao humano ou calcula uma jogada para o PC
void jogada(int n, int jog, int tipo)
{
    if (n % 2 == 1) {
          if (tipo<=2) jogada_Humano(jog); else jogada_PC(jog,n);
    }
    else {
         if (tipo==1 || tipo==3) jogada_Humano(jog); else jogada_PC(jog,n);
    }
}


// Jogada do Humano - Pede coordenadas e verifica se são validas e se a casa está vazia. Nesse caso coloca lá a peça respectiva
void jogada_Humano(int jog)
{
   int x, y;

   do {
       printf("Entre as coordenadas X e Y da jogada: ");
       scanf("%d%*c%d", &x, &y);
       x--; y--;

       if(!movimento_valido(x,y,jog))
          printf("Jogada Invalida, tente novamente.\n");
   } while (!movimento_valido(x,y,jog));
   executa_movimento(x,y,jog);
}


bool movimento_valido(int x, int y, int jog)
{
    if(x<0 || x>2 || y<0 || y>2 || tabul[x][y]!= 0) return false;
    return true;  
}


bool dentro(int x, int y)
{
   if(x<0 || x>N-1 || y<0 || y>N-1) return false;
   return true;  
}

void executa_movimento(int x, int y, int jog)
{
     tabul[x][y] = jog;    
}

// Movimento do Computador - Joga no meio ou canto (2,2) nas duas primeiras jogadas
// nas restantes procura maximizar a avaliação do tabuleiro (linhas e ameaças
// de linha
void jogada_PC(int jog, int n)
{
 int i, j, bi, bj, av, maxav=-1000;

 if (n==1 || n==2 && movimento_valido(1,1,jog))
  { executa_movimento(1,1,jog); return; }
 if (n==2 && movimento_valido(2,2,jog))
  { executa_movimento(2,2,jog); return; }

 for(i=0; i<3; i++)
    for(j=0; j<3; j++) {
       if (movimento_valido(i,j,jog)) {
          tabul[i][j] = jog; //executa jogada
          av = avalia_tabul(jog);
          if (av>maxav) { maxav = av;  bi = i; bj = j; }
          tabul[i][j] = 0;   //desfaz jogada
       }
    }
 executa_movimento(bi,bj,jog);
 return;
}

char conv(short int peca)
{
  if (peca==1) return 'X';    
  else if (peca==2) return 'O';    
  else return ' ';    
}

// Mostrar o Tabuleiro no Ecran com aspecto semelhante ao tabuleiro original do jogo do galo. Melhorar...

void mostra_tabul(void)
{
    printf("   1   2   3 ");
    printf("\n |---|---|---|\n");
    for(int i=0; i<3; i++) {
        printf("%c",i+65);    
        for(int j=0; j<3; j++)
             printf("| %c ", conv(tabul[i][j]));
        printf("|%c\n |---|---|---|\n",i+65);
    }
    printf("\n\n");
}

// Verificar se o jogo terminou retornando o simbolo do jogador que
// ganhou, 'E' em caso de empate ou ' ' em caso de nao ter acabado
int fim_jogo(int n)
{
 int i;

 for(i=0; i<3; i++) // testar as linhas
   if(tabul[i][0]==tabul[i][1] && tabul[i][0]==tabul[i][2] && tabul[i][0]!=0)
      return tabul[i][0];

 for(i=0; i<3; i++) // testar as colunas
   if(tabul[0][i]==tabul[1][i] && tabul[0][i]==tabul[2][i] && tabul[0][i]!=0)
      return tabul[0][i];

 // testar as diagonais
 if(tabul[0][0]==tabul[1][1] && tabul[1][1]==tabul[2][2] && tabul[0][0]!=0)
    return tabul[0][0];
 if(tabul[0][2]==tabul[1][1] && tabul[1][1]==tabul[2][0] && tabul[0][2]!=0)
    return tabul[0][2];

 if (n==9) return 0; //Acabou com empate

 return -1; //Ainda não acabou
}


// calcula as ameaças de linha (2 peças em linha) para um dado jogador
int avalia(int jog)
{
   int i;
   int av = 0;

   if (fim_jogo(0) == jog) av+=100;

   for (i=0; i<3; i++) {
      if(tabul[i][0]==jog && tabul[i][1]==jog && tabul[i][2]==0) av++;
      if(tabul[i][0]==jog && tabul[i][2]==jog && tabul[i][1]==0) av++;
      if(tabul[i][1]==jog && tabul[i][2]==jog && tabul[i][0]==0) av++;
   }
   for (i=0; i<3; i++) {
      if(tabul[0][i]==jog && tabul[1][i]==jog && tabul[2][i]==0) av++;
      if(tabul[0][i]==jog && tabul[2][i]==jog && tabul[1][i]==0) av++;
      if(tabul[1][i]==jog && tabul[2][i]==jog && tabul[0][i]==0) av++;
   }
   if(tabul[0][0]==jog && tabul[1][1]==jog && tabul[2][2]==0) av++;
   if(tabul[0][0]==jog && tabul[2][2]==jog && tabul[1][1]==0) av++;
   if(tabul[1][1]==jog && tabul[2][2]==jog && tabul[0][0]==0) av++;
   if(tabul[0][2]==jog && tabul[1][1]==jog && tabul[2][0]==0) av++;
   if(tabul[0][2]==jog && tabul[2][0]==jog && tabul[1][1]==0) av++;
   if(tabul[1][1]==jog && tabul[2][0]==jog && tabul[0][2]==0) av++;
   return av;    
}

// Avalia o tabuleiro dando um valor 0 se estiver equilibrado, positivo
// se o jogador 1 tiver mais ameaças de linha ou negativo caso contrario
int avalia_tabul(int jog)
{
   int a1, a2;
   a1 = avalia(1);
   a2 = avalia(2);
   if (jog==1) return 2*a1-3*a2; else return 2*a2-3*a1;  
}

Edited by thoga31
Tags CODE + GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

antes de mais, esquece o C++, porque o código que apresentaste tem absolutamente zero dessa linguagem.

o que necessitas é de alterar a função que valida os dados de entrada da jogada para aceitar algum tipo de comando que pretendas associar a passar a jogada.

o que tens de momento é a seguinte chamada:

scanf("%d%*c%d", &x, &y);

deverás agora alterar esse tipo de leitura para algo como um fgets+sscanf e determinar que tipo de dados foram inseridos pelo utilizador e agir de acordo


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
jk13

como assim?

tipo sinceramente eu ja dei essas funçoes, mas nao sei trabalhar com elas, achas que é possivel explicares melhor for favor

Share this post


Link to post
Share on other sites
HappyHippyHippo

existem pessoas que explicam melhor do que eu e que tiveram o trabalho de escrever a documentação:

- fgets

- sscanf

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
pwseo
#include <stdlib.h> //standard lib contém função PAUSE

LOL! Não deixes esse comentário no código final (nem a linha onde invocas o comando PAUSE através da função system).

Edited by pwseo

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.