• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Dkid

[Ajuda] Batalha Naval - C

10 mensagens neste tópico

Boas,

Tenho um projecto em mãos (batalha naval), na minha nova linguagem (a linguagem C).

os meus objectivos:

- Fazer uma tabela 10*10;

- implementar aleatoriamente 10 barcos na tabela;

- iniciar um contador (dependendo do nivel de dificuldade... 3mins, 2mins 1 min);

- iniciar um registrador (onde irá captar todas as coordenadas que o utilizador usou, e mandar para um .txt);

- Permitir ao utilizador escolher as coordenadas (linha , coluna);

- Se o tempo terminar antes do utilizador acertar em todos os barcos, utilizador perde, senão, o utilizador ganha.

- Zero = agua

- Outro numero = utilizador acertou no navio

os meus problemas:

1º - Como deram a matéria à pressão ainda ando a tentar entender como funciona a linguagem C (vim de pascal.. é um pouco diferente);

2º - Elaborei a tabela, e mandei um printf com zeros para ver se estava certo;

3º - defini o tamanho dos barcos (#define barco 5);

4º - Deparei-me com um problema em que não sei como por o sistema aleatório(sei que tenho de usar o random), mas ainda não estou a entender como o vou por a funcionar depois (onde, no código)

Penso que são todos os problemas com que me deparei ate agora, pois é a primeira vez que estou a fazer um programa em C, quando as ideias começam a surgir, muitas duvidas surgem na parte de como elaborar em código.

Aguardo a vossa ajuda,

Dkid

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o ramdon nao funciona assim tao bem como se pensa. porque diz sempre as mesmas posicoes tens de alterar a semente vou so ver aos meus apontamentos como e ja te digo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

chama-se rand a funcao e devolfve nº aleatorios mas devolve sempre os mesmos.

para por entre um numero e outro tens de por

entre 0 e RAND_MAX (uma constante)

problema os numeros sao sempre iguais

sulucao:

a funcao rand() parte de uma semente para realizar o calculo dos numeros aleatorios desta formas os numeros sao sempre iguais

para resolver isto vamos utilizar o relogio do pc o relogio passa a ser a semente

como?

resposta:

void inic_random()
{
long ultime;
time(&ultime);
srand((unsigned) ultime);
}

a funcao inic_random() serve para inicializar numeros aleatorios

1º declara-se uma variavel do tipo long int linha 3

em seguida esta variavel e inicializada com o nº de segundos entre 1/1/1979 linha 4

por fim a semente e iniciada recorrendo a funcao srand (seed random) que devera receber um valor tipo unsigned int. como a nossa variavel ultime e do tipo long int a sulucao e faser un casting (promocao desta a unsigned int) linha 5

note: tens de por #include(time.h)

comprimentos fpinto

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quanto às posições dos barcos podias  criar um array de duas dimensões (10x10), fazias dois ciclos for para os preencher com 0s e 1s. Dava mais jeito as dimensões dos barcos serem 1...

Qualquer coisa deste tipo...

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int getRandom(int min,int max)
{
  return(min+rand()%(max-min+1));
}

void iniciarTab(int tab[][10])
{
  int x, y;
  srand(time(NULL)+clock());

  for(y = 0; y < 10; ++y)
    for(x = 0; x < 10; ++x)
       tab[x][y] = getRandom(0,1);
}

void jogar(int tab[][10], int y, int x)
{
  if(tab[y][x] == 1)
  {
     printf("Acertou num barco!\n");
     tab[y][x] = 2;
  }

  else if(tab[y][x] == 0)
     printf("Acertou na água...\n");

  else
     printf("Já acertou nesta posição.\n");
}

int main()
{
  int tab[10][10];
  int x,y;

  iniciarTab(tab);
  printf("\t\t  Batalha Naval 0.1\nCTRL+C para sair.\nNúmeros entre 0 e 9\n\n");
  while(1)
  {
     printf("Ordenada: ");
     scanf("%d", &y);
     printf("Abcissa: ");
     scanf("%d", &x);
     if(((y < 0) || (y > 9)) || ((x < 0) || (x > 9)))
     {
       printf("Dados inválidos\n");
       break;
     }
     jogar(tab, y, x);
  }

  return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ou podes usar vectores com mais k uma dimencao de 10 por 10

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, acabo de ler e testar o código !

Mas ...

Não entendi:

- Quando dizes que tab é = 2 :

void jogar(int tab[][10], int y, int x)
{
  if(tab[y][x] == 1)
  {
     printf("Acertou num barco!\n");
     tab[y][x] = 2;

- Onde declaras-te o numero de barcos em jogo (ou como este é gerado);

E estive a tentar mostrar a tabela (para não ficar em ambiente de texto que fica complicado saber onde já acertamos) ... mas não obtive sucesso.

Amanha vou apresentar as minhas dificuldades, para ver se fico esclarecido de como trabalhar em C.

Agradeço a vossa ajuda, e peço desculpa pelo grande atraso na resposta, mas estou numa semana mesmo difícil e bastantes testes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Dkid pelo que percebi do código em cima, o tab[x][y]=2, é para o caso de ele acertar no barco já nao puder acertar mais.

Para fazeres as posiçoes dos barcos, convém controlares a função random de maneira a que ele te ponha barcos possiveis em posiçoes sucessivas, excepto claro no caso do submarino.

Depois de fazeres o código base, implementa um interface grafico no jogo para o tornar mais interessante, e mais tarde IA. Sabe sempre bem ganhar ao pc no nosso proprio jogo! :P

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Perl obrigado pelo esclarecimento !

O jogo vai ser basicamente em texto, com a regalia que tentarei mostrar a tabela e quando os barcos forem atingidos mudar para o numero do barco (sendo que 0 é agua, e os restantes numeros serao o numero de "casas" que cada barco tem)

Pensei na interface grafico, mas dado os problemas, e a falta de tempo(e sabedoria na parte grafica), isso ficará para segundo plano e talvez consiga faze-lo nas ferias.

Para ja tou a tentar que me mostre a tabela xeia de zeros, pois quero saber onde acertei  ou nao!

assim que conseguir alguma coisa digo, entretanto se quizerem ajudar , toda a ajuda será bem vinda

Agradeço mais uma vez a quem me deu luzes para iniciar e a todos os que estao a ajudar.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Se precisares de ajuda nalguma função especifica avisa. :thumbsup:

Cumps.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora