赞
踩
该程序实现了扫雷的基本功能,和上一篇三子棋一样,可以先写出扫雷实现的框架。它大致可以分为这么几部分:
1)初始化棋盘
2)显示棋盘
3)布雷
4)扫雷
其中扫雷部分可以再细化,该程序实现的功能有:
下面是程序部分
(使用两个二维数组,为了方便统计雷的个数,在显示的数组周围加了一圈,如图所示,在布雷时这一圈都置为0)
- #ifndef __GAME_H__
- #define __GAME_H__
-
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <time.h>
-
- #define ROW 10
- #define COL 10
-
- #define ROWS ROW+2
- #define COLS COL+2
-
- #define MINE_COUNT 99
-
- //初始化棋盘
- void InitBoard(char board[ROWS][COLS],int row,int col,char set);
-
- //显示棋盘
- void Display(char board[ROWS][COLS],int row,int col);
-
- //布雷
- void SetMine(char mine[ROWS][COLS],int row,int col,int num);
-
- //统计雷的个数
- char CountMine(char mine[ROWS][COLS],int x,int y);
-
- //展开周围不是雷的地方
- void OpenMine(char mine[ROWS][COLS],char board[ROWS][COLS],int x,int y);
-
- //判断剩余多少雷
- int CountBoard(char board[ROWS][COLS],int row,int col);
-
- //第一次下子,不会被炸死
- void SafeMine(char mine[ROWS][COLS],char board[ROWS][COLS],int row,int col);
-
- #endif //__GAME_H__

- #define _CRT_SECURE_NO_WARNINGS 1
-
- #include "game.h"
-
- //初始化棋盘
- void InitBoard(char board[ROWS][COLS],int row,int col,char set)
- {
- memset(board,set,row*col*sizeof(board[0][0]));
- }
-
- //显示棋盘
- void Display(char board[ROWS][COLS],int row,int col)
- {
- int i = 0;
- int j = 0;
- printf(" 1 2 3 4 5 6 7 8 9 10\n");
- for(i=1;i<row-1;i++)
- {
- printf("%2d ",i);
- for(j=1;j<col-1;j++)
- {
- printf(" %c",board[i][j]);
- }
- printf("\n");
- }
- printf("\n");
- }
-
- //布雷
- void SetMine(char mine[ROWS][COLS],int row,int col,int count)
- {
- int x = 0;
- int y = 0;
- while(count)
- {
- x = rand()%(row-2) + 1;
- y = rand()%(col-2) + 1;
- if(mine[x][y]=='0')
- {
- mine[x][y] = '1';
- count--;
- }
- }
- }
-
- //统计雷的个数
- char CountMine(char mine[ROWS][COLS],int x,int y)
- {
- return (mine[x-1][y-1]+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]-8*'0');
- }
-
- //展开周围不是雷的地方
- void OpenMine(char mine[ROWS][COLS],char board[ROWS][COLS],int x,int y)
- {
- if(mine[x-1][y-1] == '0')
- {
- board[x-1][y-1] = CountMine(mine,x-1,y-1) + '0';
- }
- if(mine[x-1][y] == '0')
- {
- board[x-1][y] = CountMine(mine,x-1,y) + '0';
- }
- if(mine[x-1][y+1] == '0')
- {
- board[x-1][y+1] = CountMine(mine,x-1,y+1) + '0';
- }
- if(mine[x][y+1] == '0')
- {
- board[x][y+1] = CountMine(mine,x,y+1) + '0';
- }
- if(mine[x+1][y+1] == '0')
- {
- board[x+1][y+1] = CountMine(mine,x+1,y+1) + '0';
- }
- if(mine[x+1][y] == '0')
- {
- board[x+1][y] = CountMine(mine,x+1,y) + '0';
- }
- if(mine[x+1][y-1] == '0')
- {
- board[x+1][y-1] = CountMine(mine,x+1,y-1) + '0';
- }
- if(mine[x][y-1] == '0')
- {
- board[x][y-1] = CountMine(mine,x,y-1) + '0';
- }
- }
-
- //判断剩余多少雷
- int CountBoard(char board[ROWS][COLS],int row,int col)
- {
- int i = 0;
- int j = 0;
- int count = 0;
- for(i=1;i<row-1;i++)
- {
- for(j=1;j<col-1;j++)
- {
- if(board[i][j] == '*')
- {
- count++;
- }
- }
- }
- return count;
- }
-
- //第一次下子,不会被炸死
- void SafeMine(char mine[ROWS][COLS],char board[ROWS][COLS],int row,int col)
- {
- while(1)
- {
- int x = 0;
- int y = 0;
- int num = 1;
- printf("请输入坐标:");
- scanf("%d%d",&x,&y);
- if((x>=1)&&(x<row-1)&&(y>=1)&&(y<col-1))
- {
- if(mine[x][y] == '1')//第一次踩雷,将雷移走
- {
- mine[x][y] = '0';
- board[x][y] = CountMine(mine,x,y) + '0';
- OpenMine(mine,board,x,y);
- Display(board,ROWS,COLS);
- SetMine(mine,ROWS,COLS,num);
- break;
- }
- else
- {
- if(mine[x][y] == '0')
- board[x][y] = CountMine(mine,x,y) + '0';
- OpenMine(mine,board,x,y);
- Display(board,ROWS,COLS);
- break;
- }
- }
- else
- {
- printf("坐标有误!\n");
- }
- }
- }

- #define _CRT_SECURE_NO_WARNINGS 1
-
- #include "game.h"
-
- void menu()
- {
- printf("**************************\n");
- printf("***** 1.play 0.exit *****\n");
- printf("**************************\n");
- }
-
- void game()
- {
- char board[ROWS][COLS] = {'0'};
- char mine[ROWS][COLS] = {'0'};
- int num = 0;
-
- //初始化棋盘和雷阵
- InitBoard(board,ROWS,COLS,'*');
- InitBoard(mine,ROWS,COLS,'0');
-
- //布雷
- SetMine(mine,ROWS,COLS,MINE_COUNT);
- Display(mine,ROWS,COLS);
- Display(board,ROWS,COLS);
-
- //排雷
- SafeMine(mine,board,ROWS,COLS);//防止第一次被炸死
- if(CountBoard(board,ROWS,COLS) == MINE_COUNT)//判断是不是一次就赢的情况
- {
- printf("恭喜你,排雷成功!\n");
- return;
- }
- Display(mine,ROWS,COLS);//如果第一次踩雷,显示转移后的雷阵
- Display(board,ROWS,COLS);
- while(1)
- {
- int x = 0;
- int y = 0;
- printf("请输入坐标:");
- scanf("%d%d",&x,&y);
- if((x>=1)&&(x<=ROW)&&(y>=1)&&(y<=COL))
- {
- if(mine[x][y] == '1')
- {
- printf("很遗憾,你被炸死!\n");
- return;
- }
- else
- {
- if(mine[x][y] == '0')
- board[x][y] = CountMine(mine,x,y) + '0';//如果是数字1,加上'0',就变成'1'
- OpenMine(mine,board,x,y);
- Display(board,ROWS,COLS);
- }
- }
- else
- {
- printf("坐标有误!\n");
- }
- if((num=CountBoard(board,ROWS,COLS))== MINE_COUNT)
- {
- printf("恭喜你,排雷成功!\n");
- Display(mine,ROWS,COLS);
- break;
- }
- }
- }
-
- void test()
- {
- int input = 0;
- srand((unsigned int)time(NULL));
- do
- {
- menu();
- printf("请选择:");
- scanf("%d",&input);
- switch(input)
- {
- case 0:
- printf("退出游戏\n");
- break;
- case 1:
- game();
- break;
- default:
- printf("输入错误\n");
- break;
- }
- }while(input);
- }
-
- int main()
- {
- test();
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。