C语言写的扫雷小程序

来源:互联网 发布:数据挖掘视频教程42讲 编辑:程序博客网 时间:2024/05/22 15:25

还记得上初中那会,上信息课都在电脑上玩的扫雷吗?那时候只会玩,不知道怎么实现,现在有了这个能力,也写了一个,虽然很糙,但还是能凑合玩的。


废话不多说,直接上代码

#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);}elseshow[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);//先初始一个雷盘,置为0init_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;}



你可以把代码贴上去玩一下了!

0 0
原创粉丝点击