C语言写的,花了一天时间,一次只能翻一张,就这样吧
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
typedef struct saolei
{
//宽度
char lei[17][17];
//
char lei1[256][10];
//翻牌之后的状态
char leih[256][10];
//难度
// 9*9
//16*16;
//16*30;
int nan[3];
//雷的数量
int leis[3];
}SL;
typedef struct xy
{
int a;
int b;
}XY;
SL P;
XY Xy;
/*设置颜色*/
void set_color(int color)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}
/*移动光标位置*/
void gotoxy(int x, int y)
{
HANDLE hout;
COORD pos;
pos.X = x;
pos.Y = y;
hout = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hout, pos);
}
//选择难度
int print()
{
int a;
printf("欢迎来到扫雷!请选择难度:\n");
printf("1、简单\n2、困难\n0、退出程序\n");
scanf("%d",&a);
return a;
}
//随机生成雷
void xialei(int kk,int s)
{
int i,j,k=0;
while(1)
{
i=rand()%kk;
j=rand()%kk;
//*为地雷
if(P.lei[i][j]!='*')
{
k++;
P.lei[i][j]='*';
}
if(k==s)
break;
}
}
/*隐藏光标*/
void show_cursor(int hide)
{
CONSOLE_CURSOR_INFO cciCursor;
HANDLE hout;
hout = GetStdHandle(STD_OUTPUT_HANDLE);
if(GetConsoleCursorInfo(hout, &cciCursor))
{
cciCursor.bVisible = hide;
SetConsoleCursorInfo(hout, &cciCursor);
}
}
//计算除了雷的数字
jisuan(int kk,int s)
{
int i,j;
for(i=0;i<kk;i++)
{
for(j=0;j<kk;j++)
{ //左上角
if(i==0&&j==0&&P.lei[i][j]!='*')
{
if(P.lei[i][j+1]=='*')
P.lei[i][j]++;
if(P.lei[i+1][j+1]=='*')
P.lei[i][j]++;
if(P.lei[i+1][j]=='*')
P.lei[i][j]++;
}
//上边界
if(i==0&&j!=0&&P.lei[i][j]!='*'&&j!=kk-1)
{
if(P.lei[i][j+1]=='*')
P.lei[i][j]++;
if(P.lei[i+1][j+1]=='*')
P.lei[i][j]++;
if(P.lei[i+1][j]=='*')
P.lei[i][j]++;
if(P.lei[i+1][j-1]=='*')
P.lei[i][j]++;
if(P.lei[i][j-1]=='*')
P.lei[i][j]++;
}
//左边界
if(i!=0&&j==0&&P.lei[i][j]!='*'&&i!=kk-1)
{
if( P.lei[i-1][j]=='*')
P.lei[i][j]++;
if( P.lei[i-1][j+1]=='*')
P.lei[i][j]++;
if(P.lei[i][j+1]=='*')
P.lei[i][j]++;
if(P.lei[i+1][j+1]=='*')
P.lei[i][j]++;
if(P.lei[i+1][j]=='*')
P.lei[i][j]++;
}
//左下角
if(i==kk-1&&j==0&&P.lei[i][j]!='*')
{
if(P.lei[i-1][j]=='*')
P.lei[i][j]++;
if(P.lei[i-1][j+1]=='*')
P.lei[i][j]++;
if(P.lei[i][j+1]=='*')
P.lei[i][j]++;
}
//右上角
if(i==0&&j==kk-1&&P.lei[i][j]!='*')
{
if(P.lei[i][j-1]=='*')
P.lei[i][j]++;
if(P.lei[i+1][j-1]=='*')
P.lei[i][j]++;
if(P.lei[i+1][j]=='*')
P.lei[i][j]++;
}
//右下角
if(i==kk-1&&j==kk-1&&P.lei[i][j]!='*')
{
if(P.lei[i-1][j-1]=='*')
P. lei[i][j]++;
if(P.lei[i-1][j]=='*')
P.lei[i][j]++;
if(P.lei[i][j-1]=='*')
P. lei[i][j]++;
}
//右边界
if(j==kk-1&&i!=kk-1&&i!=0&&P.lei[i][j]!='*')
{
if(P.lei[i-1][j]=='*')
P. lei[i][j]++;
if(P.lei[i-1][j-1]=='*')
P.lei[i][j]++;
if(P.lei[i][j-1]=='*')
P. lei[i][j]++;
if(P.lei[i+1][j-1]=='*')
P. lei[i][j]++;
if(P.lei[i+1][j]=='*')
P.lei[i][j]++;
}
//下边界
if(i==kk-1&&j!=0&&j!=kk-1&&P.lei[i][j]!='*')
{
if(P.lei[i][j-1]=='*')
P.lei[i][j]++;
if(P.lei[i-1][j-1]=='*')
P.lei[i][j]++;
if(P.lei[i-1][j]=='*')
P.lei[i][j]++;
if(P.lei[i-1][j+1]=='*')
P.lei[i][j]++;
if(P.lei[i][j+1]=='*')
P.lei[i][j]++;
}
//中间
if(i!=0&&j!=0&&j!=kk-1&&i!=kk-1&&P.lei[i][j]!='*')
{
if(P.lei[i-1][j-1]=='*')
P.lei[i][j]++;
if(P.lei[i-1][j]=='*')
P.lei[i][j]++;
if(P.lei[i-1][j+1]=='*')
P.lei[i][j]++;
if(P.lei[i][j+1]=='*')
P.lei[i][j]++;
if(P.lei[i+1][j+1]=='*')
P.lei[i][j]++;
if(P.lei[i+1][j]=='*')
P.lei[i][j]++;
if(P.lei[i+1][j-1]=='*')
P.lei[i][j]++;
if(P.lei[i][j-1]=='*')
P.lei[i][j]++;
}
}
}
}
//weizhi
weizhi(int flag,int kk)
{
switch(flag)
{
case 1:if(Xy.a >0){Xy.a--;}break;
case 2:if(Xy.b >0){Xy.b--;}break;
case 3:if(Xy.b <kk-1){Xy.b++;}break;
case 4:if(Xy.a <kk-1){Xy.a++;}break;
}
}
siwang(int kk,int s,int i,int j)
{
int a,b;
for(a=0;a<kk;a++)
{
for(b=0;b<kk;b++)
{
if(P.lei1 [a][b] == '*')
{
set_color(4);
printf("%c ",P.lei [a][b]);
set_color(7);
}
if(P.lei1 [a][b]!='*')
{
set_color(0xA);
printf("%c ",P.lei [a][b]);
set_color(7);
}
}
printf("\n");
}
}
//打印地图
int ditu( int kk,int s)
{
int ic;
int a,b,flag;
int i,j,k=1,t=1;
char chh;
char cha[4];
char ch;
show_cursor(0);
for(i=0;i<kk;i++)
for(j=0;j<kk;j++)
{
P.lei[i][j] = '0';
}
xialei(kk, s);
jisuan(kk, s);
for(i=0;i<kk*kk;i++)
strcpy(P.lei1[i],"■");
system("cls");
Xy.a=0;
Xy.b=0;
while(1)
{
for(i=0;i<kk*kk;i++)
{
if((Xy.a*kk+Xy.b )==i)
{
set_color(3);
printf("%s",P.lei1[i] );
set_color(7);
k++;
}
else
{
set_color(0xC);
printf("%s",P.lei1[i] );
set_color(7);
k++;
}
if((k-1)%kk==0)
{
k=1;
printf("\n");
}
}
/* ********************* */
gotoxy(50,0);
printf("方向键控制!");
gotoxy(50,1);
printf("空格翻牌!\n");
/***********************************/
//翻牌
if(t==0)
{
for(i=0;i<kk;i++)
{
for(j=0;j<kk;j++)
{
if(i==Xy.a&&j==Xy.b)
{
if(P.lei [i][j]=='*')
{
gotoxy(kk+1,kk+1);
system("cls");
siwang(kk,s,i,j);
printf("你死了\n1、重新开始,0、退出游戏");
scanf("%d",&ic);
if(ic==0)
{
system("pause");
return 0;
}
else
return 1;
}
chh = P.lei[i][j];
cha[0]=chh;
cha[1] = ' ';
cha[2] ='\0';
strcpy(P.lei1[i*kk+j],cha);
}
}
}
}
t=1;
flag=0;
if((ch=getch())<0)
ch=getch();
switch(ch)
{
case 72:gotoxy(0,20); flag = 1; printf("\n你的按键为向上");break;
case 75:gotoxy(0,20); flag = 2; printf("\n你的按键为向左");break;
case 77:gotoxy(0,20); flag = 3; printf("\n你的按键为向右");break;
case 80:gotoxy(0,20); flag = 4; printf("\n你的按键为向下");break;
default:gotoxy(0,20); printf("\n按键不是方向键");t=0;break;
}
weizhi(flag,kk);
system("cls");
// kaishi(lei);
}
}
int main()
{
int t;
int de ;
P.nan [0]=9;
P.nan [1]=16;
P.leis [0]=10;
P.leis [1]=40;
P.leis [2]=99;
srand(time(NULL));
while(1)
{
t=1;
system("cls");
de =print();
switch(de)
{
case 0:return 0;break;
//简单
case 1:t=ditu(P.nan [0],P.leis [0]);break;
//困难
case 2:t=ditu(P.nan [1],P.leis [1]);break;
}
if(t==0)
break;
}
return 0;
}