埋雷源碼
① 開源代碼的軟體有什麼好處
開源,好處就是開放,每個人都能為你的軟體添磚加瓦。不過你的代碼一定要寫的漂亮、易懂、簡潔。牛的人可以根據自己的需要裁減源代碼,或者找出某個bug。壞處就是沒法壟斷,不能像微軟那樣,因為全世界的軟體開發者都看著你呢……而且開源都是「沒有擔保」的,比如你用開源的軟體出了什麼事,軟體的開發者是不會為你負責的。
② 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】並回車*/
③ 懸賞100元錢。注釋一個java掃雷游戲源代碼,就是把每行的意思寫到後面就可以了!在線等。
import java.awt.*;
import javax.swing.*;
import java.util.Random;
import java.awt.event.*;
class Min extends JPanel //雷的類
{
//備註:滑鼠的左鍵 = 1;右鍵 = 3;中鍵 = 2
private int flag = 0,statu = 0; //定義雷的屬性 0:沒有打開 1:打開 2:標示為雷 3:不確定
//flag = 0 不是雷 ; flag = 1是雷
private int but,count = 0; //but:哪一個滑鼠鍵被按下去了 count:這個區域周圍有多少個雷
private int mx = 0,my = 0,mw = 10; //定義雷的坐標和寬度
public Min() //構造函數
{
statu = 0;
}
public Min(int f,int x,int y,int w)
//構造函數
{
flag = f;
mx = x;
my = y;
mw = w;
}
public int getFlag(){return flag;}
public int getStatu(){return statu;}
public int getMx(){return mx;}
public int getMy(){return my;}
public int getMw(){return mw;}
public int getCount(){return count;}
public void setFlag(int f){flag = f;}
public void setCount(int c){count = c;}
public void setData(int f,int x,int y,int w,int s)
//傳遞值
{
flag = f;
mx = (x-1)*w;
my = (y-1)*w;
mw = w-1;
statu = s;
}
//根據你點擊滑鼠的不同來改變雷的屬性
public int sendKey(int key)
{
//返回值,如果游戲結束則返回-1
int rtn = 1;
if(key == 3)
{
switch(statu)
{
case 1:
break;
case 2:
statu = 3;
break;
case 3:
statu = 0;
break;
case 0:
statu = 2;
break;
}
rtn = 1;
}
if(key == 1 && statu == 0)
{
switch(flag)
{
case 0:
statu = 1;
rtn = 2;
break;
case 1:
statu = 1;
rtn = -1;
break;
}
}
return rtn;
}
}
class DrawPanel extends JPanel
{
private int i,j;
private int f = 0; //if f = 1 then game over ,if f =2 then win
private int chx = 0,chy = 0; //專門記錄坐標x,y的值
private int msum = 6,ksum = 0; //msum:雷的個數,ksum:標示雷的個數
private int bx = 10,by = 10,bw = 40; //bx,by:棋盤的大小,bw:棋子的大小
public Min board[][] = {
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},
};
// 畫坐標為ax,ay區域的雷的狀態
public void draw(Graphics g,int ax,int ay)
{
int x,y,w; // 坐標x,y;和寬度:w
int s,c,flag; //狀態;雷的個數;
int cx = bw/2 - 4;
int cy = bw/2 + 4;
x = board[ax][ay].getMx();
y = board[ax][ay].getMy();
w = board[ax][ay].getMw();
s = board[ax][ay].getStatu();
c = board[ax][ay].getCount();
flag= board[ax][ay].getFlag();
switch(s)
{
case 0: //沒有打開狀態
{
g.setColor(Color.black);
g.fillRect(x,y,w,w);
break;
}
case 1: //打開狀態
{
g.setColor(Color.blue);
g.fillRect(x,y,w,w);
if(c != 0 && flag == 0) //此處沒有雷
{
g.setColor(Color.red);
g.drawString(String.valueOf(c),x + cx,y + cy);
}
if(flag == 1) //此處有雷
{
g.setColor(Color.red);
g.fillRect(x,y,w,w);
g.setColor(Color.blue);
g.drawString(" 雷",x + cx,y + cy);
}
break;
}
case 2: //標雷狀態
{
g.setColor(Color.green);
g.fillRect(x,y,w,w);
g.setColor(Color.blue);
g.drawString(" 旗",x + cx,y + cy);
break;
}
case 3: //不確定狀態
{
g.setColor(Color.black);
g.fillRect(x,y,w,w);
g.setColor(Color.red);
g.drawString("?",x + cx,y + cy);
break;
}
default:
break;
}
}
// 沒有圖形器的繪圖函數:畫出坐標ax,ay的雷的狀態和圖形
public void draw(int ax,int ay)
{
Graphics g;
g = this.getGraphics();
draw(g,ax,ay);
}
//打開周圍沒有雷的地方,並且繪畫所在區域點擊左鍵觸發
public int openNoMin(int ax,int ay)
{
int i,j;
if(ax<1||ay<1||ax>bx||ay>by) return 0; //滑鼠點擊的區域出界了
if(board[ax][ay].getStatu() != 0) return 0; //如果此區域打開了,返回
board[ax][ay].sendKey(1); //如果返回值等於-1,就說明游戲結束
draw(ax,ay);
if(board[ax][ay].getFlag() == 1)
//如果游戲結束,把所有的雷都顯示出來
{
for(i = 1;i<=bx;i++)
{
for(j = 1;j <= by;j++)
{
if(board[i][j].getFlag() == 1)
{
board[i][j].sendKey(1);
draw(i,j);
}
}
}
return -1;
}
//如果游戲沒有結束
if(board[ax][ay].getCount() > 0)
{
ksum ++;
return 1; //周圍有雷,就不用打開周圍地區
}
if(board[ax][ay].getCount() == 0 && board[ax][ay].getFlag() == 0)
//周圍沒有雷,打開周圍地區,直到有雷的地區
{
openNoMin(ax-1,ay-1);openNoMin(ax,ay-1);openNoMin(ax+1,ay-1);
openNoMin(ax-1,ay ); openNoMin(ax+1,ay );
openNoMin(ax-1,ay+1);openNoMin(ax,ay+1);openNoMin(ax+1,ay+1);
}
ksum ++;
return 1;
}
//計算坐標x,y的周圍雷的個數
public int getCount(int ai,int aj)
{
int sum = 0;
if(board[ai][aj].getFlag() == 1)
{
return sum;
}
if(ai>1&&aj>1&&ai<bx&&aj<by)
{
sum = board[ai-1][aj-1].getFlag()+ board[ai][aj-1].getFlag()+ board[ai+1][aj-1].getFlag()+
board[ai-1][aj ].getFlag()+ board[ai+1][aj ].getFlag()+
board[ai-1][aj+1].getFlag()+ board[ai][aj+1].getFlag()+ board[ai+1][aj+1].getFlag();
}
if(ai==1&&aj==1)
{
sum = board[ai+1][aj ].getFlag()+
board[ai][aj+1].getFlag()+ board[ai+1][aj+1].getFlag();
}
if(ai==1&&aj==by)
{
sum = board[ai][aj-1].getFlag()+ board[ai+1][aj-1].getFlag()+
board[ai+1][aj ].getFlag();
}
if(ai==bx&&aj==1)
{
sum = board[ai-1][aj ].getFlag()+
board[ai-1][aj+1].getFlag()+ board[ai][aj+1].getFlag();
}
if(ai==bx&&aj==by)
{
sum = board[ai-1][aj-1].getFlag()+ board[ai][aj-1].getFlag()+
board[ai-1][aj ].getFlag();
}
if(ai==1&&aj>1&&aj<by)
{
sum = board[ai][aj-1].getFlag()+ board[ai+1][aj-1].getFlag()+
board[ai+1][aj ].getFlag()+
board[ai][aj+1].getFlag()+ board[ai+1][aj+1].getFlag();
}
if(ai==bx&&aj>1&&aj<by)
{
sum = board[ai-1][aj-1].getFlag()+ board[ai][aj-1].getFlag()+
board[ai-1][aj ].getFlag()+
board[ai-1][aj+1].getFlag()+ board[ai][aj+1].getFlag();
}
if(ai>1&&ai<bx&&aj==1)
{
sum = board[ai-1][aj ].getFlag()+ board[ai+1][aj ].getFlag()+
board[ai-1][aj+1].getFlag()+ board[ai][aj+1].getFlag()+ board[ai+1][aj+1].getFlag();
}
if(ai>1&&ai<bx&&aj==by)
{
sum = board[ai-1][aj-1].getFlag()+ board[ai][aj-1].getFlag()+ board[ai+1][aj-1].getFlag()+
board[ai-1][aj ].getFlag()+ board[ai+1][aj ].getFlag();
}
return sum;
}
// 傳入參數:幾列,幾行,寬度,雷數
public void initMin(int ax,int ay,int aw,int as)
{
int k = 1; //表明產生的第幾個雷
Random r; //隨機數
f = 0; //f=0表示游戲還沒有結束
ksum = 0;
bx = ax;
by = ay;
bw = aw;
msum = as;
r = new Random();
//初始化底盤的值
for(i = 1;i <= bx;i++)
{
for(j=1;j<=by;j++)
{
board[i][j].setData(0,i,j,bw,0);
}
}
// 隨機產生雷
while(k <= msum)
{
i = r.nextInt(bx)+1;
j = r.nextInt(by)+1;
if(board[i][j].getFlag() != 1)
{
board[i][j].setFlag(1);
k++;
}
}
// 非雷區的周圍有幾個雷,初始化其值
for(i = 1;i <= bx;i++)
{
for(j=1;j<=by;j++)
{
board[i][j].setCount(getCount(i,j));
}
}
setBackground(Color.white);
repaint();
}
// 構造函數
public DrawPanel(int ax,int ay,int aw,int as)
{
initMin(ax,ay,aw,as);
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent me)
{
int r;
if(f != 0) return; //如果游戲結束,返回
chx = me.getX();
chy = me.getY();
if(me.getButton() != 1)
{
board[chx/bw+1][chy/bw+1].sendKey(me.getButton());
draw(chx/bw+1,chy/bw+1);
}
else if(me.getButton() == 1)
{
if(openNoMin(chx/bw+1,chy/bw+1) == -1)
{
f = 1;
repaint();
}
else if ( ksum + msum == bx*by )
{
f = 2;
repaint();
}
}
}
}
);
}
// 重畫所有的圖形,包括一些修飾的圖形
public void paint(Graphics g)
{
int x,y,w;
int s;
int cx = bw/2 - 4;
int cy = bw/2 + 4;
g.clearRect(0,0,600,600);
for(i=1;i<=bx;i++)
{
for(j=1;j<=by;j++)
{
draw(g,i,j);
}
}
if(f == 1)
{
Font f = new Font("11",1,70);
Font fo = g.getFont();
g.setColor(Color.white);
g.setFont(f);
//g.setSize();
g.drawString("Game Over",0,200);
g.setFont(fo);
}
if( f == 2 )
{
Font f = new Font("11",1,70);
Font fo = g.getFont();
g.setColor(Color.white);
g.setFont(f);
//g.setSize();
g.drawString("You win!",0,200);
g.setFont(fo);
}
}
};
// 主類和程序的入口
public class Mine extends JFrame implements ActionListener
{
Container cp = getContentPane();
JButton bt = new JButton("開局");
Label l1 = new Label("列:");
Label l2 = new Label("行:");
Label l3 = new Label("寬度:");
Label l4 = new Label("雷的個數:");
TextField tf1 = new TextField("10",2); //列
TextField tf2 = new TextField("10",2); //行
TextField tf3 = new TextField("40",2); //寬度
TextField tf4 = new TextField("15",2); //雷的個數
int x=10,y=10,w=40,sum=15;
DrawPanel dp = new DrawPanel(x,y,w,sum);
public Mine()
{
setBackground(Color.white);
cp.setLayout(null);
cp.add(dp);
cp.add(bt);
cp.add(tf1);
cp.add(tf2);
cp.add(tf3);
cp.add(tf4);
cp.add(l1);
cp.add(l2);
cp.add(l3);
cp.add(l4);
l1.setBounds(20 ,10,20,20);
tf1.setBounds(40,10,20,20);
l2.setBounds(70,10,20,20);
tf2.setBounds(90,10,20,20);
l3.setBounds(120,10,40,20);
tf3.setBounds(160,10,20,20);
l4.setBounds(190,10,60,20);
tf4.setBounds(250,10,20,20);
bt.setBounds(300,10,80,20);
dp.setBounds(20,40,x*w,y*w);
setResizable(false);
setSize(x*w+40,y*w+80);
setTitle(" 掃雷");
show();
bt.addActionListener(this);
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{System.exit(0);}
}
);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == bt)
{
//x = Integer.parseInt(tf1.getText());
//y = Integer.parseInt(tf2.getText());
//w = Integer.parseInt(tf3.getText());
sum = Integer.parseInt(tf4.getText());
setSize(x*w+40,y*w+80);
dp.setBounds(20,40,x*w,y*w);
show();
dp.initMin(x,y,w,sum);
}
}
public static void main(String args[])
{
new Mine();
}
};
④ 求紅警2尤里的復仇電腦智商、戰略增強補丁
可以改AI.ini
關於AI的製作
AI分為4個部分 一個完整的AI必須具備這4個部分
====================================================
1) [TaskForces] [部隊成員組]=指定一支隊伍里都由哪些單位組成
2) [ScriptTypes] [命令組] =指定一支隊伍將要進行的作戰行動
3) [TeamTypes] [作戰隊伍] =指定一支隊伍的基本設置編成
4) [AITriggerTypes] [AI觸發] =設置當達到某些條件時電腦就會出這組部隊
====================================================
現在讓我們來一個一個的解析
********************************
**********[TaskForces]**********
********************************
首先 我們在他的下面看到一排注冊名 如果你想創建新的使命部隊 請在那注冊
下面 我們舉一個使命部隊為例
[0A6E3F1C-G]
這就是你在上面注冊的名字 記好它 我們後面還要用
Name=2 Prism Tanks, 2 IFV, 4 Grizzly
Name 這個僅僅是作為注釋用 沒有實際意義
0=2,FV
1=2,SREF
2=4,MTNK
這是使命部隊的正文部分 意味著該使命部隊的組成為2FV(多功能)2SREF(光棱)4MTNK(灰熊) 想改變製造某物體的數目 就更改某物體前面一個數字,新物體就在後面加上一行 格式同上 序數增加
Group=-1
Group= 這個
-1 解散所有的運輸工具
?? 解散隊伍
?? 保留所有
?? 解散單位,保留運輸工具
?? 只保留速度最快的 ?
?? 只保留最近的 ?
?? 在最大威脅附近集合
-40094 在最小威脅附近集合
中間的幾個值如果有人有請發給我 十分感謝
********************************
*********[ScriptTypes]**********
********************************
[0607B8FC-G]
Name=General Base Defense Attack
Name 這個僅僅是作為注釋用 沒有實際意義
0=54,0
1=53,0
2=0,7
3=49,0
4=0,2
5=0,1
AI最難的地方來了 這個格式是T=X,Y
T是個序數 和上文的一樣 直接加就可以了
X,Y 他們組合起來代表一個步驟 比較麻煩 我把他們一一列出以便各位觀賞!
**X一共有64個值 我揀有用的說 沒說的一般都沒什麼用處了(在我看來)**
====================================================
X=0:攻擊物體 Y=將要攻擊的物體類型
Y=1:任意東西
Y=2:任何建築
Y=3:礦車(礦廠)
Y=4:步兵類
Y=5:車輛類
Y=6:工廠類
Y=7:防禦建築類
Y=8:超級武器
Y=9:電場類
Y=10:可進駐物體
Y=11:科技建築類
X=1:攻擊Y號路徑點(不推薦)
X=2:使擁有Cyborg=yes(生化機器人)的步兵進入瘋狂狀態(不分敵我) [未證實] Y=0
X=3:移動到Y號路徑點
X=5:警戒Y*6秒
X=6:重復第Y行(序數T的那行)
X =8:運輸工具卸載
Y=0:保留所有
Y=1:保留運輸工具
Y=2:保留單位(推薦)
Y=3:全部解散
X=9:展開單位 Y=0
X=10:跟隨距離最近的友好單位 Y=0
X=11:執行命令
0,啥也不幹
1,(通過威脅等級)執行AI中的攻擊任務
2,移動到目的地
3,跟隨另一隊移動
4,撤退
5,保護目標,攻擊來犯之敵
6,保護目標,但窮寇末追
7,進入建築或交通工具
8,工程師佔領
9,在修理單位時,把他吃了....估計是尤里的變賣場(只能用於建築)
10,礦區采礦,礦場卸貨
11,守衛初始地區
12,航母載機回巢
13,停止活動(有可能的話)
14,偽裝伏擊單位開火
15,游獵殲敵
16,卸貨
17,埋雷包
18,建築建立
19,賣出建築
20,修理單位(維修廠)
21,特種部隊突擊(這個over-ride應該是推翻,不管不顧的意思,為什麼這樣不懂,就參考一下好了)
22,核彈井發射
23,無威脅目標
24,開門關門
25,巡邏
26,空降機飛行
27,空降機空投
28,待命
29,空間跳躍
30,展開攻擊
31,偵察機飛行(YR)
32,偵察機照相(YR)
X=14:運全部兵 Y=0
X=16:在Y路徑點附近巡邏
X=17:更改應用腳本 Y為腳本名稱 [未證實]
X=18:更改部隊 Y為部隊名稱 [未證實]
X=21:分散部隊 Y=0
X=29:自動生產 似乎沒用 還是寫出來的好
X=30:出售所有單位並進攻對手 這個在遭遇戰快速游戲模式下的唯一用處是自殺 Y=0
X=43:使運輸停止直到裝滿
X=46:攻擊特定建築 Y=特定建築在RULES中注冊的值(K=XXX)加上0/65536/131072(推薦)
X=47:移動到特定建築 Y同X=46演算法
X=48:偵察
X=49:使之前動作完成再進行下一個動作 Y=0
X=53:集團沖鋒到對方陣地(快慢協調 就是說快的要等慢的一起 Y=0
X=54:在自己陣地集合 Y=0
X=55:加鐵幕 Y=0
X=57:超時空到對方家某些建築附近
Y=1:任意東西
Y=2:建築
Y=3:礦車
Y=4:步兵
Y=5:車輛
Y=6:工廠
Y=7:基礎防禦
Y=8:最大威脅
Y=9:電場
Y=10:可進駐物體
Y=11:科技建築
X=58:移動到友好建築 Y同X=46演算法
X=60:進入回收站 Y=0
X=61:進入坦克碉堡 Y=0
X=62:進入生化反應堆 Y=0
X=63:進入戰斗碉堡 Y=0
X=64:進駐建築 Y=0
====================================================
********************************
**********[TeamTypes]***********
********************************
[0A6E210C-G]=作戰集團 這個也要注冊
Name=Allied Bombard - H1
Name 這個僅僅是作為注釋用 沒有實際意義
VeteranLevel=1 經驗等級 1=無級 2=一級 3=三級 任務地圖里才能設為2或3
MindControlDecision=0 在YURI游戲里電腦的尤里方控制別人後會把俘虜怎麼樣。
0 = 無法心靈控制別人 (也就是部隊里根本就沒有能控制別人的單位,就得是0)
1 = 加入另外需要的隊伍
2 = 放進部隊回收站
3 = 放進生化反應堆
4 = 前去攻擊敵人
5 = 就在原地
====================================================
Loadable=yes=部隊攻擊完後撤退,待會再攻擊(一般使用在像飛機那樣需要補充彈葯的部隊里)
Full=yes=完整小隊 AI(MD)INI里得設為=no
Annoyance=yes=煩惱效果(任務地圖)AI(MD)INI里得設為=no
GuardSlower=yes=防衛減緩 NO代表部隊在基地中作出還擊時不會變慢
House=<none> 就NONE 除非是單個國家的特殊攻擊模式
Recruiter=yes=AI會動用現有的單位去組成隊伍,優於去建造新的單位來組成隊伍
Autocreate=yes=沒有達到觸發條件電腦也會生產這支部隊,只不過部隊將不會去執行任何命令
Prebuild=yes=電腦在還沒需要時預先建造此隊伍
Reinforce=yes=這是增援部隊,一般用在防禦部隊。
Droppod=yes=這是空降部隊(任務地圖)AI(MD)INI里得設為=no
UseTransportOrigin=yes=使用存在的運輸工具(當前一運輸型部隊是TransportsReturnOnUnload=yes=運輸單位在完成卸載後返回基地)
Whiner=yes=哀叫效果(任務地圖)AI(MD)INI里得設為=no
LooseRecruit=yes=當前的部隊完成任務後將會被解散,而不會加入另一隊中
Aggressive=yes=該部隊將按Script=所使用的命令組里的命令去執行。
Suicide=yes=這是將進行自殺攻擊的部隊
Priority=5 建造部隊時的優先權。通常為整數,數字越小,AI建造的可能性越大
Max=1 共生產幾組這樣的部隊
TechLevel=0 指定可以製造此隊伍的最低科技水平,通常設為0
Group=-1 分組
OnTransOnly=yes=這是傳送部隊(任務地圖)AI(MD)INI里得設為=no
AvoidThreats=yes=部隊會忽略任何攻擊繼續前進. no=在遇到敵人時就會開火,在被攻擊時就會停下還火
IonImmune=no 默認NO 不要更改
TransportsReturnOnUnload=yes=運輸單位在完成卸載後返回基地
AreTeamMembersRecruitable=YES=可以為該組部隊補充隊伍中被消滅的成員
IsBaseDefense=yes=這是在基地里防禦的部隊
OnlyTargetHouseEnemy=yes=只對付敵對玩家的單位,而不攻擊中立的單位
Script=0607B8FC-G 所使用的命令組
TaskForce=0A6E3F1C-G 所使用的部隊成員組
********************************
********[AITriggerTypes]********
********************************
這是最討厭也最難記的部分 請大家注意了
0D62199C-G= 這個不要注冊 何況你也沒地方注冊 ^_^
[A] Allied Bombard - H1 vs Sov, 名字 只起注釋作用
[B] 0A6E210C-G, 使用的TeamTypes名
[C] <all>, 哪個國家使用它 和上文保持一致
[D] 8, TechLevel 和上文保持一致
[E] 0,
====================================================
-1: 普通觸發
0: 敵人擁有[F]物品
1: 自己擁有[F]物品
2: 敵人電量黃
3: 敵人電量紅
4: 鈔票超過數量
5: 鐵幕完成超過AIMinorSuperReadyPercent= 數量
6: 超時空完成超過AIMinorSuperReadyPercent= 數量
7: 中立擁有[F]物品
====================================================
[F] NAPOWR, 物品名稱 如果上文[E]不是0,1,7就填<none>
[G] ,
====================================================
01000000 代表一個值 01就是1 0a就是10 16進制
03000000 中間可以取0-5 分別是小於(0),小於等於(1),等於(2),大於等於(3),大於(4),不等於(5)
**上面兩個合起來 加上[E],[F]的值構成一個完整的觸發模式:本文中為"敵人擁有蘇聯電場大於等於1個"
請不要更改 未知作用
====================================================
[H] 70.000000, 觸發比重,與所有可能觸發一起構成一個隨機觸發系統,這個比重更改請見AITriggerSuccessWeightDelta= AITriggerFailureWeightDelta=-50 分別代表成功與失敗時觸發比重的增減情況
[I] 10.000000, 觸發最低比重
[J] 70.000000, 觸發最高比重
默認比重中,只有10, 20, 40, 50, 70, 500, 5000這7個值有用 [未證實]
====================================================
[K] 1, 是用於遭遇戰模式的 0=不是
[L] 0, ???
[M] 1, 誰用這個觸發 1盟2蘇3尤
[N] 0, 1=是留在基地周圍防守 與上文一致
[O] 0CB246CC-G, 這個觸發所帶動的另外一個觸發 填TeamTypes名
[P] 0, 簡單電腦是否使用他 0=不 1=是
[Q] 0, 中等電腦是否使用他 0=不 1=是
[R] 1. 困難電腦是否使用他 0=不 1=是
如果lz有什麼東西改不出來可以用地圖編輯器
(我到現在都不會改觸發)
⑤ Raymond是啥意思
Raymond是英文中常見的男子名。名字寓意為強有力的保護者。
英 [ˈreɪmənd] ; 美 [ˈreɪmənd]
n:雷蒙德(男子教名,亦作姓用,源於古日耳曼語;昵稱Ray)
來源語種:法語、羅曼語
名字含義:
強有力的保護者,昵稱Ray 強有力的保護者,昵稱Ray 從日耳曼名字Raginmund,組成的元素ragin「建議」和mund「保護者」。
諾曼人以Reimund的形式向英國介紹了這個名字。它由幾個中世紀(大多是西班牙)聖徒,包括聖雷蒙Nonnatus,助產士和准媽媽的贊助人,和聖雷蒙的Peñafort,牧師的贊助人。
相似的英文名還有:
Raimund雷蒙德、Rajmund雷蒙德、Ray瑞雅、Raya拉亞、Rayan拉揚、Rayanna蕊安娜、Rayburn雷伯恩、Raychelle蕊歇爾、Raye雷伊、Rayen瑞恩
例句:
1、.
父母想讓雷蒙德接受最好的教育。
2、What'snextisI'.
接下去會是我和雷蒙德一起去參加最後的狂歡派對。
(5)埋雷源碼擴展閱讀
以Raymond為名的名人事例:
1、Eric Steven Raymond
埃里克·雷蒙,即埃里克·斯蒂芬·雷蒙,是一名程序員,《大教堂與市集》的作者、《新黑客詞典》("Jargon File")的維護人、著名黑客。雷蒙最初被認為是黑客文化的歷史學家以及人類學家,1997年以後,被公認為是開放源代碼運動的主要領導者之一。
雷蒙管理著30多個開源軟體以及10多個主要的FAQ。他還是重要的作家和weblogger。他是INTERCAL編程語言的主要創作者之一,還曾經為EMACS編輯器的發展作出貢獻。雷蒙還是Fetchmail程序的作者。最近他還編寫了一個最初用於Linux內核設置的設置程序。
雷蒙的名言,「足夠多的眼睛,就可讓所有問題浮現。」(Given enough eyeballs, all bugs are shallow),對開放源代碼運動影響很大,這亦即是著名的林納斯定律。
2、Raymond Davis Jr.
美國科學家雷蒙德·戴維斯1914年生於華盛頓,1942年獲美國耶魯大學化學博士學位,現為美國賓夕法尼亞大學物理學和天文學系名譽教授。他因為在天體物理學,特別是「探測宇宙中微子」領域做出的先驅性貢獻,獲得2002年諾貝爾物理學獎1/4的獎金。
戴維斯通過ν+ 37Cl → 37Ar + e-反應來探測中微子的,他的實驗裝置是一個埋在胡姆斯塔克(Homestake)1500米深礦井中的裝有615噸C2Cl4液體的大容器。當中微子與液體中的37Cl碰撞而放出電子時就轉變為37Ar,只要探測到37Ar 的存在,就能證實中微子的存在。
戴維斯持續了30年時間,才探測到約2000個中微子。
戴維斯和小柴昌俊在「探測宇宙中微子」方面取得的成就導致了中微子天文學的誕生;賈科尼在「發現宇宙X射線源」方面取得的成就同樣導致了X射線天文學的誕生。
⑥ 掃雷游戲的C代碼給個網址或代碼也行
用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=0;i<10;i++)/*畫格子*/
for(j=0;j<10;j++)
DrawEmpty(i,j,0,8);
setcolor(7);
DrawSmile();/*畫臉*/
randomize();
for(i=0;i<10;i++)/*100個格子隨機賦值有沒有地雷*/
for(j=0;j<10;j++)
{
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=0;i<10;i++)
for(j=0;j<10;j++)
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=0;i<10;i++)
for(j=0;j<10;j++)
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);
}
}
}
⑦ C語言掃雷源代碼 不用滑鼠 操作 急求!!!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#define N 3
struct mine_box {
char type; // '*'代表地雷,n代表周圍有地雷的地雷數(n=0-8)
char bMarked; // 是否被標記
char bOpened; // 是否被打開
} mine_array[N][N];
int CurrentRow, CurrentCol; // 記錄當前游標的位置
int openedBlank = 0; // 記錄被掀開的格子數
/*將游標定位到屏幕上的某個指定位置的坐標上*/
void gotoxy(int x,int y)
{ CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
HANDLE hConsoleOut;
hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsoleOut,&csbiInfo);
csbiInfo.dwCursorPosition.X = x;
csbiInfo.dwCursorPosition.Y = y;
SetConsoleCursorPosition(hConsoleOut,csbiInfo.dwCursorPosition);
}
// 顯示一個格子的內容
void printBox(struct mine_box mb)
{
// 格子沒被掀開也沒做標記
if(mb.bOpened == 0 && mb.bMarked == 0)
printf("□");
// 格子被標記一次
else if(mb.bMarked == 1)
printf("√");
// 格子被標記兩次
else if(mb.bMarked == 2)
printf("?");
// 格子被掀開,顯示格子中的內容
else
switch(mb.type) {
// 格子中有地雷
case '*':
printf("⊕");
break;
// 格子沒有地雷並且四周也沒有地雷
case 0:
printf("");
break;
case 1:
printf("1");
break;
case 2:
printf("2");
break;
case 3:
printf("3");
break;
case 4:
printf("4");
break;
case 5:
printf("5");
break;
case 6:
printf("6");
break;
case 7:
printf("7");
break;
case 8:
printf("8");
break;
}
}
// 將游標移動到第row行第col列的格子上
void MoveTo(int row, int col)
{
CurrentRow = row;
CurrentCol = col;
gotoxy(CurrentCol*4+2,CurrentRow*2+1);
}
// 刷新屏幕
void refreshScreen(int state)
{
int i, j;
gotoxy(0, 0);
printf("┏━");
for(i = 1; i < N; i++)
printf("┳━");
printf("┓\n");
for(i = 0; i < N; i++) {
printf("┃");
for(j = 0; j < N; j++) {
if(state == -1 && mine_array[i][j].bMarked == 1 && mine_array[i][j].type != '*') {
printf("¤"); // 標記錯了地雷
continue;
}
if(state != 0) { // 游戲結束,將所有的盒子掀開顯示其中內容
mine_array[i][j].bOpened = 1;
mine_array[i][j].bMarked = 0;
}
printBox(mine_array[i][j]);
printf("┃");
}
if(i < N-1) {
printf("\n┣");
for(j = 1; j < N; j++) {
printf("━╋");
}
printf("━┫\n");
}
else {
printf("\n┗");
for(j = 1; j < N; j++) {
printf("━┻");
}
printf("━┛\n");
}
}
printf("按鍵指南:A左移,D右移,W上移,S下移,X翻開,C標記,Q退出\n");
}
void MoveUp()
{
if(CurrentRow > 0) {
CurrentRow --;
MoveTo(CurrentRow, CurrentCol);
}
}
void MoveDown()
{
if(CurrentRow < N-1) {
CurrentRow ++;
MoveTo(CurrentRow, CurrentCol);;
}
}
void MoveLeft()
{
if(CurrentCol > 0) {
CurrentCol --;
MoveTo(CurrentRow, CurrentCol);
}
}
void MoveRight()
{
if(CurrentCol < N-1) {
CurrentCol ++;
MoveTo(CurrentRow, CurrentCol);
}
}
int openMine()
{
int saveRow = CurrentRow, saveCol = CurrentCol;
if(mine_array[CurrentRow][CurrentCol].bOpened)
return 0;
mine_array[CurrentRow][CurrentCol].bOpened = 1;
mine_array[CurrentRow][CurrentCol].bMarked = 0;
if(mine_array[CurrentRow][CurrentCol].type == '*') {
refreshScreen(-1);
MoveTo(N+1, 0);
printf("失敗!游戲結束)\n");
exit(2);
}
printBox(mine_array[CurrentRow][CurrentCol]);
MoveTo(CurrentRow, CurrentCol);
// 進一步要做的是當掀開一個type=0的空格子時,將其周圍沒有地雷的空格子自動掀開
return 1;
}
void markMine()
{
if(mine_array[CurrentRow][CurrentCol].bOpened == 1)
return;
if(mine_array[CurrentRow][CurrentCol].bMarked == 0)
mine_array[CurrentRow][CurrentCol].bMarked = 1;
else if(mine_array[CurrentRow][CurrentCol].bMarked == 1)
mine_array[CurrentRow][CurrentCol].bMarked = 2;
else if(mine_array[CurrentRow][CurrentCol].bMarked ==2)
mine_array[CurrentRow][CurrentCol].bMarked = 0;
printBox(mine_array[CurrentRow][CurrentCol]);
MoveTo(CurrentRow, CurrentCol);
}
main()
{
int num, i, j, row, col, count;
printf("輸入地雷數: ");
scanf("%u", &num);
if(num > N*N) {
printf("地雷數超限\n");
return -1;
}
memset((void*)mine_array, 0, N*N*sizeof(struct mine_box));
//隨機設置num個地雷的位置
srand((unsigned)time(NULL));
for(i=0; i<num; i++) {
row = rand()%N;
col = rand()%N;
if(mine_array[row][col].type == 0)
mine_array[row][col].type = '*';
else // 已經有雷了,重新取下一個格子
i--;
}
// 計算每個非雷格子周圍的地雷數
for(row=0; row<N; row++)
{
for(col = 0; col < N; col++) {
if(mine_array[row][col].type == '*') {
for(i = row-1; i <= row+1; i++) {
for(j = col-1; j <= col+1; j++) {
if(i >= 0 && j >= 0 && i < N && j < N && mine_array[i][j].type != '*')
mine_array[i][j].type ++;
}
}
}
}
}
refreshScreen(0);
MoveTo(N/2, N/2); // 將游標移到中央的位置
do {
switch(getch()) {
case 'a':
case 'A':
MoveLeft();
break;
case 's':
case 'S':
MoveDown();
break;
case 'd':
case 'D':
MoveRight();
break;
case 'w':
case 'W':
MoveUp();
break;
case 'x':
case 'X':
if(openMine() == 1) {
if(++openedBlank == N*N-num) { //所有的空格都被掀開
refreshScreen(1);
MoveTo(N+1, 0);
printf("成功!游戲結束。\n");
exit(0);
}
}
break;
case 'c':
case 'C':
markMine();
break;
case 'q':
case 'Q':
MoveTo(N+1, 0);
printf("是否退出?(y/n)");
if(getch() == 'y')
return 0;
}
} while(1);
}
⑧ 掃雷java源代碼
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Frame
extends JFrame {
JTextField text;
JLabel nowBomb, setBomb;
int BombNum, BlockNum; // 當前雷數,當前方塊數
int rightBomb, restBomb, restBlock; // 找到的地雷數,剩餘雷數,剩餘方塊數
JButton start = new JButton(" 開始 ");
JPanel MenuPamel = new JPanel();
JPanel bombPanel = new JPanel();
Bomb[][] bombButton;
JPanel c;
BorderLayout borderLayout1 = new BorderLayout();
GridLayout gridLayout1 = new GridLayout();
public Frame() {
try {
setDefaultCloseOperation(EXIT_ON_CLOSE);
jbInit();
}
catch (Exception exception) {
exception.printStackTrace();
}
}
private void jbInit() throws Exception {
c = (JPanel) getContentPane();
setTitle("掃雷");
c.setBackground(Color.WHITE);
MenuPamel.setBackground(Color.GRAY);
c.setLayout(borderLayout1);
setSize(new Dimension(600, 600));
setResizable(false);
BlockNum = 144;
BombNum = 10;
text = new JTextField("10 ", 3);
nowBomb = new JLabel("當前雷數" + ":" + BombNum);
setBomb = new JLabel("設置地雷數");
start.addActionListener(new Frame1_start_actionAdapter(this));
MenuPamel.add(setBomb);
MenuPamel.add(text);
MenuPamel.add(start);
MenuPamel.add(nowBomb);
c.add(MenuPamel, java.awt.BorderLayout.SOUTH);
bombPanel.setLayout(gridLayout1);
gridLayout1.setColumns( (int) Math.sqrt(BlockNum));
gridLayout1.setRows( (int) Math.sqrt(BlockNum));
bombButton = new Bomb[ (int) Math.sqrt(BlockNum)][ (int) Math.sqrt(BlockNum)];
for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {
for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {
bombButton[i][j] = new Bomb(i, j);
//bombButton[i][j].setSize(10, 10);
bombButton[i][j].setFont(new Font("", Font.PLAIN, 14));//設置字體大小
bombButton[i][j].setForeground(Color.white);
bombButton[i][j].addMouseListener(new Bomb_mouseAdapter(this));
bombButton[i][j].addActionListener(new Bomb_actionAdapter(this));
bombPanel.add(bombButton[i][j]);
}
}
c.add(bombPanel, java.awt.BorderLayout.CENTER);
startBomb();
}
/* 開始按鈕 */
public void start_actionPerformed(ActionEvent e) {
int num=Integer.parseInt(text.getText().trim());
if (num >= 5 && num < 50) {
BombNum = num;
startBomb();
}
else if (num < 5) {
JOptionPane.showMessageDialog(null, "您設置的地雷數太少了,請重設!", "錯誤",
JOptionPane.ERROR_MESSAGE);
num=10;
BombNum = num;
}
else {
JOptionPane.showMessageDialog(null, "您設置的地雷數太多了,請重設!", "錯誤",
JOptionPane.ERROR_MESSAGE);
num=10;
BombNum = num;
}
}
/* 開始,布雷 */
public void startBomb() {
nowBomb.setText("當前雷數" + ":" + BombNum);
for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {
for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {
bombButton[i][j].isBomb = false;
bombButton[i][j].isClicked = false;
bombButton[i][j].isRight = false;
bombButton[i][j].BombFlag = 0;
bombButton[i][j].BombRoundCount = 9;
bombButton[i][j].setEnabled(true);
bombButton[i][j].setText("");
bombButton[i][j].setFont(new Font("", Font.PLAIN, 14));//設置字體大小
bombButton[i][j].setForeground(Color.BLUE);
rightBomb = 0;
restBomb = BombNum;
restBlock = BlockNum - BombNum;
}
}
for (int i = 0; i < BombNum; ) {
int x = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1));
int y = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1));
if (bombButton[x][y].isBomb != true) {
bombButton[x][y].isBomb = true;
i++;
}
}
CountRoundBomb();
}
/* 計算方塊周圍雷數 */
public void CountRoundBomb() {
for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {
for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {
int count = 0;
// 當需要檢測的單元格本身無地雷的情況下,統計周圍的地雷個數
if (bombButton[i][j].isBomb != true) {
for (int x = i - 1; x < i + 2; x++) {
for (int y = j - 1; y < j + 2; y++) {
if ( (x >= 0) && (y >= 0)
&& (x < ( (int) Math.sqrt(BlockNum)))
&& (y < ( (int) Math.sqrt(BlockNum)))) {
if (bombButton[x][y].isBomb == true) {
count++;
}
}
}
}
bombButton[i][j].BombRoundCount = count;
}
}
}
}
/* 是否挖完了所有的雷 */
public void isWin() {
restBlock = BlockNum - BombNum;
for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {
for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {
if (bombButton[i][j].isClicked == true) {
restBlock--;
}
}
}
if (rightBomb == BombNum || restBlock == 0) {
JOptionPane.showMessageDialog(this, "您挖完了所有的雷,您勝利了!", "勝利",
JOptionPane.INFORMATION_MESSAGE);
startBomb();
}
}
/** 當選中的位置為空,則翻開周圍的地圖* */
public void isNull(Bomb ClickedButton) {
int i, j;
i = ClickedButton.num_x;
j = ClickedButton.num_y;
for (int x = i - 1; x < i + 2; x++) {
for (int y = j - 1; y < j + 2; y++) {
if ( ( (x != i) || (y != j)) && (x >= 0) && (y >= 0)
&& (x < ( (int) Math.sqrt(BlockNum)))
&& (y < ( (int) Math.sqrt(BlockNum)))) {
if (bombButton[x][y].isBomb == false
&& bombButton[x][y].isClicked == false
&& bombButton[x][y].isRight == false) {
turn(bombButton[x][y]);
}
}
}
}
}
/* 翻開 */
public void turn(Bomb ClickedButton) {
ClickedButton.setEnabled(false);
ClickedButton.isClicked = true;
if (ClickedButton.BombRoundCount > 0) {
ClickedButton.setText(ClickedButton.BombRoundCount + "");
}
else {
isNull(ClickedButton);
}
}
/* 左鍵點擊 */
public void actionPerformed(ActionEvent e) {
if ( ( (Bomb) e.getSource()).isClicked == false
&& ( (Bomb) e.getSource()).isRight == false) {
if ( ( (Bomb) e.getSource()).isBomb == false) {
turn( ( (Bomb) e.getSource()));
isWin();
}
else {
for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {
for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {
if (bombButton[i][j].isBomb == true) {
bombButton[i][j].setText("b");
}
}
}
( (Bomb) e.getSource()).setForeground(Color.RED);
( (Bomb) e.getSource()).setFont(new Font("", Font.BOLD, 20));
( (Bomb) e.getSource()).setText("X");
JOptionPane.showMessageDialog(this, "你踩到地雷了,按確定重來", "踩到地雷", 2);
startBomb();
}
}
}
/* 右鍵點擊 */
public void mouseClicked(MouseEvent e) {
Bomb bombSource = (Bomb) e.getSource();
boolean right = SwingUtilities.isRightMouseButton(e);
if ( (right == true) && (bombSource.isClicked == false)) {
bombSource.BombFlag = (bombSource.BombFlag + 1) % 3;
if (bombSource.BombFlag == 1) {
if (restBomb > 0) {
bombSource.setForeground(Color.RED);
bombSource.setText("F");
bombSource.isRight = true;
restBomb--;
}
else {
bombSource.BombFlag = 0;
}
}
else if (bombSource.BombFlag == 2) {
restBomb++;
bombSource.setText("Q");
bombSource.isRight = false;
}
else {
bombSource.setText("");
}
if (bombSource.isBomb == true) {
if (bombSource.BombFlag == 1) {
rightBomb++;
}
else if (bombSource.BombFlag == 2) {
rightBomb--;
}
}
nowBomb.setText("當前雷數" + ":" + restBomb);
isWin();
}
}
public static void main(String[] args) {
Frame frame = new Frame();
frame.setVisible(true);
}
}
class Frame1_start_actionAdapter
implements ActionListener {
private Frame adaptee;
Frame1_start_actionAdapter(Frame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.start_actionPerformed(e);
}
}
////////////////////////////
class Bomb
extends JButton {
int num_x, num_y; // 第幾號方塊
int BombRoundCount; // 周圍雷數
boolean isBomb; // 是否為雷
boolean isClicked; // 是否被點擊
int BombFlag; // 探雷標記
boolean isRight; // 是否點擊右鍵
public Bomb(int x, int y) {
num_x = x;
num_y = y;
BombFlag = 0;
BombRoundCount = 9;
isBomb = false;
isClicked = false;
isRight = false;
}
}
class Bomb_actionAdapter
implements ActionListener {
private Frame adaptee;
Bomb_actionAdapter(Frame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.actionPerformed(e);
}
}
class Bomb_mouseAdapter
extends MouseAdapter {
private Frame adaptee;
Bomb_mouseAdapter(Frame adaptee) {
this.adaptee = adaptee;
}
public void mouseClicked(MouseEvent e) {
adaptee.mouseClicked(e);
}
}
⑨ 雷電模擬器的腳本源碼怎麼看
雷電模擬器的腳本源碼用按鍵精靈進行查看。
查看方法如下:
1、先點擊左邊的按鍵精靈腳本屬性,後寫腳本描述和腳本的文件名,方便以後查看腳本功能,在熱鍵欄裡面可以更改腳本啟動的熱鍵。
2、然後最小化其他窗口,這個時候將滑鼠移到需要打開的文件夾處。
3、回到腳本編輯窗口,點擊滑鼠命令,可以選擇源代碼查看這個命令的源代碼。
4、然後點擊兩行命令的中間,在其他命令裡面插入一個500毫秒的命令。
5、保存以後調試,成功後,按鍵精靈腳本源碼即使用成功。