C言語:簡単な無界面化操作掃雷ゲーム
13160 ワード
, C ?
, , , , , : !
:
直接あごを1つのファイルに入れると、機能は実現できますが、良い習慣ではありません.書籍『高品質プログラミングガイドC++/C言語』を参考にすることができます
#define _CRT_SECURE_NO_WARNINGS 10
#include
#include
#include
#define ROWS 12
#define COLS 12
#define NUM 15
enum op{
EXIT,
PLAY
};
void meau()
{
printf("****************************************************
");
printf("*************** 1、play ****************
");
printf("*************** 0、exit ****************
");
printf("****************************************************
");
}
void init_board(char board[ROWS][COLS])
{
int i = 0;
int j = 0;
char x = ' ';
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS; j++)
{
board[i][j] = x;
}
}
}
void init_mine(char mine[ROWS][COLS])
{
int i = 0;
int j = 0;
char x = ' ';
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS; j++)
{
mine[i][j] = x;
}
}
}
void get_mine(char mine[ROWS][COLS])
{
int x = 0;
int y = 0;
int mine_num = NUM;
while (mine_num)
{
loop:
x = rand() % (ROWS - 3 + 1) + 1;
y = rand() % (COLS - 3 + 1) + 1;
if (mine[x][y] != '*')
{
mine[x][y] = '*';
}
else
{
goto loop;
}
mine_num = mine_num - 1;
}
}
void print_board(char board[ROWS][COLS])
{
int i = 0;
int j = 0;
printf(" ");
for (i = 1; i < ROWS - 1; i++)
{
printf(" %d ", i);
}
printf("
");
for (i = 1; i < ROWS - 1; i++)
{
printf(" ");
for (j = 1; j < COLS - 1; j++)
{
printf("|---", board[i][j]);
}
printf("|
");
printf("%2d", i);
for (j = 1; j < COLS - 1; j++)
{
printf("| %c ", board[i][j]);
}
printf("|
");
}
printf(" ");
for (j = 1; j < COLS - 1; j++)
{
printf("|---", board[i][j]);
}
printf("|
");
}
char is_mine_num(char mine[ROWS][COLS], char board[ROWS][COLS], int x, int y)
{
int count = 0;
if (mine[x - 1][y - 1] == '*')count++;
if (mine[x - 1][y] == '*')count++;
if (mine[x - 1][y + 1] == '*')count++;
if (mine[x][y - 1] == '*')count++;
if (mine[x][y + 1] == '*')count++;
if (mine[x + 1][y - 1] == '*')count++;
if (mine[x + 1][y] == '*')count++;
if (mine[x + 1][y + 1] == '*')count++;
board[x][y] = (count + '0');
return board[x][y];
}
void play_game(char mine[ROWS][COLS], char board[ROWS][COLS])
{
int count = (ROWS - 2)*(COLS - 2) - NUM;
int x = 0;
int y = 0;
char ret = 0;
while (count)
{
loop:
printf(" :
>:");
scanf("%d %d", &x, &y);
if ((x<1 || x>ROWS - 2) || (y > ROWS - 2 || y < 1))
{
printf(" ! 。
");
goto loop;
}
if (mine[x][y] == '*')
{
int i = 0;
int j = 0;
while (count == ((ROWS - 2)*(COLS - 2) - NUM))
{
rand:
i = rand() % (ROWS - 3 + 1) + 1;
j = rand() % (COLS - 3 + 1) + 1;
if (mine[i][j] == ' ')
{
mine[i][j] = '*';
mine[x][y] = ' ';
count--;
board[x][y] = is_mine_num(mine, board, x, y);
print_board(board);
print_board(mine);
goto loop;
}
else
{
goto rand;
}
}
printf(" !
");
return;
}
else
{
board[x][y] = is_mine_num(mine, board, x, y);
print_board(board);
}
//print_board(mine);
count--;
}
if (count == 0)
printf("
");
}
void play()
{
int input = 0;
char board[ROWS][COLS];
char mine[ROWS][COLS];
srand((unsigned)time(NULL));
do
{
meau();
loop:
printf(" >>:
");
scanf("%d", &input);
if (input != 0 && input != 1)
{
printf(" , 。
");
goto loop;
}
switch (input)
{
case PLAY:
printf(" :
");
init_mine(mine);
init_board(board);
get_mine(mine);
print_board(board);
print_board(mine);
play_game(mine, board);
break;
case EXIT:
printf(" !");
break;
}
} while (input);
}
int main()
{
play();
system("pause");
return 0;
}