지뢰찾기 만들어봤습니다. 제 첫 완성작입니다. ㅎㅎㅎ
설계가 허접하니 나중에 가니껴맞추기 바뿌네요 ㅠㅠ
설계의 중요성을 뼈저리게 느꼈습니다ㅋ
주석이 없어서 올릴까 말까하다 함올려봅니다. ㅎㅎ
긁어 붙이기 구찮으실까봐 소스자료실에도 올렸구요ㅋ
태클걸어주심 좋구요~
답글로 태클걸어주심 정말 감사하겠습니다.ㅋ
코딩습관부터..전체적인 구조.. 객체지향적으로 자바특징을 살려짜려면... 모 암거나좋습니
다.^^; 쓴소리 부탁드림니다.~
public interface Protocol {
static final int TYPE_BEGINNER=101;
int TYPE_INTERMEDIATE=102;
int TYPE_EXPERT=103;
int TYPE_CUSTOMER=104;
int EMPTY=0;
int NUMBER=1;
int MINE=9;
int FLAG=10;
int MOUSE_LEFT=1;
int MOUSE_WHEEL=2;
int MOUSE_RIGHT=3;
int SIZE_MAX=50;
int SIZE_MIN=9;
int MINE_MIN=10;
}
===================================================
public class Ground implements Protocol {
private int gndHeight;
private int gndWidth;
private int ea_mine;
private int [][] ground;
public Ground() {
this.gndHeight=9;
this.gndWidth=9;
this.ea_mine=10;
}
public int getHeight() {
return gndHeight;
}
public int getWidth() {
return gndWidth;
}
public int getMineQuantity() {
return ea_mine;
}
public void setHeight( int height ) {
this.gndHeight=height;
}
public void setWidth( int width ) {
this.gndWidth=width;
}
public void setMineQuantity( int mineQuantity ) {
this.ea_mine=mineQuantity;
}
public void minusMineQuantity() {
this.ea_mine--;
}
public void plusMineQuantity() {
this.ea_mine++;
}
public String getMineQttStr() {
String mineQttStr = String.valueOf( this.ea_mine );
return mineQttStr;
}
public int getGndValue( int height,int width ) {
return ground[height][width];
}
public void setGndValue( int height,int width,int value ) {
ground[height][width]= value;
}
// 지뢰밭 셋팅-----------------------------------------
public void createGround( int height,int width ) {
setHeight( height );
setWidth( width );
ground = new int [gndHeight][gndWidth];
}
public void resetGround( int height,int width ) {
for( int i=0; i=0 && k=0 && l=SIZE_MIN && height<=SIZE_MAX && width>=SIZE_MIN && width<=SIZE_MAX && mineQuantity>=MINE_MIN && mineQuantity<=maxMine) )
//throw new InvalidSizeException( height, width, mineQuantity );
createGround( height,width );
resetGround( height,width );
setMine( maxMine,height,width );
setNumber( height,width );
mineDetector.repaint( type );
}
// 레벨별 사이즈 셋팅
public void setValidSize( int type ) {
switch( type ) {
case TYPE_BEGINNER :
setHeight( 9 );
setWidth( 9 );
setMineQuantity( 10 );
mineDetector.setFrameSize( (getHeight()*19+65), (getWidth()*18+10) );
currentLevel=TYPE_BEGINNER;
break;
case TYPE_INTERMEDIATE :
setHeight( 16 );
setWidth( 16 );
setMineQuantity( 40 );
mineDetector.setFrameSize( (getHeight()*19+65), (getWidth()*18+10) );
currentLevel=TYPE_INTERMEDIATE;
break;
case TYPE_EXPERT :
setHeight( 16 );
setWidth( 30 );
setMineQuantity( 99 );
mineDetector.setFrameSize( (getHeight()*19+65), (getWidth()*18+10) );
currentLevel=TYPE_EXPERT;
break;
case TYPE_CUSTOMER :
if( currentLevel==TYPE_CUSTOMER ) {
setHeight( getHeight() );
setWidth( getWidth() );
setMineQuantity( getMineQuantity() );
} else {
inputBox.showInputBox( "게임입력" );
setHeight( inputBox.getUserHeight() );
setWidth( inputBox.getUserWidth() );
setMineQuantity( inputBox.getUserMineQuantity() );
}
mineDetector.setFrameSize( (getHeight()*19+65), (getWidth()*18+10) );
currentLevel=TYPE_CUSTOMER;
break;
}
}
// 마우스왼쪽 클릭해서 버튼을열경우
public void mouseButtonHandler( int clickedMouse, int btnNum ) { // btnNum 은 0~80 (초급)
int height = btnNum/getWidth();
int width = btnNum%getWidth();
int value = getGndValue( height,width );
if( clickedMouse == MOUSE_LEFT ) { // 좌클릭 이벤트
if( value == EMPTY ) {
searchEmpty( height,width );
} else if( value>EMPTY && value=0 && value<= 9 ) {
mineDetector.viewFlag( btnNum , true );
minusMineQuantity(); //지뢰수-1
setGndValue( height,width,value+FLAG );
} else if( value>=10 && value<= 19 ) {
mineDetector.viewFlag( btnNum , false );
plusMineQuantity(); // 지뢰수 +1
setGndValue( height,width,value-FLAG ); // gnd값 flag 셋팅
}
mineDetector.setMineQuantity( "지뢰 : " + getMineQttStr() ); // mineDetector 의 버튼 지뢰표시
}
clearCheck(); // 게임 클리어여부 체크
}
public void clearCheck() {
int height = getHeight();
int width = getWidth();
int remainedMine = getMineQuantity();
int remainedButton = mineDetector.getRemainedButton( height, width );
// System.out.println( " remainedMine = " + remainedMine );
// System.out.println( " remainedButton = " + remainedButton );
if( (remainedMine==remainedButton) || (remainedMine==0 && remainedButton==0 ) )
mineDetector.clear( height,width );
// 지뢰가 0이고 체크안된 버튼이 없을경우
// 남은 지뢰갯수와 남은 버튼수가 같을경우
}
// 주위에 빈칸찾기
public void searchEmpty( int height,int width ) {
int value = getGndValue( height,width );
int btnNum = height*getWidth()+width;
mineDetector.hideButton( value,btnNum );
for( int i=height-1; i<=height+1; i++ )
for( int j=width-1; j<=width+1; j++ ) {
if( i>=0 && i=0 && j0 && getGndValue( i,j )<9 ) {
value = getGndValue( i,j );
btnNum = i*getWidth()+j;
mineDetector.hideButton( value,btnNum );
}
}
}
}
public void restart() {
try {
gameLevel( this.currentLevel );
} catch( Exception e ) { /* ignore it*/ }
}
}
===============================================
import java.awt.*;
import java.awt.event.*;
/*
MineDectector.java
04.12.30
*/
class MineDetector implements Protocol{
private MineSetting mineSetting;
private Frame f;
private Panel pNorth, pCenter;
private Label lb,lbMine;
private Button button[];
private Button bt;
private int [] frameSize = { 200,200 };
private GridBagConstraints c;
public MineDetector( MineSetting ms ) {
this.mineSetting=ms;
c = new GridBagConstraints();
init();
}
public void init() {
int height = mineSetting.getHeight();
int width = mineSetting.getWidth();
GridLayout gl = new GridLayout( height, width );
f = new Frame( "지뢰찾기" );
pNorth = new Panel();
pCenter = new Panel();
pCenter.setLayout( gl );
pCenter.setBackground( new Color( 33,00,60 ) );
//메뉴만들기
MenuBar mb = new MenuBar();
Menu gameMenu = new Menu( "게임" );
itemAdd( "초급", gameMenu );
itemAdd( "중급", gameMenu );
itemAdd( "고급", gameMenu );
itemAdd( "사용자정의", gameMenu );
gameMenu.addSeparator();
itemAdd( "최고기록", gameMenu );
gameMenu.addSeparator();
itemAdd( "종료", gameMenu );
mb.add( gameMenu );
f.setMenuBar(mb);
createButton( height, width ); //Button 생성
bt = new Button( "restart" );
bt.addActionListener( new ButtonHandler() );
pNorth.add( lbMine=new Label( "지뢰 : " + mineSetting.getMineQttStr() ) );
pNorth.add( bt );
//pNorth.add( lb=new Label( "시간" ) );
f.add( pNorth, BorderLayout.NORTH );
f.add( pCenter, BorderLayout.CENTER );
f.setSize( frameSize[0],frameSize[1] );
f.show();
f.addWindowListener( new WindowAdapter() { // windowListener
public void windowClosing( WindowEvent e ) {
terminate();
System.exit(0);
}
});
} // End of init();
// 메뉴아이템추가
public void itemAdd( String title, Menu m ) {
MenuItem mi = new MenuItem( title );
mi.addActionListener( new ButtonHandler() );
m.add( mi );
}
// 버튼만들기
public void createButton( int height, int width ) {
int arrLength = height*width;
button = new Button[arrLength];
// label = new Label[arrLength];
for( int i=0; i0 && value<19 )
hideButton( value, i );
button[i].setEnabled( false ); // 버튼 비활성화
}
System.out.println( "clear 깼다~~~~~~~`" );// testtest
// 시간정지 비교후 기록
}
// 게임 실패
public void failed( int height,int width ) {
int btnLength = height*width;
int value;
for( int i=0; iSIZE_MAX) || (userWidthSIZE_MAX) || (userMineQuantity
카페 게시글
자유게시판
지뢰찾기 만들어봤습니다.~
애자Club
추천 0
조회 740
05.01.11 15:56
댓글 3
다음검색
첫댓글 ㅎㅎ 그냥 만들었다고만 해주시고. ^^ 소스는 자료실에 올려주시면 더욱 좋을텐데요.. ^^ 자료실에 함더 올려주실래여? ^^
하핫.. 소스도 올리셨다고 하셨군요.. 죄송.. ㅎㅎ
^^;