Προς το περιεχόμενο

Ερωτήσεις αρχάριου στη C


Monkey7

Προτεινόμενες αναρτήσεις

Καλησπέρα προσπαθώ να φτιάξω το παιχνίδι ναρκαλιευτή σε C και έχω κάποιες απορίες

άμα έχετε χρόνο και όρεξη απαντήστε μου :-D

Για αρχή στόχος μου με τη χρηση malloc να δημιουργήσω δυσδιάστατο πινακα nxm γεμίζοντας τον με 0 και

έπειτα να εμφανίσω στην οθόνη έναν πίνακα που αποτελέιται απο #.

 

#include <stdio.h>

#include <stdlib.h>

 

int main()

{

int i,j,n,m,o;

int **pa=NULL;

printf("Dwste tis diastaseis tou paixnidiou n x m\n");

scanf("%d%d", &n,&m);

pa=(int**)malloc(n*sizeof(int*));

for(i=0;i<n;i++)

{

pa=(int*)malloc(m*sizeof(int));

for(j=0;j<m;i++)

{

pa[j]=0;

}

}

for(i=0;i<n;i++)

{

for(j=0;j<m;i++)

{

if(pa[j]==0)

{

printf("#");

}

printf("\n");

}

system("PAUSE");

return 0;

}

 

Δεν ξέρω γιατί εμφανιστηκε έτσι κανονικά φένεται πιο ωραία ο κώδικας :mad:

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 40
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Εργασια στα ΤΕΙ;

 

Εμας καποτε μας την ειχαν βαλει στην πασκαλ.

 

Λοιπον,

Γενικες κατευθυνσεις, αν θες τις ακολουθεις.

Κανε το user friendly, βαλε λογακια να εκτυπωθουν στην οθονη

 

 

Φτιαξε functions.

μια που να ελέγχει το κεντρικο μενου. Να εμφανίζει δηλαδή λίστα με επιλογές και να ζητά εισαγωγή πχ

1. Νεο παιχνιδι

2. κατι αλλο

3. εξοδος.

 

μια που να ειναι το ιδιο το παιχνίδι. Μενου που να επιλεγει επομενη κινηση και το ειδος της.

 

μια για την εμφανιση του πινακα που θα βαλεις με τα στοιχεια.Να καλείται κάθε φορά που κάνει κάτι ο χρήστης πριν τις επιλογες. Να εμφανίζει δηλαδη το ταμπλω!

 

Καλά το πας στη σκεψη με τη μαλλοκ αλλα ειναι πολυ αργα για να δω αν το εχεις σωστα :P

μην ξεχασεις να απελευθερωνεις τη μνημη σε καθε game over.

 

καλη τυχη.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ΑΕΙ αλλα δεν εχει σημασία. Υπάρχουν οδηγίες για το πως να λύσω την άσκηση απλως κολλάω

σε κάποια πραγματάκια αύριο πρωι με τον καφέ ρίξε μια ματιά να μου πεις αν έχεις χρόνο B)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καταρχήν σου είχε ξεφύγει ένα άγκιστρο στον κώδικα που ανάρτησες, ύστερα στο δεύτερο εσωτερικό for loop αυξάνεις την μεταβλητή i αντί για την j, τέλος αντί της malloc μπορείς να χρησιμοποιήσεις την calloc που δεσμεύει πίνακες & μηδενίζει κατευθείαν τα περιεχόμενα τους δίχως έξτρα εντολές.

 

Κώδικας:

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

int main()
{
 int i,j,n,m,o;
 int **pa=NULL;
 printf("Dwste tis diastaseis tou paixnidiou n x m\n");
 scanf("%d%d", &n,&m);
 pa=(int**)calloc(n, sizeof(int*));
 for(i=0;i<n;i++)
	 pa[i]=(int*)calloc(m, sizeof(int));
 for(i=0;i<n;i++)
 {
	 for(j=0;j<m;j++)
	 {
		 if(pa[i][j]==0)
		 {
			 printf("#");
		 }
	 }
	 printf("\n");
 }

 /* Free memory! */
 for(i=0;i<n;i++)
	free(pa[i]);
 free(pa);

 system("PAUSE");
 return 0;
}

 

ΕΞΟΔΟΣ:

>
Dwste tis diastaseis tou paixnidiou n x m
10 5
#####
#####
#####
#####
#####
#####
#####
#####
#####
#####
Press any key to continue . . .

 

Καλή συνέχεια!!

 

Υ.Γ.

Δεν ξέρω γιατί εμφανιστηκε έτσι κανονικά φένεται πιο ωραία ο κώδικας

Για να αναρτάς με σωστή μορφή τον κώδικα σου θα πρέπει να επικολληθεί μεταξύ των [ code] και [ /code] tags, δίχως το κενό μεταξύ του [ και του code.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θα πρότεινα τις λειτουργίες που θες να κάνεις, π.χ. αρχικοποίηση του board, να τις κάνουν συναρτήσεις και όχι χύμα. Π.χ.,

 

int** createBoard(int dim1, int dim2);

 

Έτσι, θα μπορούσες να καλείς:

 

printf("Dose diastaseis\n");

scanf("%d%d", &n,&m);

 

int** board = createBoard(n,m);

 

 

Δεν είναι τόσο για το να γίνει σωστά η αρχικοποίηση.... αλλά για να "χτίσεις" πιο "σωστά" τον κώδικά σου. Το σκεπτικό είναι... όχι το τι ακριβώς θα κάνει :)

 

Έτσι θα μπορείς να ελέγχεις καλύτερα τα λάθη σου και να αλλάζεις πιο εύκολα τον κώδικα (πόσο μάλλον δε όταν κάθε τέτοια συνάρτηση θα είναι και σε ένα header - source file "μόνη της").

 

Επίσης, η διαδικασία του προγράμματος θα είναι πιο ευδιάκριτη στην main.

 

Δεν είναι δύσκολη η εργασία... και για αυτό λέει να ασχοληθείς να την κάνεις "τσίλικη".

 

(Π.χ., θα μπορούσες τα μηνύματα προς τον χρήση να τα έχεις σε μία άλλη συνάρτηση την οποία θα καλείς στην αρχή:

 

δήλωση:

 

void diplsayMessagesToUser(void);

 

 

και στο main.c

 

....

 

displayMessagesToUser();

 

....

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πως μπορώ να χρησιμοποιήσω τη rand() ωστε να βάλω σε τυχαίες θέσεις του πίνακα τον αριθμό 10(νάρκες)?

 

Έχεις δίκιο τιμον...λέω να χρησιμοποιήσω πολλές συναρτήσεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Υπάρχει κάποιο πρόβλημα στον τρόπο που χρησιμοποιώ τη rand() δε βγάζει error αλλά κολλάει..?

(δώστε σημασία μονο στη rand έτσι όπως το έχω τώρα απλόσ εμφανίζει τα πάντα)

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

void tamplo(int n, int m, int **pa);
void narkes(int n, int m, int **pa);

int main(int argc, char *argv[])
{
  int i,j,n,m,o,p,a,b,r1,r2,q,w;
  int **pa=NULL;
  printf("Dwste tis diastaseis tou paixnidiou n x m\n");
  printf("Prosoxh, to tamplo mporei na exei megethos to poly 24x30\n");
  scanf("%d%d", &n,&m);
  printf("Epilxte to epipedo duskolias tou paixnidiou\n");
  printf("Pathste 1 gia eukolo, 2 gia metro, 3 gia duskolo kai 4 gia akatorthoto\n");
  scanf("%d", &o);
  if(o==1)
  {
     p=m*n/8;
  }
  if(o==2)
  {
     p=m*n/7;
  }
  if(o==3)
  {
     p=m*n/6;
  }
  if(o==4)
  {
     p=m*n/5;
  }    
  pa=(int**)calloc(n, sizeof(int*)); //desmeush mnhmhs gia dimiourgia 2d pinaka
  for(i=0;i<n;i++)
  {
        pa[i]=(int*)calloc(m, sizeof(int));
  }
  tamplo(n,m,pa);
  printf("dwste tis syntetagmenes tou tetragwnou pou thelete na anoixete\n");
  scanf("%d%d", &a,&;
  pa[a][b]=9;
  q=n+1;
  w=m+1;
  for(i=0;i<p;i++)
  {
      do
      {                     
          r1=rand()%q;
          r2=rand()%w;
      }while(r1==a && r2==;
      pa[r1][r2]=1;//to 10 antiprosopevei tis narkes
  }
  tamplo(n,m,pa);    
  for(i=0;i<n;i++)
  {
      free(pa[i]);
  }
  free(pa);
  system("PAUSE");	
  return 0;
}

Επεξ/σία από Monkey7
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Υπάρχει κάποιο πρόβλημα στον τρόπο που χρησιμοποιώ τη rand() δε βγάζει error αλλά κολλάει..?

(δώστε σημασία μονο στη rand έτσι όπως το έχω τώρα απλόσ εμφανίζει τα πάντα)

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

void tamplo(int n, int m, int **pa);
void narkes(int n, int m, int **pa);

int main(int argc, char *argv[])
{
  int i,j,n,m,o,p,a,b,r1,r2,q,w;
  int **pa=NULL;
  printf("Dwste tis diastaseis tou paixnidiou n x m\n");
  printf("Prosoxh, to tamplo mporei na exei megethos to poly 24x30\n");
  scanf("%d%d", &n,&m);
  printf("Epilxte to epipedo duskolias tou paixnidiou\n");
  printf("Pathste 1 gia eukolo, 2 gia metro, 3 gia duskolo kai 4 gia akatorthoto\n");
  scanf("%d", &o);
  if(o==1)
  {
     p=m*n/8;
  }
  if(o==2)
  {
     p=m*n/7;
  }
  if(o==3)
  {
     p=m*n/6;
  }
  if(o==4)
  {
     p=m*n/5;
  }    
  pa=(int**)calloc(n, sizeof(int*)); //desmeush mnhmhs gia dimiourgia 2d pinaka
  for(i=0;i<n;i++)
  {
        pa[i]=(int*)calloc(m, sizeof(int));
  }
  tamplo(n,m,pa);
  printf("dwste tis syntetagmenes tou tetragwnou pou thelete na anoixete\n");
  scanf("%d%d", &a,&;
  pa[a-1][b-1]=9;
  q=n+1;
  w=m+1;
  for(i=0;i<p;i++)
  {
      do
      {                     
          r1=rand()%q;
          r2=rand()%w;
      }while(r1==a && r2==;
      pa[r1][r2]=1;//to 10 antiprosopevei tis narkes
  }
  tamplo(n,m,pa);    
  for(i=0;i<n;i++)
  {
      free(pa[i]);
  }
  free(pa);
  system("PAUSE");	
  return 0;
}

 

Άμα αντί για q και w βάλω n και m δουλεύει :whistle:

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Υπάρχει κάποιο πρόβλημα στον τρόπο που χρησιμοποιώ τη rand() δε βγάζει error αλλά κολλάει..?

(δώστε σημασία μονο στη rand έτσι όπως το έχω τώρα απλόσ εμφανίζει τα πάντα)

Άμα αντί για q και w βάλω n και m δουλεύει :whistle:

Αφου το q και το w δεν τα εχεις δωσει τιμες...

Επισης, η srand(); που ειναι?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Η srand χρειάζεται αναγκαστικά? :-(

 

Τους έχω δώσει τιμές.Το λάθος ήτανε ότι υπερβαίνει το μέγεθος του πίνακα με το q και w. Τα n και m είναι τα όρια

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Προσπαθώ να φτιάξω ναρκαλιευτή σε C αλλά μου φένεται αδύνατον να φτιάξω τη συνάρτηση(int anoigma) που ανοίγει τα κουτάκια και βάζει αριθμούς με αναδρομή.(αναγκαστικά αναδρομη :eek: )

Άμα κάποιος μπορεί με οποιδήποτε τρόπο να με βοηθήσει θα του ήμουν ευγνώμων! :mrgreen:

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

void tamplo(int n, int m, int **pa);
int anoigma(int a, int b, int **pa);

int main(int argc, char *argv[])
{
  int i,j,n,m,o,p,a,b,r1,r2,k;
  int **pa=NULL;
  printf("Dwste tis diastaseis tou paixnidiou n x m\n");
  printf("Prosoxh, to tamplo mporei na exei megethos to poly 24x30\n");
  scanf("%d%d", &n,&m);
  printf("Epilxte to epipedo duskolias tou paixnidiou\n");
  printf("Pathste 1 gia eukolo, 2 gia metro, 3 gia duskolo kai 4 gia akatorthoto\n");
  scanf("%d", &o);
  if(o==1)
  {
     p=m*n/8;
  }
  if(o==2)
  {
     p=m*n/7;
  }
  if(o==3)
  {
     p=m*n/6;
  }
  if(o==4)
  {
     p=m*n/5;
  }    
  pa=(int**)calloc(n, sizeof(int*)); //desmeush mnhmhs gia dimiourgia 2d pinaka
  for(i=0;i<n;i++)
  {
        pa[i]=(int*)calloc(m, sizeof(int));
  }
  tamplo(n,m,pa);
  printf("dwste tis syntetagmenes tou tetragwnou pou thelete na anoixete\n");
  scanf("%d%d", &a,&;
  a=a-1;
  b=b-1;
  pa[a][b]=9;//9 antiprosopeyei ta anoixta tetragvna poy den periexoyn kati
  srand(time(NULL));
  for(i=0;i<p;i++)
  {
      do
      {                     
          r1=rand()%n;
          r2=rand()%m;
      }while(r1==a && r2==; //wste na mhn yparxei narkh sto tetragwnw pou epelekse
      pa[r1][r2]=10;//to 10 antiprosopevei tis narkes
  }
  k=anoigma(a,b,pa);
  printf("%s%d\n", "ayto einai to k:", k);
  tamplo(n,m,pa);    
  for(i=0;i<n;i++)
  {
      free(pa[i]);
  }
  free(pa);
  system("PAUSE");	
  return 0;
}

int anoigma(int a, int b, int **pa)
{
   int i,j,k=0,narkes=0;
   for(i=a-1;i<a+2;i++)
   {
        for(j=b-1;j<b+2;j++)
        {
              if(pa[i][j]==1)
              {
                   narkes=narkes+1;
              }
        }
   }
   if(narkes==0)
   {
      pa[a][b]=9;
   }
   else
   {
       pa[a][b]=narkes;
   }
   k=k+1;
   return k;
}  
   
void tamplo(int n, int m, int **pa)
{
  int i,j;
  if(m<10)
  {
       printf("   ");
       for(j=0;j<m;j++)
       {
           printf("%s%d", " ", j+1);
       }
       printf("\n");
       printf("-");
       for(j=0;j<m+1;j++)
       {
           printf("--");
       }
       printf("\n");
  }
  else
  {
      printf("   ");
      for(j=0;j<9;j++)
      {
            printf("%s%d", "  ", j+1);
      }
      for(j=0;j<m-9;j++)
      {
            printf("%s%d", " ", j+10);
      }
      printf("\n");
      printf("---");
      for(j=0;j<m;j++)
      {
           printf("---");
      }
      printf("\n");
  }       
  for(i=0;i<n;i++)
  {
        if(i<9)
        {
             printf("%s%d%s", " ", i+1, "|"); 
        }
        else
        {
            printf("%d%s", i+1, "|");
        }
        for(j=0;j<m;j++) 
        {
             if(pa[i][j]==0)
             {
                   if(m<10)
                   {
                       printf(" #");
                   }
                   else
                   {
                       printf("  #");
                   }
             }           
             if(pa[i][j]==9)
             {
                   if(m<10)
                   {
                        printf(" .");
                   }
                   else
                   {
                       printf("  .");
                   }
             }
             if(pa[i][j]!=0 && pa[i][j]!=9)
             {
                   if(m<10)
                   {
                        printf("%s%d", " ", pa[i][j]);
                   }
                   else
                   {
                        printf("%s%d", "  ", pa[i][j]);
                   }
             }
              
        }
        printf("\n");
  }
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γιατί το κάνεις έτσι;

 

Π.χ., δεν κατάλαβα γιατί το τετράγωνο a-1 και b-1 πρέπει να μην έχει νάρκη.

 

 

Σου προτείνω:

 

1ον

Δες πώς παίζεται ο ναρκαλιευτής (απ' ό,τι φαίνεται, ξέρεις)

 

2ον

Δες ένα σενάριο χρήσης. Π.χ., είσαι ο χρήστης, τρέχεις το πρόγραμμά σου, επιλέγεις ένα τετράγωνο και τι γίνεται;

 

3ον

Δες πώς μπορείς να ικανοποιήσεις αυτά που θα γίνονται κατά το βήμα 2.

 

4ον

Βάσει των προηγουμένων, οργάνωσε όλες τις λειτουργίες σε διάκριτα τμήματα. Π.χ., υπάρχει ένα τμήμα εισαγωγής προτιμήσεων από τον χρήστη, όπως μέγεθος ταμπλό και δυσκολία. Μετά, βάσει των δεδομένων που εισήγαγε ο χρήστης, πρέπει να φτιαχτεί ένα ταμπλό με τις ανάλογες νάρκες και το ανάλογο μέγεθος. Έπειτα, πρέπει να μπει σε ένα mode το πρόγραμμα που να τρέχει είτε μέχρι να χτυπήσει νάρκη ο χρήστης είτε μέχρι να τελειώσουν όλα τα κενά τετράγωνα.

 

5ον

Δες τι είναι βολικό να επιστρέφουν οι συναρτήσεις σου. Π.χ., μπορείς να έχεις δύο συναρτήσεις:

 

int playGame(int** board)

int usersChoise(int** board)

 

Όπου, να έχει στο body:

 

int status = 1;

 

while(status == 1){

 

status = usersChoise(board);

 

}

 

και η usersChoise να παραπέμπει τον χρήστη να δώσει ένα τετράγωνο, να ανιχνεύει εάν αυτό το τετράγωνο έχει νάρκη και εάν δεν έχει να επιστρέφει 1 αλλιώς 0. Εάν είναι το τελευταίο ανοιχτό να επιστρέφει 2 (π.χ.).

 

Έτσι, η playGame να έχει μετά το while:

 

if(status == 2) {

returnedValue = 1;

} else {

returnedValue = 0;

}

 

και έτσι στην main θα έχεις:

 

int result = playGame(board);

 

if(result){

printf("Congrats, you win!\n");

} else {

printf("Sorry, you lose\n");

}

 

 

Επίσης, θα πρέπει να αποφασίσεις στα διάφορα επίπεδα δυσκολίας πόσα κενά τετράγωνα θα υπάρχουν. Π.χ., στο επίπεδο difficult πόσα κενά θα αφήνεις σε ποσοστό; 10% του board; 20% ή 5%;

 

Αφού το αποφασίσεις, κάνεις τις πράξεις και βρίσκεις πόσες επαναλήψεις θα πρέπει να κάνεις για να γεμίσεις τα τετράγωνα με "1" (όπου θα σημαίνει ότι έχουν νάρκη), με την προϋπόθεση ότι τα κενά έχουν 0 (ή το αντίθετο, 1 για κενό 0 για νάρκη).

 

Κάνεις τις επαναλήψεις στον πίνακα και γεμίζεις ΤΥΧΑΙΑ τόσα τετράγωνα όσα πρέπει με νάρκες και τροφοδοτείς τον πίνακα αυτόν πάλι πίσω στην main.

 

Δηλαδή, η main θα έχει την μορφή:

 

>

int main(){

 welcomeMessage();

 int* choises = getUsersPreferences();

 int** board = makeBoard(choises);

 int result = 3;

 while (result == 3) { 
   result = playGame(board);

   if(result){
     printf("Congrats, you win!\n");
     result = askForRepetition();
   } else {
     printf("Sorry, you lose\n");
     result = askForRepetition(); //προφανώς για να ξανατρέξει θα πρέπει η askForRepetition να επιστρέψει 3
   }

 }

 return 0;
}

 

Και έχεις και ένα header file στην μορφή:

 

>
#ifndef MYFUNCS_H
#define MYFUNCS_H

void welcomeMessage(void);

int* getUsersPreferences(void);

int** makeBoard(int* );

int playGame(int** );

int askForRepetition(void);

#endif

 

 

Υ.Γ. η getUsersPreferences θα μπορούσε να είναι:

 

{

 

int* toReturn = (int*) malloc(sizeof(int) * 2);

 

printf("Choose size\n");

scanf("%d", toReturn[0]);

 

printf("Choose difficulty\n");

scanf("%d", toReturn[1]);

 

return toReturn;

}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...