还记得上初中那会,上信息课都在电脑上玩的扫雷吗?那时候只会玩,不知道怎么实现,现在有了这个能力,也写了一个,虽然很糙,但还是能凑合玩的。
废话不多说,直接上代码
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __GAME_H__
#define __GAME_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define MAX 10
#define ROWS 11
#define COLS 11
#define ROWS1 15
#define COLS1 15
#define ROWS2 20
#define COLS2 20
#define ROW (ROWS-2)
#define COL (COLS-2)
void init_board(char mine[ROWS][COLS],char set,int row,int col);//初始化棋盘和坐标
void set_mine(char mine[ROWS][COLS]);//随机步雷阵
void display(char mine[ROWS][COLS],int row,int col);//打印棋盘1、雷阵棋盘 2、玩家棋盘
void get_mine_count(char mine[ROWS][COLS],char show[ROWS][COLS],int x,int y,int* temp);//检查坐标周围有几个雷
#endif
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void init_board (char mine[ROWS][COLS],char set,int row,int col)
{
memset(mine,set,row*col*sizeof(mine[0][0])); //给初始化棋盘分配需要的内存
}
void set_mine(char mine[ROWS][COLS])
{
int x = 0;
int y = 0;
int count = MAX;
srand((unsigned int)time(NULL));
while(count)
{
x = rand()%9+1;
y = rand()%9+1;
if(mine[x][y]=='0')
{
mine[x][y]='1';
count--; //当步了一个雷后,雷数减一
}
}
}
void display(char mine[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
printf(" ");
for(i=1; i<=ROW ;i++)
{printf(" %2d ",i);}
printf("\n");
for(j=1; j<=ROW; j++)
{
printf("%2d ",j);
for(i=1; i<=COL; i++)
{
printf(" %2c ",mine[j][i]);
}
printf("\n");
}
}
void get_mine_count(char mine[ROWS][COLS],char show[ROWS][COLS],int x,int y,int* temp) //用递归的思想解决周围为0展开的问题
{
int ret=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]
+mine[x-1][y]-7*'0'; //-7*‘0’是剩下一个字符'1'或'0'然后加上一个数字,最后返回的是数字字符(即这个坐标周围的雷数)
(*temp)++; //将count++,直到判断为赢
if(ret=='0')
{
show[x][y] = ' ';
if((x-1>0)&&(y-1>0)&&show[x-1][y-1]=='*')
get_mine_count(mine,show,x-1,y-1,temp);
if((y-1>0)&&show[x][y-1]=='*')
get_mine_count(mine,show,x,y-1,temp);
if((x+1<10)&&(y-1>0)&&show[x+1][y-1]=='*')
get_mine_count(mine,show,x+1,y-1,temp);
if((x+1<10)&&show[x+1][y]=='*')
get_mine_count(mine,show,x+1,y,temp);
if((x+1<10)&&(y+1<10)&&show[x+1][y+1]=='*')
get_mine_count(mine,show,x+1,y+1,temp);
if((y+1<10)&&show[x][y+1]=='*')
get_mine_count(mine,show,x,y+1,temp);
if((x-1>0)&&(y+1<10)&&show[x-1][y+1]=='*')
get_mine_count(mine,show,x-1,y+1,temp);
if((x-1>0)&&show[x-1][y]=='*')
get_mine_count(mine,show,x-1,y,temp);
}
else
show[x][y] = ret;
}
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void menu() { printf("***********************************\n"); printf("******* 1、PLAY 0、EXIT *******\n"); printf("***********************************\n"); } enum Option { EXIT, PLAY }; void game() { int ret = 0; int x = 0; int y = 0; int count = 0; char mine[ROWS][COLS]; char show[ROWS][COLS]; srand((unsigned int)time(NULL)); init_board(mine,'0',ROWS,COLS); //先初始一个雷盘,置为0 init_board(show,'*',ROWS,COLS); //初始化一个,展示给玩家一个全是*的棋盘 set_mine(mine); //将制作的雷随机放在棋盘上 //display(mine,ROWS,COLS); //如果展开的话,自己可以看雷在哪 display(show,ROWS,COLS); //先将棋盘展现出来 while(count<ROW*COL-MAX) //判断赢得条件,当点开的不是雷的数占了非雷的全部就算赢 { printf("请输入你要点的位置:>\n"); scanf("%d%d",&x,&y); if((x>=1&&x<=ROW)&&(y>=1&&y<=COL)) //要求下的位置要合法 { if(mine[x][y]!='1') { get_mine_count(mine,show,x,y,&count); display(show,ROWS,COLS); } else { printf("你被炸死了\n"); display(mine,ROWS,COLS); break; } } else { printf("输入有误,请重新输入:>\n"); } } if(count==ROW*COL-MAX) { printf("恭喜你,成功\n"); display(mine,ROWS,COLS); } } void test() { int input = 0; do { menu(); printf("请选择:>"); scanf("%d",&input); switch(input) { case PLAY: game(); break; case EXIT: break; } }while(input); } int main() { test(); return 0; }
你可以把代码贴上去玩一下了!