質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Q&A

解決済

2回答

2332閲覧

盤面とそれの開き方について

chiku_soh

総合スコア12

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

0グッド

0クリップ

投稿2016/08/22 16:03

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
cでマインスイーパー作成を作成しています。

###発生している問題・エラーメッセージ

最初からばんめんにいくつか数字が表示されてしまっている点と、座標を指定しても開かない点が問題になってます。 エラーめっせーじはありません。

###該当のソースコード

c言語 //min.c #include<stdio.h> #include<string.h> #include<sys/time.h> #include<stdlib.h> #include<stdbool.h> #define MINE 10 #define BORD_wide 9 #define BORD_high 9 bool g_open[BORD_wide+2][BORD_high+2]; bool g_mine[BORD_wide+2][BORD_high+2]; char g_near[BORD_wide+2][BORD_high+2]; int init_board(){ int x,y,i; for(x=0;x<11;x++){ for(y=0;y<11;y++){ g_mine[x][y]=false; g_near[x][y]=0; g_open[x][y]=false; } } for(i=0;i<10;i++){ int x,y; do{ x=rand()%10; y=rand()%10; } while(g_mine[x][y]); g_mine[x][y]=true; g_near[x-1][y-1]+=1; g_near[x][y-1]+=1; g_near[x+1][y-1]+=1; g_near[x-1][y]+=1; g_near[x][y]+=1; g_near[x+1][y]+=1; g_near[x-1][y+1]+=1; g_near[x][y+1]+=1; g_near[x+1][y+1]+=1; } } const char *digitStr[]={ "1","2","3","4","5","6","7","8","9", }; int pboard(bool sweeped){ int x,y; printf("\n 123456789\n"); for(y=1;y<=9;y++){ printf("%d",y); for(x=1;x<=9;x++){ if(!g_mine[x][y]) printf("?"); else if(sweeped&&g_mine[x][y]) printf("*"); else if(sweeped&&!g_near[x][y]) printf("#"); else printf("%d",g_near[x][y]); } printf("\n"); } printf("\n"); } bool checkSweeped(){ int x,y; for(x=1;x<=9;x++){ for(y=1;y<=9;y++){ if(!g_mine[x][y]&&!g_open[x][y]) return false; } } return true; } int main(void){ int xx,yy; struct timeval tv; gettimeofday(&tv,NULL); srand(tv.tv_sec+tv.tv_usec); printf("start minsweeper!"); for(;;){ init_board(); bool sweeped=false; while(!sweeped){ pboard(sweeped); printf("if you stop the game,put control+c.\n"); printf("input the coordinate. [x][y] : "); scanf("%d %d",&xx,&yy); if(g_mine[xx][yy]) break; sweeped=checkSweeped(); } pboard(sweeped); if(sweeped) printf("cleared!!\n"); else printf("Oh,no!you've failed."); } return 0; }

###試したこと
とりあえずif分のところのsweeped&&というのをやってみたのですが、それが問題だったりするかも気になります。

###補足情報(言語/FW/ツール等のバージョンなど)
osはセントでエディタはemacs、こんぱいらはgccを使ってます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

とりあえず問題になりそうな箇所を一点。
init_board関数でランダムで求めてる値が0~9になると思われるので、0の場合、その後の配列参照が領域外になる恐れがある。

c

1x=rand()%10; 2y=rand()%10; 34g_near[x-1][y-1]+=1;

投稿2016/08/23 00:09

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

最初からばんめんにいくつか数字が表示されてしまっている

pboard内の条件分岐がおかしい気がする.

座標を指定しても開かない

開いた座標に「開いたよ」ってフラグを立ててない.
たぶんg_openがそのフラグだろうから,そこを修正.

以下,あまりよろしくないですが,修正版のソースコードをはっつけます.
敢えて(typoも含めて)ほとんど変えてません.変えた部分にはコメント付けてあります.

#include<stdio.h> #include<string.h> #include<sys/time.h> #include<stdlib.h> #include<stdbool.h> #define MINE 10 #define BORD_wide 9 #define BORD_high 9 bool g_open[BORD_wide+2][BORD_high+2]; bool g_mine[BORD_wide+2][BORD_high+2]; char g_near[BORD_wide+2][BORD_high+2]; void init_board(){ // int -> void int x,y,i; for(x=0;x<11;x++){ for(y=0;y<11;y++){ g_mine[x][y]=false; g_near[x][y]=0; g_open[x][y]=false; } } for(i=0;i<10;i++){ int x,y; do{ x=rand()%10; y=rand()%10; } while(g_mine[x][y]); g_mine[x][y]=true; g_near[x-1][y-1]+=1; g_near[x][y-1]+=1; g_near[x+1][y-1]+=1; g_near[x-1][y]+=1; g_near[x][y]+=1; g_near[x+1][y]+=1; g_near[x-1][y+1]+=1; g_near[x][y+1]+=1; g_near[x+1][y+1]+=1; } } const char *digitStr[]={ "1","2","3","4","5","6","7","8","9", }; void pboard(bool sweeped){ // int -> void int x,y; printf("\n 123456789\n"); for(y=1;y<=9;y++){ printf("%d",y); for(x=1;x<=9;x++){ if(!g_open[x][y]) // if not open, print '?' printf("?"); else if(g_mine[x][y]) // if mine, print '*' printf("*"); else if(g_near[x][y] == 0) // if not near, print '#' printf("#"); else // otherwise, print near value printf("%d", g_near[x][y]); } printf("\n"); } printf("\n"); } bool checkSweeped(){ int x,y; for(x=1;x<=9;x++){ for(y=1;y<=9;y++){ if(!g_mine[x][y]&&!g_open[x][y]) return false; } } return true; } int main(void){ int xx,yy; struct timeval tv; gettimeofday(&tv,NULL); srand(tv.tv_sec+tv.tv_usec); printf("start minsweeper!"); for(;;){ init_board(); bool sweeped=false; while(!sweeped){ pboard(sweeped); printf("if you stop the game,put control+c.\n"); printf("input the coordinate. [x][y] : "); scanf("%d %d",&xx,&yy); if(g_mine[xx][yy]) break; g_open[xx][yy] = true; // set flag sweeped=checkSweeped(); } pboard(sweeped); if(sweeped) printf("cleared!!\n"); else printf("Oh,no!you've failed."); } return 0; }

投稿2016/08/22 21:06

tamy

総合スコア442

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問