game.h
#ifndef __GAME_H__
#define __GAME_H__
#define ROWS 10
#define COLS 10
#define DEFAULT_COUNT 20
typedef unsigned int uint_t;//类型重命名
#include<string.h>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void init_board(char arr[ROWS + 2][COLS + 2], int row, int col, char ch);//初始化
void display(char arr[ROWS + 2][COLS + 2], int row, int col);
void mine_set(char arr[ROWS + 2][COLS + 2], int row, int col);//放雷
int get_mine_num(char arr[ROWS + 2][COLS + 2], int row, int col);//统计坐标周围雷的个数
#endif //__GAME_H__
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
void init_board(char arr[ROWS + 2][COLS + 2], int row, int col, char ch)
{
memset(arr, ch, sizeof(char)* row * col);
}
void display(char arr[ROWS + 2][COLS + 2], int row, int col)
{
int i = 0;
int j = 0;
printf(" ");
for (i = 0; i < col - 2; i++)
{
printf("%d ", i + 1);
}
printf("\n");
for (i = 0; i < row - 2; i++)
{
printf("%2d ", i + 1);
for (j = 0; j < col - 2; j++)
{
printf("%c ", arr[i + 1][j + 1]);
}
printf("\n");
}
}
void mine_set(char arr[ROWS + 2][COLS + 2], int row, int col)
{
int x = 0;
int y = 0;
int count = DEFAULT_COUNT;
while (count)
{
x = rand() % 10 + 1;
y = rand() % 10 + 1;
if (arr[x][y] != '1')
{
arr[x][y] = '1';
count--;
}
}
}
int get_mine_num(char arr[ROWS + 2][COLS + 2], int x, int y)
{
return (arr[x][y - 1] - '0') +
(arr[x - 1][y - 1] - '0') - +
(arr[x - 1][y] - '0') +
(arr[x - 1][y + 1] - '0') +
(arr[x][y + 1] - '0') +
(arr[x + 1][y + 1] - '0') +
(arr[x + 1][y] - '0') +
(arr[x + 1][y - 1] - '0');//返回周围雷的个数
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include "game.h"
void menu()
{
printf("********* welcome ********\n");
printf("**********1.play**********\n");
printf("**********0.exit**********\n");
}
enum Option
{
EXIT,
PLAY
};
void game()
{
int x = 0;
int y = 0;
int i = 0;
int win = 0;
char mine[ROWS + 2][COLS + 2] = { 0 };
char show[ROWS + 2][ROWS + 2] = { 0 };
init_board(mine, ROWS + 2, COLS + 2, '0');
init_board(show, ROWS + 2, COLS + 2, '*');
//display(mine, ROWS + 2, COLS + 2);#define _CRT_SECURE_NO_WARNINGS
//display(show, ROWS + 2, COLS + 2);
mine_set(mine, ROWS + 2, COLS + 2);
display(mine, ROWS + 2, COLS + 2);
while (win<ROWS*COLS - DEFAULT_COUNT)
{
for (i = 0; i <= win; i++)
{
printf("请输入坐标:>");
scanf("%d%d", &x, &y);
//合法性判断
if ((x>0) && (x <= ROWS) && (y > 0) && (y <= COLS))
{
if ((i == 0) && (mine[x][y] == '1'))
{
(mine[x][y] = '0');
}
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
break;
}
else
{
int count = 0;
win++;
count = get_mine_num(mine, x, y);
show[x][y] = count + '0';
display(show, ROWS + 2, COLS + 2);
}
}
else
{
printf("输入错误请重新输入\n");
}
}
if (win >= ROWS*COLS - DEFAULT_COUNT)
{
printf("恭喜你,扫雷成功\n");
}
}
}
int main()
{
int input = 0;
srand((uint_t)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case PLAY:
game();
break;
case EXIT:
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
system("pause\n");
return 0;
}
网友评论