#include
#include
#include
int width;
/*
输出横向坐标
*/
void print_HB() {
int row = 0;
printf(" ");
for (row = 0; row < width; row++) {
printf ("%4d", row + 1);
}
printf("\n");
}
/*
输出横向框
*/
void print_HXK() {
int col = 0;
printf(" +");
for (col = 0; col < width * 2; col++) {
if(!((col + 1) % 2)){
printf("+");
}
else {
printf("---");
}
}
printf("\n");
}
/*
显示盘
*/
void show_map(char panel[][width]){
int row = 0, col = 0;
print_HB();
print_HXK();
for (row = 0; row < width; row++) {
printf("%2d ", row + 1); //输出竖向坐标
printf("| ");
for (col = 0; col < width; col++) {
printf("%c ", panel[row][col]);
printf("| ");
}
printf("%d\n", row + 1); //输出竖向坐标
print_HXK(); //横向框
}
print_HB();
}
/*
初始化盘
*/
void init_map(int num, char panel[][width], char panel2[][width]) {
int i = 0, row = 0, col = 0;
for (row = 0; row < width; row++) {
for(col = 0; col < width; col++) {
panel[row][col] = ' ';
panel2[row][col] = ' ';
}
}
for (i = 0; i < num; i++) {
row = rand() % width;
col = rand() % width;
if (panel[row][col] == '*') {
i--;
}
else {
panel[row][col] = '*';
}
}
}
/*
根据布置好的雷计算雷周围的数字
*/
void fillNumber(char panel[][width]) { //填充数字
int row = 0, col = 0;
for (row = 0; row < width; row++) {
for (col = 0; col < width; col++) {
int num = 0;
//如果是雷,则不需要计算该位置周围的雷数,继续循环即可
if (panel[row][col] == '*') continue;
if ((row -1) >= 0 && (col - 1) >= 0) { //检测左上角是否在盘内
if (panel[row - 1][col -1] == '*') num++;//检测左上角是雷,则num加1
}
if ((row - 1) >= 0) { //正上方
if (panel[row - 1][col] == '*') num++;
}
if ((row - 1) >= 0 && (col + 1) < width) { //右上角
if (panel[row - 1][col + 1] == '*') num++;
}
if ((col -1) >= 0) { //左边
if (panel[row][col - 1] == '*') num++;
}
if ((col + 1) < width) { //右边
if (panel[row][col + 1] == '*') num++;
}
if ((row + 1) < width && (col -1) >= 0) { //左下角
if (panel[row + 1][col - 1] == '*') num++;
}
if ((row + 1) < width) { //正下方
if (panel[row + 1][col] == '*') num++;
}
if ((row + 1) < width && (col + 1) < width) { //右下角
if (panel[row + 1][col + 1] == '*') num++;
}
panel[row][col] = '0' + num; //将计算出的周围的雷数整型转换成字符型,并赋值
}
}
}
/*
点到0,显示多个数字
*/
void show_mul(char panel[][width], int row, int col,char panel2[][width]) {
panel2[row][col] = panel[row][col]; //显示数字
if ((row - 1) >= 0 && (col - 1) >= 0) { //检测[左上角]是否在盘内
//如果[左上角]依旧是0并且panel2相应的位置还为空,则以[左上角]为中心继续显示多个数字
if (panel[row - 1][col - 1] == '0' && panel2[row - 1][col - 1] == ' ')
show_mul(panel, row - 1, col - 1, panel2);
else panel2[row -1][col - 1] = panel[row - 1][col - 1];
}
if ((row - 1) >= 0) { //正上方
if (panel[row - 1][col] == '0' && panel2[row -1][col] == ' ')
show_mul(panel, row - 1, col, panel2);
else panel2[row - 1][col] = panel[row - 1][col];
}
if ((row - 1) >= 0 && (col + 1) < width) { //右上角
if (panel[row - 1][col + 1] == '0' && panel2[row - 1][col + 1] == ' ')
show_mul(panel, row - 1, col + 1, panel2);
else panel2[row - 1][col + 1] = panel[row - 1][col + 1];
}
if ((col - 1) >= 0) { //左边
if (panel[row][col - 1] == '0' && panel2[row][col - 1] == ' ')
show_mul(panel, row, col - 1, panel2);
else panel2[row][col -1] = panel[row][col -1];
}
if ((col + 1) < width) {//右边
if (panel[row][col + 1] == '0' && panel2[row][col + 1])
show_mul(panel, row, col + 1, panel2);
else panel2[row][col + 1] = panel[row][col + 1];
}
if ((row + 1) < width && (col - 1) >= 0) { //左下角
if (panel[row + 1][col - 1] == '0' && panel2[row + 1][col - 1] == ' ')
show_mul(panel, row + 1, col - 1, panel2);
else panel2[row + 1][col - 1] = panel[row + 1][col - 1];
}
if ((row + 1) < width) { //正下方
if (panel[row + 1][col] == '0' && panel2[row + 1][col] == ' ')
show_mul(panel, row + 1, col, panel2);
else panel2[row + 1][col] = panel[row + 1][col];
}
if ((row + 1) < width && (col + 1) < width) { //右下角
if (panel[row + 1][col + 1] == '0' && panel2[row + 1][col + 1] == ' ')
show_mul(panel, row + 1, col + 1, panel2);
else panel2[row + 1][col + 1] = panel[row + 1][col + 1];
}
}
/*
找雷
*/
int find(char panel[][width], int row, int col, int flag, char panel2[][width]) {
if (flag == 1) { //猜测是雷
panel2[row][col] = 'D';
if (panel[row][col] == '*') {
return 1;
}
else {
return 0;
}
}
else { //猜测不是雷
if (panel[row][col] == '*') { //点到雷,游戏失败
return 2;
}
else if (panel[row][col] == '0') { //点击到0,显示多个数字
show_mul(panel, row, col, panel2);
return 0;
}
else {
panel2[row][col] = panel[row][col];//显示数字
return 0;
}
}
}
/*
主函数
*/
int main() {
srand(time(0));
printf("width =? "); //设定盘大小
scanf("%d", &width);
printf("the number of trap is?"); //设置要布置雷的个数
int num;
scanf("%d", &num);
char panel[width][width];
char panel2[width][width];
int row = 0, col = 0, flag = 0;
while (1) {
init_map(num, panel, panel2); //初始化panel,panel2
fillNumber(panel); //填充雷周围的数字
//show_map(panel);
show_map(panel2); //显示空盘
int i = 0;
for (i = 0; i < num; i++) {
printf("请输入行号和列号以及是否是雷(1代表是,0代表不是):");
scanf("%d%d%d", &row, &col, &flag);
int b = find(panel, row - 1, col - 1, flag, panel2);
if (b == 2){ //点到雷
break;
}
else if (b){ //找到雷
system("clear");
show_map(panel2);
continue;
}
i--;
system("clear");
show_map(panel2); //显示盘
}
if (i < num) { //点到雷
printf("点到雷了,游戏结束\n");
}
else { //找到了全部的雷
printf("恭喜你,你赢了!!\n");
}
int iscontinue = 0;
printf("是否开始新的游戏(1代表YES,0代表NO)?");
scanf("%d", &iscontinue);
if (!iscontinue) break;
}
printf("拜拜,欢迎下次再来玩!!\n");
return 0;
}
以前自己写的,仅供参考