C语言学习记录——십오 扫雷

game.h

#define ROW 9

#define COL 9

#define ROWS ROW + 2

#define COLS COL + 2

#define EASY_COUNT 80

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);

void DisplayBoard(char board[ROWS][COLS], int row, int col);

void SetMine(char board[ROWS][COLS], int row, int col);

void FindMine(char mine[ROW3][COL3], char show[ROWS][COLS], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)

{

    int i = 0;

    int j = 0;

    for(i = 0; i < row; i++)

    {

        for(j = 0;j < col; j++)

        {

            board[i][j] = '0';

        }

    }

}

void DisplayBoard(char board[ROWS][COLS], int row, int col)

{

    int i = 0;

    int j = 0;

    //打印列号

    for(i = 0 ; i <= col; i++)

    {

        printf("%d ", i);

    }

    printf("\n");

    for(i = 1; i <= row; i++)

    {

        printf("%d ", i);

        for(j = 1; j <= col; j++)

        {

            printf("%c ", board[i][j])

        }

        printf("\n");

    }

}

void SetMine(char board[ROW][COL], int row, int col)

{

    int  count = EASY_COUNT;

    while(count)

    {

        int x = rand() % row + 1;

        int y = rand() % col + 1;

        if(board[x][y] == '0')

        {

            board[x][y] = '1';

            count--;

        }  

    }

}

int get_mine_count(char mine[ROWS][COLS], int x, int y)

{

    return mine[x - 1][y] +

    mine[x - 1][y - 1] +

    mine[x][y - 1] +

    mine[x + 1][y - 1] +

    mine[x +1][y] +

    mine[x + 1][y + 1] +

    mine[x][y + 1] +

    mine[x -1][y + 1] - 8 * '0';

}

void FindMine(char mine[ROW3][COL3], char show[ROWS][COLS], int row, int col)

{

    int x = 0;

    int y = 0;

    int win = 0;

    //9*9 - 10=71.排完所有雷要结束游戏

    while(win < row * col - EASY_COUNT)

    {

        printf("请输入排查雷的坐标: >");

        scanf("%d%d", &x, &y);

        if(x >= 1 && x <= row && y >= 1 && y <= col)

        {

            //坐标合法

            //踩雷或不是雷

            if(mine[x][y] == '1')

            {

                printf("很遗憾,你被炸死了\n");

                DisplayBoard(mine, row, col);

                break;

            }

            else

            {

                //计算x,y周围几个雷,引入一个函数,定义

                int count = get_mine_count(mine, x, y);

                show[x][y] = count + '0';

                DisplayBoard(show, row, col);

                win++;

            }

        }

        else

        {

            printf("输入坐标非法,请重新输入!\n");

        }

    }

    if(win == row*col - EASY_COUNT)

    {

        printf("排雷成功\n");

        DisplayBoard(mine, row, col);

    }

}

test.c

#include "game.h"

void menu()

{

    printf("**************************************\n");

    printf("********* 1. play   0. exit **********\n");

    printf("**************************************\n");

}

void game()

{

  char mine[ROWS][COLS] = { 0 }; //布置好的雷的信息

  char show[ROWS][COLS] = { 0 }; //排查出的雷的信息

  InitBoard(mine, ROWS, COLS, '0'); //初始化数组

  InitBoard(show, ROWS, COLS, '*')

  //DisplayBoard(mine, ROW, COL); 打印棋盘

  DisplayBoard(mine, ROW, COL);

  //布置雷

  SetMine(mine, ROW, COL);

  //DisplayBoard(mine, ROW, COL);

  //扫雷,排查雷

  FindMine(mine, show, ROW, COL);


 

}

void test()

{

    int input = 0;

    srand((unsigned int)time(NULL));

   

    do

    {

        menu();

        printf("请选择: >");

        scanf("%d", &input);

        switch(input)

        {

            case 1:

            game();

            break;

            case 0:

            printf("退出游戏\n");

            break;

            default:

            printf("选择错误,重新选择!\n");

            break;

        }    

    } while (input);

}

int main()

{

    test();

    return 0;

}

结束。

上一篇:python使用xlrd,xlwt,xlutils读写文件


下一篇:考试用资料