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

如何用C语言编程扫雷!~,第1张

俄罗斯方快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=0i<=9i++)

for(j=0j<=9j++)

{

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=0i<=9i++)

for(j=0j<=9j++)

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=0i<=9i++)

for(j=0j<=9j++)

{

k=random(5)

if(k==2)

di[j].bomb=1

}

}

void jisuan(void)

{

int k=0

int i,j

for(i=0i<=9i++)

for(j=0j<=9j++)

{

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=0i<=9i++)

for(j=0j<=9j++)

{

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=0i<=9i++)

for(j=0j<=9j++)

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()

}

}

用TC自己玩一下吧

/*5.3.4 源程序*/

#include <graphics.h>

#include <stdlib.h>

#include <dos.h>

#define LEFTPRESS 0xff01

#define LEFTCLICK 0xff10

#define LEFTDRAG 0xff19

#define MOUSEMOVE 0xff08

struct

{

int num/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/

int roundnum/*统计格子周围有多少雷*/

int flag/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/

}Mine[10][10]

int gameAGAIN=0/*是否重来的变量*/

int gamePLAY=0/*是否是第一次玩游戏的标志*/

int mineNUM/*统计处理过的格子数*/

char randmineNUM[3]/*显示数字的字符串*/

int Keystate

int MouseExist

int MouseButton

int MouseX

int MouseY

void Init(void)/*图形驱动*/

void MouseOn(void)/*鼠标光标显示*/

void MouseOff(void)/*鼠标光标隐藏*/

void MouseSetXY(int,int)/*设置当前位置*/

int LeftPress(void)/*左键按下*/

int RightPress(void)/*鼠标右键按下*/

void MouseGetXY(void)/*得到当前位置*/

void Control(void)/*游戏开始,重新,关闭*/

void GameBegain(void)/*游戏开始画面*/

void DrawSmile(void)/*画笑脸*/

void DrawRedflag(int,int)/*显示红旗*/

void DrawEmpty(int,int,int,int)/*两种空格子的显示*/

void GameOver(void)/*游戏结束*/

void GameWin(void)/*显示胜利*/

int MineStatistics(int,int)/*统计每个格子周围的雷数*/

int ShowWhite(int,int)/*显示无雷区的空白部分*/

void GamePlay(void)/*游戏过程*/

void Close(void)/*图形关闭*/

void main(void)

{

Init()

Control()

Close()

}

void Init(void)/*图形开始*/

{

int gd=DETECT,gm

initgraph(&gd,&gm,"c:\\tc")

}

void Close(void)/*图形关闭*/

{

closegraph()

}

void MouseOn(void)/*鼠标光标显示*/

{

_AX=0x01

geninterrupt(0x33)

}

void MouseOff(void)/*鼠标光标隐藏*/

{

_AX=0x02

geninterrupt(0x33)

}

void MouseSetXY(int x,int y)/*设置当前位置*/

{

_CX=x

_DX=y

_AX=0x04

geninterrupt(0x33)

}

int LeftPress(void)/*鼠标左键按下*/

{

_AX=0x03

geninterrupt(0x33)

return(_BX&1)

}

int RightPress(void)/*鼠标右键按下*/

{

_AX=0x03

geninterrupt(0x33)

return(_BX&2)

}

void MouseGetXY(void)/*得到当前位置*/

{

_AX=0x03

geninterrupt(0x33)

MouseX=_CX

MouseY=_DX

}

void Control(void)/*游戏开始,重新,关闭*/

{

int gameFLAG=1/*游戏失败后判断是否重新开始的标志*/

while(1)

{

if(gameFLAG)/*游戏失败后没判断出重新开始或者退出游戏的话就继续判断*/

{

GameBegain()/*游戏初始画面*/

GamePlay()/*具体游戏*/

if(gameAGAIN==1)/*游戏中重新开始*/

{

gameAGAIN=0

continue

}

}

MouseOn()

gameFLAG=0

if(LeftPress())/*判断是否重新开始*/

{

MouseGetXY()

if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)

{

gameFLAG=1

continue

}

}

if(kbhit())/*判断是否按键退出*/

break

}

MouseOff()

}

void DrawSmile(void)/*画笑脸*/

{

setfillstyle(SOLID_FILL,YELLOW)

fillellipse(290,75,10,10)

setcolor(YELLOW)

setfillstyle(SOLID_FILL,BLACK)/*眼睛*/

fillellipse(285,75,2,2)

fillellipse(295,75,2,2)

setcolor(BLACK)/*嘴巴*/

bar(287,80,293,81)

}

void DrawRedflag(int i,int j)/*显示红旗*/

{

setcolor(7)

setfillstyle(SOLID_FILL,RED)

bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5)

setcolor(BLACK)

line(198+j*20,95+i*20,198+j*20,95+i*20+10)

}

void DrawEmpty(int i,int j,int mode,int color)/*两种空格子的显示*/

{

setcolor(color)

setfillstyle(SOLID_FILL,color)

if(mode==0)/*没有单击过的大格子*/

bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8)

else

if(mode==1)/*单击过后显示空白的小格子*/

bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7)

}

void GameBegain(void)/*游戏开始画面*/

{

int i,j

cleardevice()

if(gamePLAY!=1)

{

MouseSetXY(290,70)/*鼠标一开始的位置,并作为它的初始坐标*/

MouseX=290

MouseY=70

}

gamePLAY=1/*下次按重新开始的话鼠标不重新初始化*/

mineNUM=0

setfillstyle(SOLID_FILL,7)

bar(190,60,390,290)

for(i=0i<10i++)/*画格子*/

for(j=0j<10j++)

DrawEmpty(i,j,0,8)

setcolor(7)

DrawSmile()/*画脸*/

randomize()

for(i=0i<10i++)/*100个格子随机赋值有没有地雷*/

for(j=0j<10j++)

{

Mine[i][j].num=random(8)/*如果随机数的结果是1表示这个格子有地雷*/

if(Mine[i][j].num==1)

mineNUM++/*现有雷数加1*/

else

Mine[i][j].num=2

Mine[i][j].flag=0/*表示没红旗标志*/

}

sprintf(randmineNUM,"%d",mineNUM)/*显示这次总共有多少雷数*/

setcolor(1)

settextstyle(0,0,2)

outtextxy(210,70,randmineNUM)

mineNUM=100-mineNUM/*变量取空白格数量*/

MouseOn()

}

void GameOver(void)/*游戏结束画面*/

{

int i,j

setcolor(0)

for(i=0i<10i++)

for(j=0j<10j++)

if(Mine[i][j].num==1)/*显示所有的地雷*/

{

DrawEmpty(i,j,0,RED)

setfillstyle(SOLID_FILL,BLACK)

fillellipse(200+j*20,100+i*20,7,7)

}

}

void GameWin(void)/*显示胜利*/

{

setcolor(11)

settextstyle(0,0,2)

outtextxy(230,30,"YOU WIN!")

}

int MineStatistics(int i,int j)/*统计每个格子周围的雷数*/

{

int nNUM=0

if(i==0&&j==0)/*左上角格子的统计*/

{

if(Mine[0][1].num==1)

nNUM++

if(Mine[1][0].num==1)

nNUM++

if(Mine[1][1].num==1)

nNUM++

}

else

if(i==0&&j==9)/*右上角格子的统计*/

{

if(Mine[0][8].num==1)

nNUM++

if(Mine[1][9].num==1)

nNUM++

if(Mine[1][8].num==1)

nNUM++

}

else

if(i==9&&j==0)/*左下角格子的统计*/

{

if(Mine[8][0].num==1)

nNUM++

if(Mine[9][1].num==1)

nNUM++

if(Mine[8][1].num==1)

nNUM++

}

else

if(i==9&&j==9)/*右下角格子的统计*/

{

if(Mine[9][8].num==1)

nNUM++

if(Mine[8][9].num==1)

nNUM++

if(Mine[8][8].num==1)

nNUM++

}

else if(j==0)/*左边第一列格子的统计*/

{

if(Mine[i][j+1].num==1)

nNUM++

if(Mine[i+1][j].num==1)

nNUM++

if(Mine[i-1][j].num==1)

nNUM++

if(Mine[i-1][j+1].num==1)

nNUM++

if(Mine[i+1][j+1].num==1)

nNUM++

}

else if(j==9)/*右边第一列格子的统计*/

{

if(Mine[i][j-1].num==1)

nNUM++

if(Mine[i+1][j].num==1)

nNUM++

if(Mine[i-1][j].num==1)

nNUM++

if(Mine[i-1][j-1].num==1)

nNUM++

if(Mine[i+1][j-1].num==1)

nNUM++

}

else if(i==0)/*第一行格子的统计*/

{

if(Mine[i+1][j].num==1)

nNUM++

if(Mine[i][j-1].num==1)

nNUM++

if(Mine[i][j+1].num==1)

nNUM++

if(Mine[i+1][j-1].num==1)

nNUM++

if(Mine[i+1][j+1].num==1)

nNUM++

}

else if(i==9)/*最后一行格子的统计*/

{

if(Mine[i-1][j].num==1)

nNUM++

if(Mine[i][j-1].num==1)

nNUM++

if(Mine[i][j+1].num==1)

nNUM++

if(Mine[i-1][j-1].num==1)

nNUM++

if(Mine[i-1][j+1].num==1)

nNUM++

}

else/*普通格子的统计*/

{

if(Mine[i-1][j].num==1)

nNUM++

if(Mine[i-1][j+1].num==1)

nNUM++

if(Mine[i][j+1].num==1)

nNUM++

if(Mine[i+1][j+1].num==1)

nNUM++

if(Mine[i+1][j].num==1)

nNUM++

if(Mine[i+1][j-1].num==1)

nNUM++

if(Mine[i][j-1].num==1)

nNUM++

if(Mine[i-1][j-1].num==1)

nNUM++

}

return(nNUM)/*把格子周围一共有多少雷数的统计结果返回*/

}

int ShowWhite(int i,int j)/*显示无雷区的空白部分*/

{

if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有红旗或该格处理过就不对该格进行任何判断*/

return

mineNUM--/*显示过数字或者空格的格子就表示多处理了一个格子,当所有格子都处理过了表示胜利*/

if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*显示空格*/

{

DrawEmpty(i,j,1,7)

Mine[i][j].num=0

}

else

if(Mine[i][j].roundnum!=0)/*输出雷数*/

{

DrawEmpty(i,j,0,8)

sprintf(randmineNUM,"%d",Mine[i][j].roundnum)

setcolor(RED)

outtextxy(195+j*20,95+i*20,randmineNUM)

Mine[i][j].num=0/*已经输出雷数的格子用0表示已经用过这个格子*/

return

}

/*8个方向递归显示所有的空白格子*/

if(i!=0&&Mine[i-1][j].num!=1)

ShowWhite(i-1,j)

if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)

ShowWhite(i-1,j+1)

if(j!=9&&Mine[i][j+1].num!=1)

ShowWhite(i,j+1)

if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)

ShowWhite(i+1,j+1)

if(i!=9&&Mine[i+1][j].num!=1)

ShowWhite(i+1,j)

if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1)

ShowWhite(i+1,j-1)

if(j!=0&&Mine[i][j-1].num!=1)

ShowWhite(i,j-1)

if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)

ShowWhite(i-1,j-1)

}

void GamePlay(void)/*游戏过程*/

{

int i,j,Num/*Num用来接收统计函数返回一个格子周围有多少地雷*/

for(i=0i<10i++)

for(j=0j<10j++)

Mine[i][j].roundnum=MineStatistics(i,j)/*统计每个格子周围有多少地雷*/

while(!kbhit())

{

if(LeftPress())/*鼠标左键盘按下*/

{

MouseGetXY()

if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新来*/

{

MouseOff()

gameAGAIN=1

break

}

if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/

{

j=(MouseX-190)/20/*x坐标*/

i=(MouseY-90)/20/*y坐标*/

if(Mine[i][j].flag==1)/*如果格子有红旗则左键无效*/

continue

if(Mine[i][j].num!=0)/*如果格子没有处理过*/

{

if(Mine[i][j].num==1)/*鼠标按下的格子是地雷*/

{

MouseOff()

GameOver()/*游戏失败*/

break

}

else/*鼠标按下的格子不是地雷*/

{

MouseOff()

Num=MineStatistics(i,j)

if(Num==0)/*周围没地雷就用递归算法来显示空白格子*/

ShowWhite(i,j)

else/*按下格子周围有地雷*/

{

sprintf(randmineNUM,"%d",Num)/*输出当前格子周围的雷数*/

setcolor(RED)

outtextxy(195+j*20,95+i*20,randmineNUM)

mineNUM--

}

MouseOn()

Mine[i][j].num=0/*点过的格子周围雷数的数字变为0表示这个格子已经用过*/

if(mineNUM<1)/*胜利了*/

{

GameWin()

break

}

}

}

}

}

if(RightPress())/*鼠标右键键盘按下*/

{

MouseGetXY()

if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/

{

j=(MouseX-190)/20/*x坐标*/

i=(MouseY-90)/20/*y坐标*/

MouseOff()

if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本来没红旗现在显示红旗*/

{

DrawRedflag(i,j)

Mine[i][j].flag=1

}

else

if(Mine[i][j].flag==1)/*有红旗标志再按右键就红旗消失*/

{

DrawEmpty(i,j,0,8)

Mine[i][j].flag=0

}

}

MouseOn()

sleep(1)

}

}

}

微信扫雷代码 *** 作流程如下:

1. 下载微信红包扫雷器并打开。

2. 在“设置-辅助功能-微信红包扫雷软件”中,点击“打开”。

3. 打开微信。在“设置-新消息提醒”中,选中“打开”以查看前两个选项“接受新消息通知”和“通知显示消息详细信息”。(很多人忘记了这一步)

4。打开微信群,点击右上角,下拉“消息无中断”选项,勾选“关闭”。(即保持“组消息提示”为“开”状态,触摸系统底部界面)。在微信红包扫雷软件中,勾选“打开自动红包”、“妞妞金额调整”、“杰龙金额调整”、“三公金额调整”等。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7332475.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存