Βοήθεια (Όσοι πιστοί) - ναρκαλιευτής

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Βοήθεια (Όσοι πιστοί) - ναρκαλιευτής

Δημοσίευσηαπό Lokzor » 23 Μαρ 2010, 00:25

Λοιπόν εδώ και δύο μέρες προσπαθώ να βρώ το πρόβλημα με αυτό το πρόγραμμα το οποίο φτιάχνω. Είναι ένας απλός ναρκαλιευτής. Το θέμα είναι ότι όταν κάνω ./a.out στο αρχείο μου, συμβαίνει το εξής:

Ο πίνακας που υποτιθέμενα είναι ο ναρκαλιευτής "εκτυπώνεται" στο τερματικό 3 φόρες αφού με αφήσει να δώσω την επόμενη εντολή. Επιπλέον όταν προσπαθώ να του δώσω συντεταγμένες, μου ζητάει να δώσω δύο φορές την χ μεταβλητή την οποία δεύτερη, την μετράει ως ψ πρωτού εμφανιστεί το μήνυμα που έχω προσδιορίσει, για να δωθεί η μεταβλητή ψ.

Το επόμενο βήμα είναι να αρχίσω να χτυπάω την οθόνη στο κεφάλι μου :problem:

Κώδικας: Επιλογή όλων


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

void initGrid(int gridStatus[10][10],int playerStatus[10][10])
{
int numMines,i,j,k,l,x,y,count;

k=0;
l=0;
numMines=0;
srand((int)time(NULL));
numMines=rand()%50;

//Dimiourgia Pinakwn

for(i=0;i<10;i++){
for(j=0;j<10;j++){
gridStatus[i][j]=0;
}
}

for(i=0;i<10;i++){
for(j=0;j<10;j++){
playerStatus[i][j]=0;
}
}

//Prosthesi Narkwn

while(numMines!=0){
x=rand()%10;
y=rand()%10;
if(gridStatus[x][y]==0){
gridStatus[x][y]=-1;
numMines--;
if(numMines==0){
break;
}
}
}

//Elegxos gia narkes stin mesi

for(i=1;i<=8;i++){
for(j=1;j<=8;j++){
if (gridStatus[i][j]!=-1){
count=0;
for(k=i-1;k<=i+1;k++){
for(l=j-1;l<=j+1;l++){
if(gridStatus[k][l]==-1){
count++;
}
}
}
gridStatus[i][j]=count;
}
}
}
for(j=1;j<=8;j++){
if (gridStatus[0][j]!=-1){
count=0;
for(k=0;k<=1;k++){
for(l=j-1;l<=j+1;l++){
if(gridStatus[k][l]==-1){
count++;
}
}
}
gridStatus[0][j]=count;
}
}
for(j=1;j<=8;j++){
if (gridStatus[9][j]!=-1){
count=0;
for(k=8;k<=9;k++){
for(l=j-1;l<=j+1;l++){
if(gridStatus[k][l]==-1){
count++;
}
}
}
gridStatus[9][j]=count;
}
}

//Elegxos narkis stis gwnies tou pinaka gridStatus

if (gridStatus[0][0]!=-1){
count=0;
for(k=0;k<=1;k++){
for(l=0;l<=1;l++){
if(gridStatus[k][l]==-1){
count++;
}
}
}
gridStatus[0][0]=count;
}

if (gridStatus[9][9]!=-1){
count=0;
for(k=8;k<=9;k++){
for(l=8;l<=9;l++){
if(gridStatus[k][l]==-1){
count++;
}
}
}
gridStatus[9][9]=count;
}

if (gridStatus[0][9]!=-1){
count=0;
for(k=0;k<=1;k++){
for(l=8;l<=9;l++){
if(gridStatus[k][l]==-1){
count++;
}
}
}
gridStatus[0][9]=count;
}

if (gridStatus[9][0]!=-1){
count=0;
for(k=8;k<=9;k++){
for(l=0;l<=1;l++){
if(gridStatus[k][l]==-1){
count++;
}
}
}
gridStatus[9][0]=count;
}

//Grammes elegxos gia narkes

for(j=1;j<=8;j++){
if (gridStatus[0][j]!=-1){
count=0;
for(k=0;k<=1;k++){
for(l=j-1;l<=j+1;l++){
if(gridStatus[k][l]==-1){
count++;
}
}
}
gridStatus[0][j]=count;
}
}
for(j=1;j<=8;j++){
if (gridStatus[9][j]!=-1){
count=0;
for(k=8;k<=9;k++){
for(l=j-1;l<=j+1;l++){
if(gridStatus[k][l]==-1){
count++;
}
}
}
gridStatus[9][j]=count;
}
}

//Plagies styles elegxos gia narkes

for(i=1;i<=8;i++){
if (gridStatus[i][0]!=-1){
count=0;
for(k=i-1;k<=i+1;k++){
for(l=0;l<=1;l++){
if(gridStatus[k][l]==-1){
count++;
}
}
}
gridStatus[i][0]=count;
}
}

for(i=1;i<=8;i++){
if (gridStatus[i][9]!=-1){
count=0;
for(k=i-1;k<=i+1;k++){
for(l=8;l<=9;l++){
if(gridStatus[k][l]==-1){
count++;
}
}
}
gridStatus[i][9]=count;
}
}
}

//*****************************************************************************************************

void printGrid(int gridStatus[10][10],int playerStatus[10][10])
{
int i,j,countMark,countOpen,countMines;
countMark=0;
countOpen=0;
countMines=0;
printf(" 0 1 2 3 4 5 6 7 8 9 \n");
for(i=0;i<=9;i++){
printf("%d ",i);
for(j=0;j<=9;j++){
printf("|");
if(playerStatus[i][j]==0)
printf(" ");
if(playerStatus[i][j]==1){
printf("X");
countMark++;
}
if(playerStatus[i][j]==2){
printf("%d", gridStatus[i][j]);
countOpen++;
}
if(playerStatus[i][j]==-1)
printf("@");
}
printf("| \n");
}
for(i=0;i<=9;i++) {
for(j=0;j<=9;j++){
if(gridStatus[i][j]==-1)
countMines++;
}
}
printf("[Mines] Total: %d , ", countMines);
printf("Opened: %d , ", countOpen);
printf("Marked: %d , \n", countMark);
printf(" f/F : Flag , o/O : Open , q/Q : Quit \n");
}

//*****************************************************************************************************

int flagCell(int x,int y,int playerStatus[10][10],int gridStatus[10][10])
{
int playerFlag,currentFlag,i,j;
playerFlag=0;
currentFlag=0;
for(i=0;i<10;i++){
for(j=0;j<10;j++){
if(playerStatus[i][j]==1)
currentFlag++;
if(gridStatus[i][j]==-1)
playerFlag++;
}
}
if(playerStatus[x][y]==0){
playerStatus[x][y]=1;
return(1);
}
if(playerStatus[x][y]==1){
playerStatus[x][y]=0;
return(-1);
}
if((x<0)||(x>9)||(y<0)||(y>9)||(playerStatus[x][y]==2)||(currentFlag==playerFlag)){
return(0);
}
}

//*****************************************************************************************************

int openCell(int x,int y,int playerStatus[10][10],int gridStatus[10][10])
{
if(gridStatus[x][y]!=-1){
playerStatus[x][y]=2;
return(1);
}
if(gridStatus[x][y]==-1){
playerStatus[x][y]=-1;
return(-1);
}
if((x<0)||(x>9)||(y<0)||(y>9)||(playerStatus[x][y]==1)||(playerStatus[x][y]==2)) {
return(0);
}
}

//*****************************************************************************************************

main()
{

int playerStatus[10][10],gridStatus[10][10],x,y,apotOpen,apotMark,count,i,j,numMines;
char answer;

numMines=0;
count=0;
apotOpen=0;
apotMark=0;
initGrid(gridStatus,playerStatus);
printGrid(gridStatus,playerStatus);
while(1){
printf("Ti thelete na kanete? \n");
scanf("%c", &answer);
if(answer=='o' || answer=='O'){
printf("Dwste syntetagmenes tou koutiou pou thelete na anoiksete \n");
printf("Dwste syntetagmeni x \n");
scanf("%d \n", &x);
printf("Dwste syntetagmeni y \n");
scanf("%d \n", &y);
apotOpen=openCell(x,y,playerStatus,gridStatus);
if(apotOpen==0)
printf("Lathos energeia \n");
if(apotOpen==1)
printf("To koutaki anoixthike epityxws! \n");
if(apotOpen==-1){
printf("Lypame, molis anatinaxtikes! Game Over! \n");
printGrid(gridStatus,playerStatus);
break;
}
}
if(answer=='f' || answer=='F'){
printf("Dwste syntetagmenes tou koutiou pou thelete na markarete h na ksemarkarete \n");
printf("Dwste syntetagmeni x \n");
scanf("%d \n", &x);
printf("Dwste syntetagmeni y \n");
scanf("%d \n", &y);
apotMark=flagCell(x,y,playerStatus,gridStatus);
if(apotMark==0)
printf("Den egine kamia energeia \n");
if(apotMark==1)
printf("To koutaki markaristike epityxws! \n");
if(apotMark==-1)
printf("To koutaki ksemarkaristike epityxws! \n");
}
if(answer=='q' || answer=='Q'){
printf("Too hard for you...? Farewell. \n");
break;
}
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(playerStatus[i][j]==0 || playerStatus[i][j]==1)
count++;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(gridStatus[i][j]==-1)
numMines++;
if(count==numMines){
printf("\n\n\tSygxaritiria.Kerdisate!\n");
break;
}
printGrid(gridStatus,playerStatus);
}
}
Lokzor
babeTUX
babeTUX
 
Δημοσιεύσεις: 9
Εγγραφή: 23 Μαρ 2010, 00:02
Εκτύπωση

Re: Βοήθεια (Όσοι πιστοί)

Δημοσίευσηαπό Lokzor » 24 Μαρ 2010, 02:46

Μετά από μετατροπές και με την χρήση του continue κατάφερα να το κάνω να εμφανίζει μόνο το "Τι θέλετε να κάνετε;" 3 φορές. Αυτό μαζί με το πρόβλημα τις μεταβλητής χ,ψ ακόμα υπάρχουν. Το νέο loop του while:

Κώδικας: Επιλογή όλων

while(1){
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(playerStatus[i][j]==0 || playerStatus[i][j]==1)
count++;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(gridStatus[i][j]==-1)
numMines++;
if(count==numMines){
printf("\n\n\tSygxaritiria.Kerdisate!\n");
break;
}
printf("Ti thelete na kanete? \n");
scanf("%c", &answer);
if(answer=='o' || answer=='O'){
printf("Dwste syntetagmenes tou koutiou pou thelete na anoiksete \n");
printf("Dwste syntetagmeni x \n");
scanf("%d \n", &x);
printf("Dwste syntetagmeni y \n");
scanf("%d \n", &y);
apotOpen=openCell(x,y,playerStatus,gridStatus);
if(apotOpen==0)
printf("Lathos energeia \n");
if(apotOpen==1)
printf("To koutaki anoixthike epityxws! \n");
if(apotOpen==-1){
printf("Lypame, molis anatinaxtikes! Game Over! \n");
printGrid(gridStatus,playerStatus);
break;
}
printGrid(gridStatus,playerStatus);
continue;
}
if(answer=='f' || answer=='F'){
printf("Dwste syntetagmenes tou koutiou pou thelete na markarete h na ksemarkarete \n");
printf("Dwste syntetagmeni x \n");
scanf("%d \n", &x);
printf("Dwste syntetagmeni y \n");
scanf("%d \n", &y);
apotMark=flagCell(x,y,playerStatus,gridStatus);
if(apotMark==0)
printf("Den egine kamia energeia \n");
if(apotMark==1)
printf("To koutaki markaristike epityxws! \n");
if(apotMark==-1)
printf("To koutaki ksemarkaristike epityxws! \n");
printGrid(gridStatus,playerStatus);
continue;
}
if(answer=='q' || answer=='Q'){
printf("Too hard for you...? Farewell. \n");
break;
}
continue;
}
Lokzor
babeTUX
babeTUX
 
Δημοσιεύσεις: 9
Εγγραφή: 23 Μαρ 2010, 00:02
Εκτύπωση

Re: Βοήθεια (Όσοι πιστοί)

Δημοσίευσηαπό mangelasakis » 24 Μαρ 2010, 04:26

έγραψε:
Κώδικας: Επιλογή όλων
printf("Dwste syntetagmeni x \n");
scanf("%d \n", &x);
printf("Dwste syntetagmeni y \n");
scanf("%d \n", &y);


Δοκίμασε μέσα στις "scanf" μετά το %d να μην αφήσεις κενό... δηλαδή κάπως έτσι:
Κώδικας: Επιλογή όλων
scanf("%d\n", &x);

ή
Κώδικας: Επιλογή όλων
scanf("%d", &x);


επίσης δοκίμασε για την ερώτηση "Τι θέλετε να κάνετε;"
Κώδικας: Επιλογή όλων
scanf("%c\n", &answer);

ίσως κρατάει η scanf και τον χαρακτήρα αλλαγής γραμμής "\n" για αυτό να σου το εκτυπώνει 3 φορές...
Spoiler: show
Linux: 5ετής χρήση ┃ Προγραμ: μόνο C προς το παρών ┃ Αγγλικά: Μέτριος προς καλός
Desktop:
Ubuntu gnome 14.04 amd64 - Debian testing amd64
CPU: 4x AMD Phenom II X4 955 ‖ RAM 8000 MiB ‖ Gigabyte GA-MA785GT-UD3H
[Radeon HD 4200] Radeon HD 7750 ⎨1002:9710⎬
RTL8111/8168B PCI ⎨10ec:8168⎬ (rev 02)
Laptop:
Ubuntu gnome 14.04 amd64
4x Intel Core i3 M 330 2.13GHz ‖ RAM 3628 MiB ‖ Sony Corporation VPCEB1J1E
Intel VGA [8086:0046] (rev 02)
eth0: [11ab:4381] (rev 11) ⋮ wlan0: AR9285 [168c:002b] (rev 01)
mangelasakis
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1149
Εγγραφή: 10 Μαρ 2009, 06:08
Εκτύπωση

Re: Βοήθεια (Όσοι πιστοί) - ναρκαλιευτής

Δημοσίευσηαπό mangelasakis » 24 Μαρ 2010, 19:22

φίλε μου έκανες τίποτα???
Spoiler: show
Linux: 5ετής χρήση ┃ Προγραμ: μόνο C προς το παρών ┃ Αγγλικά: Μέτριος προς καλός
Desktop:
Ubuntu gnome 14.04 amd64 - Debian testing amd64
CPU: 4x AMD Phenom II X4 955 ‖ RAM 8000 MiB ‖ Gigabyte GA-MA785GT-UD3H
[Radeon HD 4200] Radeon HD 7750 ⎨1002:9710⎬
RTL8111/8168B PCI ⎨10ec:8168⎬ (rev 02)
Laptop:
Ubuntu gnome 14.04 amd64
4x Intel Core i3 M 330 2.13GHz ‖ RAM 3628 MiB ‖ Sony Corporation VPCEB1J1E
Intel VGA [8086:0046] (rev 02)
eth0: [11ab:4381] (rev 11) ⋮ wlan0: AR9285 [168c:002b] (rev 01)
mangelasakis
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1149
Εγγραφή: 10 Μαρ 2009, 06:08
Εκτύπωση

Re: Βοήθεια (Όσοι πιστοί) - ναρκαλιευτής

Δημοσίευσηαπό OSRipper » 24 Μαρ 2010, 20:42

Φιλε Lokzop,

Κατα αρχάς θα ήθελα να σου πώ ότι το προγραμματάκι σου είναι πολύ ωραίο και αποτελεί έναν καλό τρόπο για εξάσκηση στην C.

Κοίταξα τον αρχικό σου κώδικα χωρίς την while που έβαλες μετά.Τρέχοντας τον δεν μου εμφάνισε 3 φόρες τον πίνακα.
Τώρα το πρόβλημα ήταν οτι στην scanf που διάβαζε το x και το y είχες βάλει \n το οποίο σε καμία scanf δεν το βάζουμε ποτέ να το ξέρεις.
Δεν κοίταξα το υπολοιπο προγραμμα σου αλλά αν έχεις κάπου αλλού scanf τότε πήγαινε και βγάλτης το \n.

Σου στέλνω και τον κώδικα της main με διορθωμένα τα scanf :

Κώδικας: Επιλογή όλων
main()
{

int playerStatus[10][10],gridStatus[10][10],x,y,apotOpen,apotMark,count,i,j,numMines;
char answer;

numMines=0;
count=0;
apotOpen=0;
apotMark=0;
initGrid(gridStatus,playerStatus);
printGrid(gridStatus,playerStatus);
while(1){
printf("Ti thelete na kanete? \n");
scanf("%c", &answer);
if(answer=='o' || answer=='O'){
printf("Dwste syntetagmenes tou koutiou pou thelete na anoiksete \n");
printf("Dwste syntetagmeni x \n");
scanf("%d", &x);
printf("Dwste syntetagmeni y \n");
scanf("%d", &y);
apotOpen=openCell(x,y,playerStatus,gridStatus);
if(apotOpen==0)
printf("Lathos energeia \n");
if(apotOpen==1)
printf("To koutaki anoixthike epityxws! \n");
if(apotOpen==-1){
printf("Lypame, molis anatinaxtikes! Game Over! \n");
printGrid(gridStatus,playerStatus);
break;
}
}
if(answer=='f' || answer=='F'){
printf("Dwste syntetagmenes tou koutiou pou thelete na markarete h na ksemarkarete \n");
printf("Dwste syntetagmeni x \n");
scanf("%d", &x);
printf("Dwste syntetagmeni y \n");
scanf("%d", &y);
apotMark=flagCell(x,y,playerStatus,gridStatus);
if(apotMark==0)
printf("Den egine kamia energeia \n");
if(apotMark==1)
printf("To koutaki markaristike epityxws! \n");
if(apotMark==-1)
printf("To koutaki ksemarkaristike epityxws! \n");
}
if(answer=='q' || answer=='Q'){
printf("Too hard for you...? Farewell. \n");
break;
}
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(playerStatus[i][j]==0 || playerStatus[i][j]==1)
count++;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(gridStatus[i][j]==-1)
numMines++;
if(count==numMines){
printf("\n\n\tSygxaritiria.Kerdisate!\n");
break;
}
printGrid(gridStatus,playerStatus);
}
}


Για οποιαδήποτε απορία ή καποίο άλλο πρόβλημα ευχαρίστως να βοηθήσω.
Rip The System...
Άβαταρ μέλους
OSRipper
babeTUX
babeTUX
 
Δημοσιεύσεις: 13
Εγγραφή: 20 Μαρ 2010, 05:04
Εκτύπωση

Re: Βοήθεια (Όσοι πιστοί) - ναρκαλιευτής

Δημοσίευσηαπό Τάσος_ » 29 Μαρ 2010, 17:50

Το ίδιο πρόβλημα (να εκτυπώνει 2-3 φορές κάτι που δε θα έπρεπε) υπάρχει και αν γράψεις σκέτο scanf("%c", &metablhth);
Ο μεταγλωτιστής δέχετε την αλλαγή σειράς ώς χαρακτήρα και όποτε μου έχει τύχει το διορθώνω με ένα απλό if (μεταβλητη=='\n') continue;

Off topic:
@lokzor Μπορώ να μαντέψω ότι είσαι πρωτοετής στο Πανεπιστήμιο Ιωαννίνων; :O
Τάσος_
babeTUX
babeTUX
 
Δημοσιεύσεις: 6
Εγγραφή: 15 Φεβ 2010, 13:18
Εκτύπωση

Re: Βοήθεια (Όσοι πιστοί) - ναρκαλιευτής

Δημοσίευσηαπό priest91 » 30 Μαρ 2010, 02:33

Off topic:
χεχε ετσι cs.uoi :mrgreen:
priest91
babeTUX
babeTUX
 
Δημοσιεύσεις: 17
Εγγραφή: 29 Νοέμ 2009, 16:20
Εκτύπωση

Re: Βοήθεια (Όσοι πιστοί) - ναρκαλιευτής

Δημοσίευσηαπό mangelasakis » 30 Μαρ 2010, 04:15

έγραψε:Το ίδιο πρόβλημα (να εκτυπώνει 2-3 φορές κάτι που δε θα έπρεπε) υπάρχει και αν γράψεις σκέτο scanf("%c", &metablhth);
Ο μεταγλωτιστής δέχετε την αλλαγή σειράς ώς χαρακτήρα και όποτε μου έχει τύχει το διορθώνω με ένα απλό if (μεταβλητη=='\n') continue;


Ωραίος... αυτήν την εντόλή έψαχνα και εγώ αλλά τόσα χρόνια που να την θυμηθώ...
Spoiler: show
Linux: 5ετής χρήση ┃ Προγραμ: μόνο C προς το παρών ┃ Αγγλικά: Μέτριος προς καλός
Desktop:
Ubuntu gnome 14.04 amd64 - Debian testing amd64
CPU: 4x AMD Phenom II X4 955 ‖ RAM 8000 MiB ‖ Gigabyte GA-MA785GT-UD3H
[Radeon HD 4200] Radeon HD 7750 ⎨1002:9710⎬
RTL8111/8168B PCI ⎨10ec:8168⎬ (rev 02)
Laptop:
Ubuntu gnome 14.04 amd64
4x Intel Core i3 M 330 2.13GHz ‖ RAM 3628 MiB ‖ Sony Corporation VPCEB1J1E
Intel VGA [8086:0046] (rev 02)
eth0: [11ab:4381] (rev 11) ⋮ wlan0: AR9285 [168c:002b] (rev 01)
mangelasakis
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1149
Εγγραφή: 10 Μαρ 2009, 06:08
Εκτύπωση


Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι

cron