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

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

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

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

Q&A

解決済

1回答

9613閲覧

C言語 マインスイーパー ボードの縦横サイズと爆弾数

U.s

総合スコア11

C

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

0グッド

0クリップ

投稿2015/04/27 13:45

課題でマインスイーパーを作成しました。
最初からではなく、一部の記述のみです。

この課題では、最初からボードの縦横サイズと爆弾数が
#defineで定義されていました。
これを自分で指定できるように改変したいのですがどうしたらいいでしょうか?
size、bomという変数を作りprintfとscanf文を使い一通り変えてみてもエラーが多すぎて出来ませんでした。

アドバイスをよろしくお願いします。

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

#define SIZE 5 // ボードの縦横サイズ
#define BOMBNUM 5 // 爆弾の数

// 2D平面座標値
typedef struct {
int x, y;
}Coord;

int is_already_set( Coord[], int, Coord );
void init( int[][SIZE], Coord[] );
int proc_one_cell( int[][SIZE], Coord[], Coord );
void get_coord(int[][SIZE], Coord* );
void show_board( int[][SIZE] );
void show_bomb_list( Coord[] );

int main(void) {
int board[SIZE][SIZE];//ボード情報。問題文説明参照
Coord bomb[BOMBNUM];//ボードに於ける爆弾位置座標

int count = 0;//開いたセルの数
int total = SIZE * SIZE - BOMBNUM;//開けるセルの総数
Coord coordinate;//入力座標
int is_continue = 1;//ゲーム続けるか否か。0:終わり 1:続ける

// ボードの初期化。boardを-1に。爆弾位置の決定。
init(board, bomb);

while(is_continue == 1) {
// 現在のボード状況の表示
show_board(board);

// ユーザから開くセル位置を入力してもらう get_coord(board, &coordinate); // ユーザ入力されたセル位置について処理を行う switch(proc_one_cell(board, bomb, coordinate)) { // ユーザ指定位置が地雷なら終了 case -1 : printf("地雷!!\n"); is_continue = 0; break; // ユーザ指定位置が地雷以外 default : // 開いたセル数を一つ増やす count++; // 開けるセル全て開いたなら終了 if(count == total) { show_board(board); printf("大正解!\n"); is_continue = 0; } }

}

// 地雷位置リストの表示
show_bomb_list(bomb);

return 0;
}

/**

  • @fn
  • @breaf ユーザから有効な座標値を入力してもらう
  • @param board 現在のボード状況
  • @param coord ユーザ入力を保存

*/
void get_coord(int board[][SIZE], Coord *coord) {
char input[100];

int s; s=0; while(s==0){ s = 1; printf("開く位置を入力(例:A1):"); scanf("%s",input); input[0]=input[0]-'A'; input[1]=input[1]-'1'; if(input[2] != '\0'){ printf("入力ミス:2文字でお願いします。\n"); s = 0; }else if(input[0]<0 || input[0]>4){ printf("入力ミス:列番号が間違ってます。\n"); s = 0; }else if(input[1]<0 || input[1]>4){ printf("入力ミス:行番号が間違ってます。\n"); s = 0; } } coord->x = input[0]; coord->y = input[1];

}

/**

  • @fn
  • @breaf すでに爆弾が設置された場所か否か判断
  • @param bomb 爆弾設置位置リスト
  • @param upper 今設置されたのがリストの何番目までか
  • @param p 爆弾が置けるか否か確かめたい位置
  • @return 1ならpは既に爆弾が置かれている、0なら置かれてない

*/
int is_already_set(Coord bomb[], int upper, Coord p) {
int i;
int flag = 0;
// 以前すでに爆弾位置とされた場所なら
// flagを1に設定する
for(i = 0; i < upper; i++) {
if(p.x == bomb[i].x && p.y == bomb[i].y){
flag = 1;
}
}
return flag;
}

/**

  • @fn
  • @breaf ゲームの初期化
  • @param board ゲーム盤の状態を保持
  • @param bomb 爆弾位置リスト

*/
void init(int board[][SIZE], Coord bomb[]) {
int i, j;

// ボードの初期化
for(i = 0; i < SIZE; i++) {
for(j = 0; j < SIZE; j++) {
board[i][j] = -1;
}
}

// BOMBNUM個の爆弾位置を決定
srand((unsigned int)time(NULL));
for(i = 0; i < BOMBNUM; i++) {
do {
bomb[i].x = rand() % SIZE;
bomb[i].y = rand() % SIZE;
}while (is_already_set(bomb, i, bomb[i]) == 1);
}
}

/**

  • @fn
  • @breaf ゲーム盤の表示
  • @param board ゲーム盤の状態を保持

*/
void show_board(int board[][SIZE]){
int i, j;

printf(" ");
for(i = 0; i < SIZE; i++){
printf("%c", 'A' + i);
}
printf("\n");

for(i = 0; i < SIZE; i++) {
printf("%d ", i + 1);
for(j = 0; j < SIZE; j++) {
if(board[i][j] < 0) {
printf("X");
}else {
printf("%d", board[i][j]);
}
}
printf("\n");
}
}

/**

  • @fn
  • @breaf 爆弾位置リストの表示
  • @param bomb 爆弾位置リスト

*/
void show_bomb_list(Coord b[]) {
int i;
printf("地雷の位置は, ");

for(i = 0; i < BOMBNUM; i++) {
printf("%c%d ", b[i].x + 'A', b[i].y + 1);
}
printf("でした。\n");
}

/**

  • @fn
  • @breaf ユーザ指定位置のセルを開け、爆弾か否か確認し、爆弾でなければ表示すべき数字を計算
  • @param board ゲーム盤の状態を保持
  • @param bomb 爆弾の位置リスト
  • @param input 今回開きたいセルの位置
  • @return -1ならinputが爆弾位置だった、1なら爆弾以外の位置だったという意味

/
int proc_one_cell(int board[][SIZE], Coord bomb[], Coord input) {
/

*TBD!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*/
int i;
int count = 0;
for(i=0;i<=4;i++){
if(input.x==bomb[i].x && input.y==bomb[i].y){
return -1;
}
}

int a; int b; for(a=-1;a<=1;a++){ for(b=-1;b<=1;b++){ for(i=0;i<=4;i++){ if(input.x+a == bomb[i].x && input.y+b == bomb[i].y) count++; } } } board[input.y][input.x] = count; return 0;

}

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

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

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

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

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

guest

回答1

0

ベストアンサー

などを参考にして、動的に2次元配列のエリアを確保することからはじめてみては如何でしょう。

配列の領域さえ確保できれば、後は #define でサイズ指定してても、動的にサイズ指定していても、
プログラムのコードは同じもので済むはずです。

投稿2015/04/27 14:35

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問