导航:首页 > 源码编译 > c扫雷算法

c扫雷算法

发布时间:2023-03-10 12:33:38

Ⅰ 扫雷怎么推理又怎么计算

1、推理方法:

扫雷中的1,2,3,4代表在这个数字周围的8个方块里有地雷的数量,如是一就代表有一个;二就代表有2个。

如:对一条未挖开的方块组成的边,如果它旁边的数字为“232”,则表示这三个数字旁边的三个方块都是地雷。

2、通常玩法是先乱点,点出一块较大的无雷区域,再根据无雷区域边上的数字判断地雷的位置测出去,在你确定有地雷的方块上点右键插上红棋。

把全部的地雷上都正确的插上红旗就可以赢。

3、计算方法就根据上述规则在游戏中自行尝试。由于每次开始游戏后的雷的位置不同,所以需要多进行游戏,多摸索,只要掌握游戏方法就可以找出所有雷了。

(1)c扫雷算法扩展阅读:

扫雷口诀

一:基本定式不要忘。

二:鼠标点击不要快。

三:就近猜雷把心横。

四:猜雷猜错不要悔。

五:碰上好局不要慌。

Ⅱ 如何用C语言编程 扫雷!~

俄罗斯方快http://topic.csdn.net/t/20051201/01/4429905.html
扫雷
#include<stdio.h>
#include<graphics.h>
#include<stdlib.h>
struct list
{
int x;
int y;
int num;
int bomb;
int wa;
};
struct list di[10][10];
int currentx=210;
int currenty=130;
void initxy(void)
{
int i,j;
for(i=0;i<=9;i++)
for(j=0;j<=9;j++)
{
di[j].x=i*20+200;
di[j].y=j*20+120;
di[j].wa=0;
di[j].bomb=0;
}
}

void initmu(void)
{
int i,j;
setcolor(2);
rectangle(200,120,400,320);
rectangle(190,110,410,330);
setfillstyle(8,14);
floodfill(191,111,2);
for(i=0;i<=9;i++)
for(j=0;j<=9;j++)
rectangle(di[j].x,di[j].y,di[j].x+19,di[j].y+19);
outtextxy(450,200,"press 'enter' to kick");
outtextxy(450,250,"press '\' to mark");
}

void randbomb(void)
{
int k;
int i,j;
randomize();
for(i=0;i<=9;i++)
for(j=0;j<=9;j++)
{
k=random(5);
if(k==2)
di[j].bomb=1;

}
}

void jisuan(void)
{
int k=0;
int i,j;
for(i=0;i<=9;i++)
for(j=0;j<=9;j++)
{
if(i&&j&&di[i-1][j-1].bomb)
k=k+1;
if(i&&di[i-1][j].bomb)
k=k+1;
if(j&&di[j-1].bomb)
k=k+1;
if(i<=8&&di[i+1][j].bomb)
k=k+1;
if(j<=8&&di[j+1].bomb)
k=k+1;
if(i<=8&&j<=8&&di[i+1][j+1].bomb)
k=k+1;
if(i&&j<=8&&di[i-1][j+1].bomb)
k=k+1;
if(i<=8&&j&&di[i+1][j-1].bomb)
k=k+1;
di[j].num=k;
k=0;
}
}

void xianbomb(void)
{
int i,j;
char biaoji[2];
char znum[2];
biaoji[0]=1;
biaoji[1]=NULL;
for(i=0;i<=9;i++)
for(j=0;j<=9;j++)
{
if(di[j].bomb==1)
outtextxy(di[j].x+2,di[j].y+2,biaoji);
else
{
itoa(di[j].num,znum,10);
setfillstyle(1,0);
bar(i*20+202,j*20+122,i*20+218,j*20+138);
outtextxy(i*20+202,j*20+122,znum);
}
}
}
void move(void)
{
int key;
key=bioskey(1);
if(key)
key=bioskey(0);

if(key==0x4800)
{
if(currenty>130)
{
setcolor(0);
circle(currentx,currenty,5);
currenty-=20;
setcolor(4);
circle(currentx,currenty,5);
}
else
{
setcolor(0);
circle(currentx,currenty,5);
currenty=310;
setcolor(4);
circle(currentx,currenty,5);
}
}
if(key==0x4b00)
{
if(currentx>210)
{
setcolor(0);
circle(currentx,currenty,5);
currentx-=20;
setcolor(4);
circle(currentx,currenty,5);
}
else
{
setcolor(0);
circle(currentx,currenty,5);
currentx=390;
setcolor(4);
circle(currentx,currenty,5);
}
}
if(key==0x4d00)
{
if(currentx<390)
{
setcolor(0);
circle(currentx,currenty,5);
currentx+=20;
setcolor(4);
circle(currentx,currenty,5);
}
else
{
setcolor(0);
circle(currentx,currenty,5);
currentx=210;
setcolor(4);
circle(currentx,currenty,5);
}
}
if(key==0x5000)
{
if(currenty<310)
{
setcolor(0);
circle(currentx,currenty,5);
currenty+=20;
setcolor(4);
circle(currentx,currenty,5);
}
else
{
setcolor(0);
circle(currentx,currenty,5);
currenty=130;
setcolor(4);
circle(currentx,currenty,5);
}
}
if(key==0x1c0d)
{
int i,j;
char snum[2];
snum[0]=NULL;
snum[1]=NULL;
i=(currentx-210)/20;
j=(currenty-130)/20;
if(di[j].bomb==1)
{
outtextxy(100,100,"game over");
xianbomb();
sleep(2);
exit(0);
}
if(di[j].bomb==0)
{
di[j].wa=1;
setfillstyle(1,0);
bar(currentx-8,currenty-8,currentx+8,currenty+8);
setcolor(15);
itoa(di[j].num,snum,10);
outtextxy(currentx-8,currenty-8,snum);
setcolor(4);
circle(currentx,currenty,5);
}
}
if(key==0x2b5c)
{
char biaoji[2];
biaoji[0]=1;
biaoji[1]=NULL;
setcolor(0);
bar(currentx-8,currenty-8,currentx+8,currenty+8);
setcolor(4);
outtextxy(currentx-8,currenty-8,biaoji);
circle(currentx,currenty,5);
}
}

void success(void)
{
int k=1;
int i,j;
for(i=0;i<=9;i++)
for(j=0;j<=9;j++)
if(di[j].bomb==0&&di[j].wa==0)
k=0;
if(k==1)
{
outtextxy(100,100,"success good");
xianbomb();
sleep(2);
exit(0);

}
}

void main(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"");
initxy();
initmu();
randbomb();
jisuan();
setcolor(4);
circle(210,130,5);
while(1)
{
move();
success();
}
}

Ⅲ 扫雷中布雷的算法

首先,你要先定义一个n*n的二维数组,该数组的i-1到i+1,j-1到j+1除去i,j本身。值为周围有几个雷。如果该数组的值为10则本身是雷。
接着,你自动生成m个雷,让这m个雷分布在界面上。被选中的值i,j点的值为10,从i-1到i+1,从j-1到j+1的值都+1;
第三,在界面上想办法区分出n*n个格子,然后把格子的坐标和二维数组关联起来

Ⅳ C语言扫雷游戏源代码

"扫雷"小游戏C代码

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
main( )
{char a[102][102],b[102][102],c[102][102],w;
int i,j; /*循环变量*/
int x,y,z[999]; /*雷的位置*/
int t,s; /*标记*/
int m,n,lei; /*计数*/
int u,v; /*输入*/
int hang,lie,ge,mo; /*自定义变量*/
srand((int)time(NULL)); /*启动随机数发生器*/
leb1: /*选择模式*/
printf(" 请选择模式: 1.标准 2.自定义 ");
scanf("%d",&mo);
if(mo==2) /*若选择自定义模式,要输入三个参数*/
{do
{t=0; printf("请输入 行数 列数 雷的个数 ");
scanf("%d%d%d",&hang,&lie,&ge);
if(hang<2){printf("行数太少 "); t=1;}
if(hang>100){printf("行数太多 ");t=1;}
if(lie<2){printf("列数太少 ");t=1;}
if(lie>100){printf("列数太多 ");t=1;}
if(ge<1){printf("至少要有一个雷 ");t=1;}
if(ge>=(hang*lie)){printf("雷太多了 ");t=1;}
}while(t==1);
}
else{hang=10,lie=10,ge=10;} /*否则就是选择了标准模式(默认参数)*/
for(i=1;i<=ge;i=i+1) /*确定雷的位置*/
{do
{t=0; z[i]=rand( )%(hang*lie);
for(j=1;j<i;j=j+1){if(z[i]==z[j]) t=1;}
}while(t==1);
}
for(i=0;i<=hang+1;i=i+1) /*初始化a,b,c*/
{for(j=0;j<=lie+1;j=j+1) {a[i][j]='1'; b[i][j]='1'; c[i][j]='0';} }
for(i=1;i<=hang;i=i+1)
{for(j=1;j<=lie;j=j+1) {a[i][j]='+';} }
for(i=1;i<=ge;i=i+1) /*把雷放入c*/
{x=z[i]/lie+1; y=z[i]%lie+1; c[x][y]='#';}
for(i=1;i<=hang;i=i+1) /*计算b中数字*/
{for(j=1;j<=lie;j=j+1)
{m=48;
if(c[i-1][j-1]=='#')m=m+1; if(c[i][j-1]=='#')m=m+1;
if(c[i-1][j]=='#')m=m+1; if(c[i+1][j+1]=='#')m=m+1;
if(c[i][j+1]=='#')m=m+1; if(c[i+1][j]=='#')m=m+1;
if(c[i+1][j-1]=='#')m=m+1; if(c[i-1][j+1]=='#')m=m+1;
b[i][j]=m;
}
}
for(i=1;i<=ge;i=i+1) /*把雷放入b中*/
{x=z[i]/lie+1; y=z[i]%lie+1; b[x][y]='#';}

lei=ge; /*以下是游戏设计*/
do
{leb2: /*输出*/
system("cls");printf(" ");

printf(" ");
for(i=1;i<=lie;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c ",w);
}
printf(" |");
for(i=1;i<=lie;i=i+1){printf("---|");}
printf(" ");
for(i=1;i<=hang;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c |",w);
for(j=1;j<=lie;j=j+1)
{if(a[i][j]=='0')printf(" |");
else printf(" %c |",a[i][j]);
}
if(i==2)printf(" 剩余雷个数");
if(i==3)printf(" %d",lei);
printf(" |");
for(j=1;j<=lie;j=j+1){printf("---|");}
printf(" ");
}

scanf("%d%c%d",&u,&w,&v); /*输入*/
u=u+1,v=v+1;
if(w!='#'&&a[u][v]=='@')
goto leb2;
if(w=='#')
{if(a[u][v]=='+'){a[u][v]='@'; lei=lei-1;}
else if(a[u][v]=='@'){a[u][v]='?'; lei=lei+1;}
else if(a[u][v]=='?'){a[u][v]='+';}
goto leb2;
}
a[u][v]=b[u][v];

leb3: /*打开0区*/
t=0;
if(a[u][v]=='0')
{for(i=1;i<=hang;i=i+1)
{for(j=1;j<=lie;j=j+1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=1;i<=hang;i=i+1)
{for(j=lie;j>=1;j=j-1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=hang;i>=1;i=i-1)
{for(j=1;j<=lie;j=j+1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=hang;i>=1;i=i-1)
{for(j=lie;j>=1;j=j-1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1;if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}

for(i=1;i<=hang;i=i+1) /*检测0区*/
{for(j=1;j<=lie;j=j+1)
{if(a[i][j]=='0')
{if(a[i-1][j-1]=='+'||a[i-1][j-1]=='@'||a[i-1][j-1]=='?')t=1;
if(a[i-1][j+1]=='+'||a[i-1][j+1]=='@'||a[i-1][j+1]=='?')t=1;
if(a[i+1][j-1]=='+'||a[i+1][j-1]=='@'||a[i+1][j-1]=='?')t=1;
if(a[i+1][j+1]=='+'||a[i+1][j+1]=='@'||a[i+1][j+1]=='?')t=1;
if(a[i+1][j]=='+'||a[i+1][j]=='@'||a[i+1][j]=='?')t=1;
if(a[i][j+1]=='+'||a[i][j+1]=='@'||a[i][j+1]=='?')t=1;
if(a[i][j-1]=='+'||a[i][j-1]=='@'||a[i][j-1]=='?')t=1;
if(a[i-1][j]=='+'||a[i-1][j]=='@'||a[i-1][j]=='?')t=1;
}
}
}
if(t==1)goto leb3;
}

n=0; /*检查结束*/
for(i=1;i<=hang;i=i+1)
{for(j=1;j<=lie;j=j+1)
{if(a[i][j]!='+'&&a[i][j]!='@'&&a[i][j]!='?')n=n+1;}
}
}
while(a[u][v]!='#'&&n!=(hang*lie-ge));

for(i=1;i<=ge;i=i+1) /*游戏结束*/
{x=z[i]/lie+1; y=z[i]%lie+1; a[x][y]='#'; }
printf(" ");
for(i=1;i<=lie;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c ",w);
}
printf(" |");
for(i=1;i<=lie;i=i+1){printf("---|");}
printf(" ");
for(i=1;i<=hang;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c |",w);
for(j=1;j<=lie;j=j+1)
{if(a[i][j]=='0')printf(" |");
else printf(" %c |",a[i][j]);
}
if(i==2)printf(" 剩余雷个数");
if(i==3)printf(" %d",lei); printf(" |");
for(j=1;j<=lie;j=j+1) {printf("---|");}
printf(" ");
}
if(n==(hang*lie-ge)) printf("你成功了! ");
else printf(" 游戏结束! ");
printf(" 重玩请输入1 ");
t=0;
scanf("%d",&t);
if(t==1)goto leb1;
}

/*注:在DEV c++上运行通过。行号和列号都从0开始,比如要确定第0行第9列不是“雷”,就在0和9中间加入一个字母,可以输入【0a9】三个字符再按回车键。3行7列不是雷,则输入【3a7】回车;第8行第5列是雷,就输入【8#5】回车,9行0列是雷则输入【9#0】并回车*/

阅读全文

与c扫雷算法相关的资料

热点内容
喷油螺杆制冷压缩机 浏览:579
python员工信息登记表 浏览:377
高中美术pdf 浏览:161
java实现排列 浏览:513
javavector的用法 浏览:982
osi实现加密的三层 浏览:233
大众宝来原厂中控如何安装app 浏览:916
linux内核根文件系统 浏览:243
3d的命令面板不见了 浏览:526
武汉理工大学服务器ip地址 浏览:149
亚马逊云服务器登录 浏览:525
安卓手机如何进行文件处理 浏览:71
mysql执行系统命令 浏览:930
php支持curlhttps 浏览:143
新预算法责任 浏览:444
服务器如何处理5万人同时在线 浏览:251
哈夫曼编码数据压缩 浏览:426
锁定服务器是什么意思 浏览:385
场景检测算法 浏览:617
解压手机软件触屏 浏览:350