campo minado

1. campo minado

leonardo flores bernardo
leoflores

(usa Linux Mint)

Enviado em 03/06/2015 - 10:45h

FIZ E TA DANDO UM ERRO E NAO TO CONSEGUINDO RESOLVER, ALGUEM AJUDA PF


#include <time.h>
#include <string.h>
#include <stdlib.h>
#include<stdint.h>
#include<stdio.h>
#define MAX 1000

typedef struct campominado{
int Matriz[15][15];
int MatrizB[15][15];
char recorde[10];
double tempo;
int bombas;
}
Minas;
Minas campo[MAX];
int Menu2(){
int escolha=0;
do{
fflush(stdin);
scanf("%d",&escolha);
if(escolha<1 || escolha>3)
printf("Opcao Invalida entre com outra.\n");

}
while(escolha<1 || escolha>3);
return escolha;
}
int main(){
int opcao;
do{
fflush(stdin);
scanf("%d",&opcao);
if(opcao<1 || opcao>2)
printf("Opcao Invalida entre com outra.\n");
}while(opcao>1 || opcao<4);
return opcao;
}

int menu1() {
int opcao=0;
printf(" _______________________________________\n");
printf("|\t\t\t\t\t|\n");
printf("|\tBem vindo ao campo minado !!\t|\n");
printf("|\tO que deseja fazer \t\t|\n");
printf("|\t1-Jogar 2-Sair 3-Recorde\t|\n");
printf("|_______________________________________|\n\n");
opcao=Menu2();
return opcao;
}
char intChar(int i) {
switch (i) {
case 0: return '0';
case 1: return '1';
case 2: return '2';
case 3: return '3';
case 4: return '4';
case 5: return '5';
case 6: return '6';
case 7: return '7';
case 8: return '8';
}
}

void Imprime(int cont){
int i,j,lin,col;
printf("\t 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n");
for(i=1;i<=15;i++){
printf("%d",i);
printf("\t");
for( j=1;j<=15;j++)
printf("[%c]",campo[cont].Matriz[i][j]);
printf("\n");
}
printf("\n[#]vazio\t[3]Bombas ao redor\t[-]Nao visitado\n[BB]BOMBA\t99-Sair\n\n");
}

void verificaVizinhanca(int i){
int qntbombas,lin,col;

for(lin=1;lin<11;lin++){
for(col=1;col<11;col++){
qntbombas=0;

if(campo[i].MatrizB[lin][col+1]==9)
qntbombas++;
if(campo[i].MatrizB[lin][col-1]==9)
qntbombas++;
if(campo[i].MatrizB[lin+1][col]==9)
qntbombas++;
if(campo[i].MatrizB[lin-1][col]==9)
qntbombas++;
if(campo[i].MatrizB[lin-1][col+1]==9)
qntbombas++;
if(campo[i].MatrizB[lin-1][col-1]==9)
qntbombas++;
if(campo[i].MatrizB[lin+1][col+1]==9)
qntbombas++;
if(campo[i].MatrizB[lin+1][col-1]==9)
qntbombas++;

if(campo[i].MatrizB[lin][col]!=9)
campo[i].MatrizB[lin][col]=qntbombas;
}

}
}

int verificaCasas(int i, int n, int livres,int c){
if((campo[c].MatrizB[i][n]>0)||(campo[c].MatrizB[i][n]==-1)||(campo[c].MatrizB[i][n]==9)){
return livres;
}else{
livres++;
campo[c].Matriz[i][n]=' ';
campo[c].MatrizB[i][n]=-1;
livres = verificaCasas(i+1,n,livres,c);
livres = verificaCasas(i-1,n,livres,c);
livres = verificaCasas(i,n+1,livres,c);
livres = verificaCasas(i,n-1,livres,c);
return livres;
}
}
void Sorteio(int c){
int lin,col,arm,qnt=0;
srand(time(NULL));
do{
do{

lin=rand()%9+1;
col=rand()%9+1;

if(campo[c].MatrizB[lin][col]==9){
arm=-1;
}else{
campo[c].MatrizB[lin][col]=9;
arm=0;
}
}while(arm==-1);
qnt++;
}while(qnt<campo[c].bombas);
}

void inicializa(int cont){
int i,j;

for(i=0;i<15;i++)
for(j=0;j<15;j++)
campo[cont].MatrizB[i][j]=-1;


for( i=0;i<15;i++)
for( j=0;j<15;j++)
campo[cont].Matriz[i][j]='-';


for(i=1;i<15;i++)
for(j=1;j<15;j++)
campo[cont].MatrizB[i][j]=0;
}

void LER(FILE *f,int cont){
int i;
for(i=0;i<cont;i++){
fread(&campo[i], sizeof(LER),1,f);
}
}

void SalvaRecorde(int cont){

do{
fflush(stdin);
printf("\nEntre com o Nome do Jogador!!\n");
gets (campo[cont].recorde);
}while(campo[cont].recorde[0]=='\0');
}

void Salva(FILE *f,int cont){
int i;

printf("\nSalvando informacoes...\n");
fflush(f);
rewind(f);
fwrite(&cont,sizeof(int),1,f);
for(i=0;i<cont;i++){
fwrite(&campo[i],sizeof(LER),1,f);
}
fflush(f);
fclose(f);
printf("Informacoes salvas com sucesso.\n");
system("pause");
}
void ImprimeRecorde(int cont){
int i;

for(i=0;i<cont;i++){
if(campo[i].recorde[0]!='\0'){
printf("nome: %s\n",campo[i].recorde);
printf("tempo: %f segundos\n",campo[i].tempo);
printf("bombas: %d\n",campo[i].bombas);
}
}
}

void ImprimeBombas(int cont){
int lin,col;
for(lin=1;lin<=10;lin++){
for(col=1;col<=10;col++){
if(campo[cont].MatrizB[lin][col]==9){
campo[cont].Matriz[lin][col]='#';
}
}
}
Imprime(cont);
system("pause");
}

int cor (int argc, char *argv[]){
int cont=0, opcao, lin, col, qnt=0, escolha, resto, total;
char cell;
system("color 0f");
FILE *f;

if((f=fopen("CampoMinado.dat","r+b"))==NULL){
printf("\nComo nao existe um arquivo de dados o programa ira criar um\n");
if((f=fopen("CampoMinado.dat","w+b"))==NULL){
printf("\nErro na leitura do arquivo.\n");
exit(1);
}
else
printf("\nArquivo criado com sucesso.\n");
}

else
printf("\nArquivo aberto com sucesso.\n");
system("pause");
system("cls");
rewind(f);

fread(&cont,sizeof(int),1,f);
LER(f,cont);

opcao=menu1();
printf("opcao: %d\n",opcao);
if(opcao==3)
ImprimeRecorde(cont);


while((opcao!=2 && opcao!=3)&& cont<MAX){


inicializa(cont);


clock_t start_time, end_time;

printf("\n\nEscolha a Dificuldade do jogo!!\n\n[1]Facil\t\t[2]Medio\t\t[3]Dificil\n\n");

escolha = Menu2();
system("cls");

start_time = clock();


if(escolha==1)
campo[cont].bombas=10;
else if(escolha==2)
campo[cont].bombas=30;
else
campo[cont].bombas=50;

printf("\t\t BOA SORTE!!\n");
Sorteio(cont);
verificaVizinhanca(cont);
Imprime(cont);
do{
total=100-campo[cont].bombas;
system("color 0f");
do{
do{

fflush(stdin);
printf("Escolha uma linha\n");
scanf("%d",&lin);
}while((lin<1 || lin>10) && lin!=99);
if(lin==99)
break;
do{
fflush(stdin);
printf("Escolha uma coluna\n");
scanf("%d",&col);
}while((col<1 || col>10)&& col!=99);
if(col==99)
break;
escolha = campo[cont].MatrizB[lin][col];

if(campo[cont].Matriz[lin][col]!='-'){
system("cls");
Imprime(cont);
printf("\n\nCampo ja visitado entre com outro!!\n\n");
}
}while(campo[cont].Matriz[lin][col]!='-');

if(lin==99 || col==99)
break;
if(escolha==9){
campo[cont].Matriz[lin][col] ='#';
system("cls");
system("color 2A");
system("color 3C");
system("color 4D");
system("color 1E");
system("color 4B");
Imprime(cont);

printf("\nVOCE PERDEU!!! \n\n\a\a");
system("pause");
system("cls");
ImprimeBombas(cont);
break;
}else if(escolha!=0){

cell= intChar(campo[cont].MatrizB[lin][col]);

campo[cont].Matriz[lin][col] = cell;
system("cls");
Imprime(cont);
qnt++;
}else{

escolha=verificaCasas(lin, col,0,cont);
system("cls");
Imprime(cont);
qnt+=escolha;
}
resto=(100-qnt)-campo[cont].bombas;
printf("\nJogadas restantes: %d\n",resto);
}while(resto>0);



if(lin==99 || col==99)
break;

campo[cont].tempo = (end_time=clock()/600)-start_time/600;
qnt=0;


if(resto==0){
printf("\n\nPARABENS VOCE GANHOU!!\n\n");
system("pause");
system("cls");
ImprimeBombas(cont);
}
printf("Tempo total gasto %.2f segundos\n",campo[cont].tempo);
printf("deseja continuar com o jogo 1- Sim 2-nao\n");
opcao=escolha;

printf("\nDeseja listar Os Records!! \n[1]Sim [2]Nao\n");
escolha=escolha;
system("cls");
printf("%d\n",escolha);
system("cls");
if(escolha==1){
ImprimeRecorde(cont);
}
if(resto==0)
SalvaRecorde(cont);

system("pause");
system("cls");
if(resto==0);
cont++;
}

Salva(f,cont);
return EXIT_SUCCESS;
}


  


2. Re: campo minado

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 03/06/2015 - 11:33h

Está com vários erros!!

Diga apenas sua dúvida.

Por gentileza, poderia remover os comandos do windows (system pause, cls, etc)?

[]'s

T+

--

Programador encontrado morto na banheira cinco dias após ter sido dado como desaparecido. Junto a ele foi encontrado um shampoo com as seguintes instruções:

LAVAR;
ENXAGUAR;
REPETIR;




3. Re: campo minado

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/06/2015 - 10:53h

Como disse o Thiago, há vários erros. Abaixo eu listo alguns deles. Note que não procurei erros na lógica do programa -- o que vai abaixo são apenas observações sobre a forma geral do programa e algumas construções que você usa.


Começa-se pelo fato de sua main() não faz nada de útil. Parece que o programa principal está dentro de cor(), só que ela não é chamada a partir de main(), então não é ativada nunca (a não ser que você faça alguma manipulação na hora de compilar e linkar o código, que acredito não ser o caso).

Parece que você usou o tipo clock_t e a função clock() para medir tempo decorrido. Se for isso mesmo, então esse uso está errado, pois clock() mede apenas o tempo de CPU dedicado para o seu programa. Isso significa que se o programa passa cinco minutos esperando o usuário digitar informações mas computa tudo o que tinha de fazer em apenas 0,01 segundo, o tempo medido usando clock() será (ou deveria ser) 0,01s, e não 300,01s. Além disso, aquela divisão que você faz por 600 também está errada, pois você não sabe sabe (ou não deveria tentar saber) quantas batidas de clock_t existem num segundo. O certo seria usar o símbolo CLOCKS_PER_TICK como divisor.

Para medir tempo decorrido, você deveria usar o tipo time_t e as funções time() e difftime(). Se precisar de mais precisão do que time() lhe dá, terá de recorrer a funções especializadas do seu sistema operacional.

Alguns sistemas reclamam quando você ignora os valores de retorno de scanf(), fread() e system() (o Ubuntu, por exemplo). É bom você se acostumar a testá-los.

A rigor, você deveria testar também o resultado de funções de escrita -- incluindo os resultados de fflush() e fclose() --, principalmente quando estivesse escrevendo em arquivos. É muito ruim pensar que se tem um dado em disco e descobrir depois que ele não está lá.

Por falar em system(), é melhor você se acostumar a usá-la somente quando for estritamente necessário, e somente se estiver ciente de todos os riscos, incluindo o risco de parar de funcionar de uma hora para outra. Não me parece que o seu programa se enquadre no caso de estrita necessidade -- aliás, parece que é justamente o oposto: que você só a usa por um capricho duvidoso em alguns casos (quando chama os comandos CLS e COLOR), e por “preguiça” em outros (pois é muito fácil fazer um equivalente a PAUSE que funcione em qualquer máquina, sem chamar qualquer comando externo). Se quiser alguns detalhes do porquê de abusar de system() ser ruim, veja, por exemplo, a terceira mensagem do tópico http://www.vivaolinux.com.br/topico/C-C++/Duvida-com-realloc-em-C daqui deste fórum, e a 10ª do tópico http://www.vivaolinux.com.br/topico/C-C++/Preciso-fazer-um-programa-em-C-para-cadastra-alunos-consul....

Na função inicializa(), você tem três loops para inicializar apenas duas variáveis, pois você inicializa a mesma variável duas vezes, e com valores diferentes. Você poderia ter um loop só, inicializando as duas dentro desse loop. Veja o exemplo seguinte.

for(lin=0; lin<MAX_LIN; lin++)
for(col=0; col<MAX_COL; col++){
var1[lin][col]=lin+col;
var2[lin][col]=lin*col;
var3[lin][col]=MAX_COL*lin+col;
diff=lin-col;
var4[lin][col]=(abs(diff)<=1? lin+diff/2: 0);
}


Usar fflush(stdin) é uma forma duvidosa de garantir que a entrada está num estado estável para a a próxima operação de leitura, mesmo quando se usa Windows. Já foi fartamente discutido aqui no VoL, e Internet afora, os porquês disso e as alternativas adequadas, então eu não vou me repetir.

Os usos que você faz de fflush() na hora de escrever o arquivo não estão errados, mas são desnecessários.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts