C语言实现扫雷

作者: 修夏之夏i | 来源:发表于2018-04-05 22:12 被阅读0次

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;
}

相关文章

网友评论

    本文标题:C语言实现扫雷

    本文链接:https://www.haomeiwen.com/subject/vzodhftx.html