扫雷

来源:互联网 发布:voip网络电话机 编辑:程序博客网 时间:2024/05/17 05:13

我们要模范小游戏扫雷,需要我们完成以下几点:

1、在Windows系统下,先玩几把扫雷游戏,想一想它是如何实现的。
2、通过观察游戏,我们可以想到需要用两个二维数组来实现扫雷的功能。
3、游戏刚开始,需要需要显示棋盘,用“*”遮盖雷的坐标,所以要有一个填充棋盘的函数。
4、通过rand()函数,随机生成雷的坐标,埋雷的函数。
5、每次扫过后,都要显示新的棋盘,显示棋盘的函数,同时显示该坐标周围雷的个数,并在该坐标上显示出来。
6、如果要想第一次踩不到雷的,需要把该坐标下得雷移动到其他不是雷的坐标。
7、最后需要一个函数判断是否扫雷成功。

game.h
宏函数的定义如下:

#ifndef  __GAME_H__#define  __GAME_H__#define ROWS 12#define COLS 12#define M 10void init_board(char board[ROWS][COLS],int rows,int cols,char ch);void lay_mine(char board[ROWS][COLS],int rows,int cols,int m);void dis_play(char board[ROWS][COLS],int rows,int clos);void one_input(char board1[ROWS][COLS],int x,int y,int count);int mine_count(char board1[ROWS][COLS],char board2[ROWS][COLS],int x,int y);int check_win(char board[ROWS][COLS],int rows,int clos);#endif//__GAME_H__

game.c
各个函数的功能实现代码
填充棋盘函数:

void init_board(char board[ROWS][COLS],int rows,int cols,char ch)    {    int i = 0;    int j = 0;    for(i = 0;i < rows;i++)    {        for(j = 0;j < cols;j++)            {            board[i][j] = ch;        }    }}

随机埋雷的函数:

void lay_mine(char board[ROWS][COLS],int rows,int cols,int m)   {    int i = 0;    while(i<m)    {        while(1)        {        int x = (rand()%(ROWS-2))+1;        int y = (rand()%(COLS-2))+1;        if(board[x][y] != '1')        {            board[x][y] = '1';            break;        }        }        i++;    }}

显示棋盘的函数:

void dis_play(char board[ROWS][COLS],int rows,int clos)    {    int i = 0;    int j = 0;    printf("   ");    for(i = 1;i<rows-1;i++)    {        printf("%3d",i);    }    printf("\n");    for(i = 0;i<rows-1;i++)    {        printf("---");    }    printf("\n");    for(i = 1;i < rows-1;i++)    {        printf("%2d|",i);        for(j = 1;j < clos-1;j++)        {            printf("%3c",board[i][j]);        }        printf("\n");    }}

第一次输入坐标,保证踩不到雷

void one_input(char board1[ROWS][COLS],int x,int y,int count)   {    int x1 = 0;    int y1 = 0;    if((count == 1)&&(board1[x][y] == '1'))                             {        while(1)        {         x1 = (rand()%(ROWS-2))+1;         y1 = (rand()%(COLS-2))+1;         if(board1[x1][y1] == '0')        //把雷移走         {             int tmp;             tmp = board1[x][y];             board1[x][y] = board1[x1][y1];             board1[x1][y1] = tmp;             break;         }        }    }}

计算该坐标周围雷的个数,判断是否踩到雷了

int mine_count(char board1[ROWS][COLS],char board2[ROWS][COLS],int x,int y)     //周围雷的个数{    if(board1[x][y] == '1')                 //踩到雷,返回‘b’    {        board2[x][y] = '1';        return 'b';    }    if(board1[x][y] == '0')    {        board2[x][y] = (board1[x-1][y-1] + board1[x-1][y] + board1[x-1][y+1] +                         board1[x][y-1]   + board1[x][y+1] +                         board1[x+1][y-1] + board1[x+1][y] + board1[x+1][y+1]) - (7*48) ;    }    return 1;}

判断输赢:

int check_win(char board1[ROWS][COLS],int rows,int cols)                 {    int i = 0;    int j = 0;    int m = 0;    for(i = 1;i <rows-1; i++)    {        for(j = 1;j <cols-1;j++)        {            if(board1[i][j] != '*')            {                m++;            }        }    }    if(m == (100-M))    {        return 'n';    }    return 1;}

test.c
main函数:

#include"game.h"#include<stdio.h>#include<stdlib.h>#include<time.h>void menu(){    printf("******************************\n");    printf("*****  1.paly    2.exit   ****\n");    printf("******************************\n");}void game(){    int count = 0;    int ret = 0;    int x = 0;    int y = 0;    char mine[ROWS][COLS] ;    char show[ROWS][COLS] ;    init_board(mine,ROWS,COLS,'0');     init_board(show,ROWS,COLS,'*');    lay_mine(mine,ROWS,COLS,M);    dis_play(show,ROWS,COLS);    dis_play(mine,ROWS,COLS);    while(1)    {        printf("请输入坐标:");        while(1)        {           scanf("%d %d",&x,&y);            if(((x>10)||(x<1))||((y>10)||(y<1)))           {              printf("输入坐标有误,请重新输入!\n");           }           else           {              count++;              break;           }       }       one_input(mine,x,y,count);              //第一次踩到雷不炸       //dis_play(mine,ROWS,COLS);       ret = mine_count(mine,show,x,y);       if(ret =='b')       {          break;       }       dis_play(show,ROWS,COLS);       ret = check_win(show,ROWS,COLS);       if(ret == 'n')       {           break;       }    }    if(ret == 'b')    {        printf("很遗憾,你被炸死了!\n");    }    if(ret == 'n')    {        printf("恭喜你,扫雷成功!\n");    }}int main(){    int input = 0;    srand((unsigned)time(NULL));    while(1)    {    menu();    printf("请选择:");    scanf("%d",&input);    switch(input)    {    case 1:        game();        break;    case 2:        return 0;        break;    default:        printf("选择错误,请重新选择:");        break;    }    }    system("pause");    return 0;}

测试代码如下
设置雷的个数为99,第一次不炸,把该坐标的雷移到不是雷额地方,扫雷成功
这里写图片描述

设置雷的个数为98,输入两次才能踩到雷,扫雷失败
这里写图片描述

以上代码基本实现了扫雷的功能,希望对大家的学习有所帮助。

原创粉丝点击