|
|
DownLoad MineSweeper.lzh(ソースコード付き) 遊び方: このゲームの目的は、地雷が隠れているマス目を開かずに、できるだけ早くすべての地雷を見つけることです。 地雷を掘り出すと、ゲームに負けます。 マス目をクリックすると、マス目が開きます。地雷を掘り出すと、ゲームに負けます。 マス目に番号が表示された場合、その数は周囲の 8 個のマス目に隠れている地雷の数を示しています。 地雷があると判断したマス目に印を付けるには、マス目を**右クリック**します マス目に地雷が隠れているかどうかが判断できない場合は、マウスの右ボタンでマス目を 2 度クリックすると、 マス目に疑問符 (?) が付きます。このマス目は、後で地雷の印を付けることも、マウスの右ボタンで 1 度か 2 度クリックして印を消すこともできます。 数字が表示されているマス目の周囲の地雷にすべて印を付けたら、**マウスの左右のボタン**で同時にそのマス目を クリックすると、周囲に残っているマス目が一度に開きます。 数字が表示されているマス目の周囲に印の付いていない地雷が残っている場合は、数字が表示されているマス目 をマウスの左右のボタンで同時にクリックすると、隣接する開いていないマス目が押し下げられるかまたは点滅します。 まとめ:左クリック マス目が開く 右クリック 印をつける 右Wクリック 疑問印をつける 左右ボタン 印を付けた場所がその場所において全て正しい場合隣接するマス目が全て開きます(超重要) 注意:Windowsに標準で添付されているマインスイーバーのレベルとは難易度が桁違いに難しいです ///////////////////////////////////////////////////////////////////////////////// // PSweeper / Win付属のMSweeperにに飽き足りたソルジャーPへ贈る難解版 // PSweep.java / I-ichirow Suzuki // import java.applet.Applet; import java.util.Random ; import java.awt.*; import java.net.URL; import java.net.MalformedURLException; //-------------------------------------------------------------------------- public class PSweep extends java.applet.Applet { //------------------------------------------------ private int[] bStr ; private int iEtat ; private int iCpt ; private Image buffer; private Graphics offScreen; private long startTick ; private Image[] img ; private int aWidth, aHeight; private int m_bgcolor = 0 ; public int m_mine = 99 ; public int m_ligne = 16 ; public int m_col = 30 ; private int iMax ; private Font wFont; private FontMetrics wMetrics; private int iPas, iX ; //------------------------------------------------ public String[][] getParameterInfo() { String[][] info = { { "bgImg", "String", "bgImage" }, { "bgcolor", "int", "bgColor" }, { "nbmine", "int", "nb de mine" }, { "nbcol", "int", "nb de col" }, { "nbligne", "int", "nb de ligne" }, { "font", "String", "Font Name" }, { "fontsize", "int", "Font Size" }, }; return info; } //------------------------------------------------ public void init() { String param; try { aWidth = size().width; aHeight = size().height; buffer = createImage (aWidth, aHeight); offScreen = buffer.getGraphics (); } catch (Exception e) { offScreen = null; } //---------------------------------------------------------------------- param = getParameter("nbmine"); if (param != null) m_mine = Integer.parseInt(param); //---------------------------------------------------------------------- param = getParameter("nbcol"); if (param != null) m_col = Integer.parseInt(param); //---------------------------------------------------------------------- param = getParameter("nbligne"); if (param != null) m_ligne = Integer.parseInt(param); //---------------------------------------------------------------------- param = getParameter("bgcolor"); if (param != null) m_bgcolor = Integer.parseInt(param); MediaTracker trk = new MediaTracker(this) ; //---------------------------------------------------------------------- param = getParameter("bImg"); img = new Image[13]; if (param != null) { for (int i = 0 ; i < 13 ; i++) { img[i] = getImage(getCodeBase(), param + (i) + ".gif"); trk.addImage(img[i], 0) ; } } else for (int i = 0 ; i < 13 ; i++) img[i] = null ; try { trk.waitForAll() ; } catch (InterruptedException e) { } //---------------------------------------------------------------------- param = getParameter("fontsize"); int iSize = 12 ; if (param != null) iSize = Integer.parseInt(param); param = getParameter("font"); if (param == null) param = new String("Serif") ; wFont = new Font(param, Font.BOLD, iSize); if (wFont == null) wFont = getFont() ; wMetrics = getFontMetrics(wFont); iPas = wMetrics.getHeight() * 2 ; newGame() ; } //---------------------------------------------------------------------- public void newGame() { Random a ; int i = 0 ; int j = 0 ; int iE ; a = new Random() ; iEtat = 0 ; iCpt = m_mine ; int k = 0 ; iMax = m_ligne*m_col ; bStr = new int[iMax] ; iX = (aWidth - (m_col * 15)) / 2 ; if ( (m_col * 15) > aWidth ) iX = 0 ; for (i = 0 ; i < iMax; i++) bStr[i] = 10 ; startTick = -1 ; i = 0 ; while ( i < m_mine) { j = (int)(iMax * a.nextDouble()) ; if ( (j < iMax) && (bStr[j] != 19 ) ) { iE = j % m_col ; bStr[j] = 19 ; i++ ; if (iE > 0) { k = j-1-m_col ; // -31 if ( k >= 0 ) if ( bStr[k] != 19 ) bStr[k] += 1 ; k = j - 1 ; // -1 if ( k >= 0 ) if ( bStr[k] != 19 ) bStr[k] += 1 ; k = j+m_col-1 ; // +29 if ( k < iMax ) if ( bStr[k] != 19 ) bStr[k] += 1 ; } k = j - m_col ; if ( k >= 0 ) if ( bStr[k] != 19 ) bStr[k] += 1 ; k = j + m_col ; if ( k < iMax ) if ( bStr[k] != 19 ) bStr[k] += 1 ; if (iE < (m_col-1)) { k = j-m_col+1 ; // -29 if ( k >= 0 ) if ( bStr[k] != 19 ) bStr[k] += 1 ; k = j + m_col + 1 ; // +31 if ( k < iMax ) if ( bStr[k] != 19 ) bStr[k] += 1 ; k = j + 1 ; // +1 if ( k < iMax ) if ( bStr[k] != 19 ) bStr[k] += 1 ; } } } repaint(); } //---------------------------------------------------------------------- public void start() { repaint(); } //---------------------------------------------------------------------- public boolean mouseDown(Event e, int x, int y){ int iC = (x-iX) / 15 ; int iL = (y-iPas) / 15 ; boolean rep = false ; if ( (x > ((aWidth/2)-20)) && (x < ((aWidth/2)+40)) && (y > (iPas/4)) && (y < (iPas*3/4) ) ) { URL clickDest ; try{ clickDest = new URL("http://www.kg-group.com/") ; getAppletContext().showDocument(clickDest, "rbl"); }catch(MalformedURLException mal){ System.out.println("Bad URL!"); } return(true) ; } if (iEtat == 1) { newGame() ; repaint() ; return(true); } if ( (y > iPas) && (x > iX) && (x < aWidth - iX)) if ( (e.modifiers & Event.META_MASK) == Event.META_MASK) { if ( bStr[(iL*m_col)+iC] > 9 ) { rep = true ; if ( bStr[(iL*m_col)+iC] < 20 ) { if (iCpt > 0) { bStr[(iL*m_col)+iC] += 10 ; iCpt-- ; } else showStatus(""); } else { bStr[(iL*m_col)+iC] -= 10 ; iCpt++ ; } } else rep = testCase((iL*m_col)+iC ) ; } else { if ( bStr[(iL*m_col)+iC] > 9) { if (startTick == -1) startTick = System.currentTimeMillis() ; bStr[(iL*m_col)+iC] -= 10 ; rep = true ; if (bStr[(iL*m_col)+iC] == 9) iEtat = 1 ; if (bStr[(iL*m_col)+iC] == 0) verifPos( (iL*m_col) + iC) ; } } if (rep) repaint() ; return(true); } //---------------------------------------------------------------------- public void verifPos(int j) { int iE = j % m_col ; int k ; if (iE > 0) { k = j - m_col -1 ; // -31 if ( k >= 0 ) if (( bStr[k] > 9 ) && ( bStr[k] < 20 ) ) { bStr[k] -= 10 ; if (bStr[k] == 0) verifPos( k ) ; } k = j - 1 ; // -1 if ( k >= 0 ) if (( bStr[k] > 9 ) && ( bStr[k] < 20 ) ) { bStr[k] -= 10 ; if (bStr[k] == 0) verifPos( k ) ; } k = j + m_col - 1 ; // +29 if ( k < iMax ) if (( bStr[k] > 9 ) && ( bStr[k] < 20 ) ) { bStr[k] -= 10 ; if (bStr[k] == 0) verifPos( k ) ; } } k = j - m_col ; if ( k >= 0 ) if (( bStr[k] > 9 ) && ( bStr[k] < 20 ) ) { bStr[k] -= 10 ; if (bStr[k] == 0) verifPos( k ) ; } k = j + m_col ; if ( k < iMax ) if (( bStr[k] > 9 ) && ( bStr[k] < 20 ) ) { bStr[k] -= 10 ; if (bStr[k] == 0) verifPos( k ) ; } if (iE < (m_col-1)) { k = j - m_col+1 ; // -29 if ( k >= 0 ) if (( bStr[k] > 9 ) && ( bStr[k] < 20 ) ) { bStr[k] -= 10 ; if (bStr[k] == 0) verifPos( k ) ; } k = j + m_col + 1 ; // +31 if ( k < iMax ) if (( bStr[k] > 9 ) && ( bStr[k] < 20 ) ) { bStr[k] -= 10 ; if (bStr[k] == 0) verifPos( k ) ; } k = j + 1 ; // +1 if ( k < iMax ) if (( bStr[k] > 9 ) && ( bStr[k] < 20 ) ) { bStr[k] -= 10 ; if (bStr[k] == 0) verifPos( k ) ; } } } public boolean testCase(int j) { int iE = j % m_col ; int i = 0 ; int k ; if (iE > 0) { k = j - m_col - 1 ; // -31 if ( k >= 0 ) if ( bStr[k] > 19 ) i++ ; k = j - 1 ; // -1 if ( k >= 0 ) if ( bStr[k] > 19 ) i++ ; k = j + m_col - 1 ; // +29 if ( k < iMax ) if ( bStr[k] > 19 ) i++ ; } k = j - m_col ; if ( k >= 0 ) if ( bStr[k] > 19 ) i++ ; k = j + m_col ; if ( k < iMax ) if ( bStr[k] > 19 ) i++ ; if (iE < (m_col-1) ) { k = j - m_col + 1 ; // -29 if ( k >= 0 ) if ( bStr[k] > 19 ) i++ ; k = j + m_col + 1 ; // +31 if ( k < iMax ) if ( bStr[k] > 19 ) i++ ; k = j + 1 ; // +1 if ( k < iMax ) if ( bStr[k] > 19 ) i++ ; } if (i == bStr[j]) { verifPos(j) ; return true ; } else return false ; } //---------------------------------------------------------------------- public void paint (Graphics g) { update(g); } //---------------------------------------------------------------------- public synchronized void update(Graphics g) { if (offScreen!=null) { paintApplet(offScreen); g.drawImage(buffer,0,0,this); } else paintApplet(g); } //---------------------------------------------------------------------- public void paintApplet(Graphics g) { int i = 0 ; int j = 0 ; int a = 0 ; int k = 0 ; g.setColor( new Color(m_bgcolor) ); g.fillRect(0, 0, aWidth, aHeight) ; for (i = 0 ; i < m_ligne; i++) { for (j = 0 ; j < m_col; j++) { a = bStr[(i*m_col)+j] ; if ( (iEtat == 0) && (a == 9) ) iEtat = 1 ; if (iEtat == 1) { if (a == 19) a = 9 ; if ((a > 19) && (a != 29) ) { iEtat = 1 ; a = 41 ; } } if (a > 40) a = 12 ; else if (a > 19) a = 11 ; else if (a > 9) { a = 10 ; k++; } if (img[a] != null) g.drawImage(img[a], iX+(j*15), iPas + (i*15) , this) ; } } long thisTick ; if (startTick != -1) thisTick = (System.currentTimeMillis() - startTick ) / 1000; else thisTick = 0 ; g.setColor( new Color(0) ); g.fill3DRect(iPas, iPas/4, iPas, iPas/2, true ) ; g.fill3DRect(aWidth-iPas-iPas, iPas/4, iPas, iPas/2, true ) ; g.setFont( wFont ); g.setColor( Color.green ); g.drawString (" " + iCpt, iPas+5, iPas*2/3 ) ; g.drawString (" " + thisTick, aWidth-iPas-iPas+5, iPas*2/3 ) ; g.setColor( Color.black ); if (k == 0) { iEtat = 1 ; g.drawString (" " + iCpt, iPas+5, (iPas*2/3) ) ; g.drawString ("You Win", (aWidth/2)-5, (iPas*2/3) ) ; } else if (iEtat == 1) g.drawString ("You Lose", (aWidth/2)-5, (iPas*2/3) ) ; else { g.setColor( new Color(0xC0C0C0) ); g.fill3DRect( (aWidth / 2)-20, iPas/4, 40, iPas/2, true) ; g.setColor( new Color(0) ); g.drawString ("?", (aWidth/2)-3, (iPas*2/3) ) ; } } } |