課題でマインスイーパーを作成しました。
最初からではなく、一部の記述のみです。
この課題では、最初からボードの縦横サイズと爆弾数が
#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;
}

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。