Internet Start Page  TOP  
 Road of Developers
 
 


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) ) ;
		  }
  }
}
インターネットスタートページ 鈴木維一郎 石橋三重子
         
               
                   


©2000 kg-group Inc.