第一次发博客,请大家批评指正!
我的这段“扫雷”代码有两个特点:一是没有把数组扩大(把9*9扩大到11*11),而是用了
if(i>.=0 && i<=8)和if(k>=0 && k<=8)两个条件约束,这样也可以方便的统计到指定坐标周边雷的数量;二是统计指定坐标周边雷的数量时,用的是遍历的方法,这样显得更聪明一点。
test.c
#include "game.h"
int main()
{
int input = 0;
int get = 0;
int isexit = 0;
srand((unsigned int)time(NULL));
while (1)
{
menu();
printf("请输入你的选择:\n");
if((get=scanf("%d",&input))==1)
{
switch (input)
{
case 1:
game();
printf("还想玩吗?\n");
break;
case 0:
printf("再见!\n");
isexit = 1;
break;
default:
printf("输入有误,请输入\"1\"或者\"0\"!\n");
break;
}
}
else
{
printf("输入有误,请输入\"1\"或者\"0\"!\n");
}
if (1 == isexit)
break;
clear();
}
}
game.c
#include "game.h"
void menu()
{
printf("******************************************\n");
printf("***** 1.Play 0.Exit *****\n");
printf("******************************************\n");
}
void clear()//消除掉误输入字母或汉字时产生的换行符\n
{
while (getchar() != '\n')
continue;
}
void game()
{
char board1[ROW][COL] = { 0 };//一开始只用一个数组,后来在显示棋盘的时候发现行不通,因为会把雷的位置也显示出来
char board2[ROW][COL] = { 0 };
InitBoard(board1, ROW, COL, 'M');//初始化棋盘
InitBoard(board2, ROW, COL, ' ');//初始化雷
PrintBoard(board1, ROW, COL);//显示棋盘
PlaseMine(board2, ROW, COL);//埋雷
GuessMine(board1,board2, ROW, COL);//扫雷
}
void InitBoard(char board[ROW][COL], int x, int y, char ch)//初始化棋盘数组和埋雷数组
{
int i = 0;
int k = 0;
for (i = 0; i < x; i++)
for (k = 0; k < y; k++)
board[i][k] = ch;
}
void PrintBoard(char board[ROW][COL], int x, int y)//打印数组
{
int i = 0;
int k = 0;
for (i = 0; i < x; i++)
{
if (0 == i)
printf(" ");//在第一行和第一列的交汇处打印两个空格
printf("%d ", i);//打印纵坐标
}
putchar('\n');
for (i = 0; i < x; i++)
{
printf("%d ", i);//打印横坐标
for (k = 0; k < y; k++)
{
printf("%c ", board[i][k]);
}
putchar('\n');
}
}
void PlaseMine(char board2[ROW][COL], int x, int y)//埋雷
{
int i = 0;
int k = 0;
int count = 0;
while (count < COUNT)
{
i = rand() % x;
k = rand() % y;
if (board2[i][k] != 'M')
{
board2[i][k] = 'M';
count++;
}
}
}
void GuessMine(char board1[ROW][COL], char board2[ROW][COL], int x, int y)
{
int i = 0;
int k = 0;
int get = 0;
int ret1 = 0;
int ret2 = 0;
while (1)
{
ret2 = IsWin(board1, ROW, COL);
printf("总共有%d个雷,还剩%d个地点没有排查。\n", COUNT, ret2);
printf("请输入不是雷的坐标(必须是0-8之间的两个数):\n");
if ((get = scanf("%d%d", &i, &k)) == 2)
{
if (i >= 0 && i <= x - 1 && k >= 0 && k <= y - 1)
{
if ('M' == board2[i][k])
{
printf("你踩到雷啦!再见!\n");
printf("雷的分布如下:\n");
PrintBoard(board2, ROW, COL);
break;
}
else
{
ret1 = RoundChoice(board1, board2, i, k);
if (0 == ret1)
{
board1[i][k] = ' ';
recursion(board1, board2, i, k);//若坐标本身及周围无雷时,用递归方法显示坐标周围情况
}
else
board1[i][k] = ret1 + '0';
PrintBoard(board1, ROW, COL);
ret2 = IsWin(board1, ROW, COL);
if (COUNT == ret2)
{
printf("你赢啦!\n");
break;
}
}
}
else
printf("输入错误,必须是0-8之间的两个数\n");
}
clear();
}
}
int IsWin(char board1[ROW][COL], int x, int y)//计算还剩多少个位置没有排查
{
int i = 0;
int k = 0;
int count = 0;
for (i = 0; i < x; i++)
for (k = 0; k < y; k++)
if ('M' == board1[i][k])
count++;
return count;
}
int RoundChoice(char board1[ROW][COL], char board2[ROW][COL], int x, int y)//统计坐标周围雷的数量
{
int i = 0;
int k = 0;
int count = 0;
for (i = x - 1; i <= x + 1; i++)
{
if (i >= 0 && i <= 8)
{
for (k = y - 1; k <= y + 1; k++)
{
if (k >= 0 && k <= 8)
{
if ('M' == board2[i][k])
count++;
}
else
continue;
}
}
else
continue;
}
return count;
}
void recursion(char board1[ROW][COL], char board2[ROW][COL], int x, int y)
{
int i = 0;
int k = 0;
int ret = 0;
for (i = x - 1; i <= x + 1; i++)
{
if (i >= 0 && i <= 8)
{
for (k = y - 1; k <= y + 1; k++)
{
if (k >= 0 && k <= 8)
{
if (i == x && k == y)//避免陷入死循环
continue;
if (' ' == board1[i][k])//避免重复修改
continue;
else
{
ret = RoundChoice(board1, board2, i, k);
if (0 == ret)
{
board1[i][k] = ' ';//若坐标周围无雷,先把坐标上的值改为空格,然后再递归
recursion(board1, board2, i, k);
}
else
{
board1[i][k] = ret + '0';//若坐标周围有雷,只修改坐标上的值为坐标周围雷的数量
continue;
}
}
}
else
continue;
}
}
else
continue;
}
}
game.h
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
#define ROW 9
#define COL 9
#define COUNT 10
void menu();
void game();
void clear();
void InitBoard(char board[ROW][COL], int x, int y, char ch);
void PrintBoard(char board[ROW][COL], int x, int y);
void PlaseMine(char board2[ROW][COL], int x, int y);
void GuessMine(char board1[ROW][COL], char board2[ROW][COL], int x, int y);
int RoundChoice(char board1[ROW][COL], char board2[ROW][COL],int x, int y);
void recursion(char board1[ROW][COL], char board2[ROW][COL], int x,int y);
int IsWin(char board1[ROW][COL], int x, int y);