Java는 주사위 놀이 미니 게임을 구현합니다.
package Gomoku; import javax.swing.JFrame; public class GomokuFrame extends JFrame { //작업 패널 정의 op=null; public GomokuFrame() { //이름 설정 this.setTitle("Gomoku " ); //창 크기 설정 this.setSize(510,510); //창 위치 설정//컴퓨터 화면 크기 가져오기 int computer_width=Toolkit.getDefaultToolkit().getScreenSize().width; intcomputer_height=Toolkit.getDefaultToolkit().getScreenSize().height; System.out.println("컴퓨터 화면 너비:/n"+computer_width+"/ ncomputer 화면 높이:/n"+computer_height); //가운데 this.setLocation((computer_width-510)/2, (computer_height-510)/2); //커튼 인스턴스화 op=new OperatorPane() //커튼 가져오기 this.add(op); 청취 중인 마우스 추가 this.addMouseListener(op); //창 표시 설정 this.setVisible(true); //창의 정상적인 닫기 설정 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) } //테스트 실행 public static void main(String[] args) { new GomokuFrame() } }
패키지 Gomoku; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; java.awt.image.BufferedImage;가져오기 java.awt.image.BufferedImageFilter; javax.swing.ImageIcon;import javax.swing.JOptionPane;import javax.swing.JPanel; JPanel 구현을 확장하는 OperatorPane, MouseListener,Runnable{ //배경 이미지 객체 정의 Image ImageBackground = null; 체커보드 그리드 int boardrows=18; //체스판 그리드의 열 수를 정의합니다. int boardcols=18; //체스판 그리드의 크기를 정의합니다. Boardsize=20; //체스 조각의 좌표를 저장합니다. int x=0,y=0; //이전에 플레이한 모든 체스 조각의 좌표를 저장합니다.//데이터 내용이 0: 현재 체스 조각이 없음을 의미합니다. point, 1: 이 점이 검은색 조각임을 의미합니다. 2: 이 점이 흰색 조각임을 나타냅니다. int allchess[][]=new int [19] [19]//다음 단계가 검은색인지 표시합니다. 또는 흰색 boolean isBlack=true; //게임을 계속할 수 있는지 판단합니다. boolean canPlay=true; //표시된 정보를 저장합니다. String message="Black goes first"; //최대 시간(초)을 저장합니다. int maxTime = 0; //카운트다운을 위한 스레드 클래스 Thread t = new Thread(this) //Black 남은 시간을 저장합니다. with White int blackTime = 0; int whiteTime = 0; // 양측의 남은 시간 표시 정보를 저장합니다. String blackMessage = "Unlimited" String whiteMessage = "Unlimited"; @SuppressWarnings("지원 중단") public OperatorPane() { t.start(); t.suspens(); imageBackground=new ImageIcon("image/Background.jpg").getImage() } public void Paint(그래픽 g) { //더블 버퍼링 기술 BufferedImage b1=new BufferedImage(495,475,BufferedImage.TYPE_INT_ARGB); Graphics g2=b1.createGraphics(); //배경 이미지 그리기 g2.drawImage(imageBackground, 0, 0,495,475,null) //체커보드 선 그리기 Color c=g2.getColor( ); g2.setColor(Color.BLACK); i=0;i<=boardrows;i++) { g2.drawLine(10,50+boardsize*i,10+boardsize*boardrows,50+boardsize*i) } for(int i=0;i<=boardcols; i++) { g2.drawLine(10+boardsize*i,50,10+boardsize*i,50+boardsize*boardcols) } //3-3 위치 그리기 g2.fillOval(67, 347, 6, 6) g2.fillOval(307, 107, 6, 6); ( 307, 347, 6, 6); //추가 점 그리기 g2.fillOval(67, 227, 6, 6); g2.fillOval(307, 227, 6, 6); g2.fillOval(187, 107, 6, 6); //Tianyuan g2를 그립니다. fillOval(187, 227, 6, 6); //텍스트 그리기 프롬프트/*Font f=new Font("黑体", Font.BOLD, 24); g.setFont(f);*/ g2.setFont(new Font("黑体", Font.BOLD, 20)); g2.drawString("게임 정보:"+message, 130, 40) g2.setFont(new Font("宋体", Font.ITALIC, 15)); g2.drawString("블랙 타임:"+blackMessage,25, 445); g2.drawString("화이트 타임:"+whiteMessage,245, 445); //모든 체스 말을 그립니다. for(int i= 0 ;i<=boardrows;i++) { for(int j=0;j<=boardcols;j++) { //블랙 체스 저장 if(allchess[i][j]==1) { int tempX=i*20-10; int tempY=j*20+30; //검은색 그리기 g2.setColor(Color.BLACK) g2.fillOval(tempX+12, tempY+13, 15, 15) ; //저장 흰색 체스 if(allchess[i][j]==2) { int tempX=i*20-10; tempY=j*20+30; //흰색 조각을 그립니다. g2.setColor(Color.BLACK) g2.drawOval(tempX+12, tempY+13, 15, 15); .fillOval(tempX+12, tempY+13, 15, 15) } } } g2.setColor(c); g.drawImage(b1,0,0,this); } private boolean checkWin() { boolean flag=false; int color = allchess[x][y]; same 해당 색상의 체스 조각이 몇 개 연결되어 있는지 확인합니다. int count2=1; int count3=1; // 가로 방향으로 연결된 체스 조각이 5개 있는지 확인합니다. 특성은 동일합니다. 즉, allChess[x][y]의 y 값은 동일합니다. // 루프를 사용하여 체스 말이 연결되어 있는지 확인합니다. int i = 1 while (color == allchess[x+i][y; ]) { count1++; i++; } / i 값 i = 1; while (color == allchess[xi][y]) { count1++; } if(count1 >= 5) //세로 방향을 판단합니다. 즉, allChess[x][y]의 x 값이 동일합니다. int j = 1 while (color == allchess[x][y+j]) { count2++; ; } //j 값 재설정 j = 1; while (color == allchess[x][yj]) { count2++; } if(count2>= 5) { flag = true } // "/" 정수 m1=1; int n1=1; while (color == allchess[x+m1][y+n1]) { count3++; n1++; -m1][y-n1]) { count3++; m1++; } if(count3>= 5) { flag = true } //경사 방향을 판단합니다. int m2=1; while (color == allchess[x+m2][y-n2]) { count4++; n2++; n2=1; x-m2][y+n2]) { count4++; n2++; } if(count4>= 5) { 플래그 = true } */ int count; //가로 판단 횟수=this.checkCount(1, 0, color); if(count>=5) { flag = true; } else { //가로 판단 횟수=this.checkCount(0, 1, color); (count>=5) { flag = true; } else { //기울기 "/" count=this.checkCount(1, 1, color); if(count>=5) { flag = true } else; 경사 "/" count=this.checkCount(1, -1, color); if(count>=5) { flag = true; } } } } return flag } private int checkCount(int xChange,int yChange,int color) =1; int tempX=xChange; while (color==allchess[x+xChange][y+yChange]) { count++; if(xChange!=0) { xChange++; } if(yChange!=0) { if(yChange<0) { yChange--; } else { yChange++ } } //xChange=tempX; (color==allchess[x-xChange][y-yChange]) { count++; if(xChange!=0) { xChange++; } if(yChange!=0) { if(yChange<0) { yChange--; } else { yChange++ } } } 반환 횟수 } public void mouseClicked(MouseEvent e) { System.out.println("x:" +e.getX()+"y:"+e.getY()); x=e.getX(); if(x>=10&&x<=(10+boardsize*boardrows+20)&&y>=50&&y<=(50+boardsize*boardcols+40)) { //System.out.println("포인트가 보드 위에 있습니다. "); ==0) { if(isBlack==true) { allchess[x][y]=1; isBlack=false; message="백의 차례"; } else { allchess[x][y]=2; isBlack =참; message="Black's Turn"; } // 이 체스 말이 다른 체스 말과 5번 연결되어 있는지, 즉 게임이 끝났는지 확인합니다. if(winFlag== true) { JOptionPane.showMessageDialog (this,"게임 종료!"+ (allchess[x][y]==1?"Black":"White")+"Win.") canPlay=false; JOptionPane.showMessageDialog(this, "현재 위치에 이미 체스 말이 있습니다. 다시 배치하십시오!") } } this.repaint() } //게임 시작 버튼을 클릭합니다. //새 게임을 다시 시작합니다. e.getX() >=400&&e.getX()<=470&&e.getY()>=80&&e.getY()<=110) { int result=JOptionPane.showConfirmDialog(this, "설정이 완료되었습니다. 게임을 다시 시작하시겠습니까?"); if(result==0) { //재시작 작업, allchess[][] 배열의 모든 정보는 0입니다. // 체스판 지우기 for (int i = 0; i < 19; i++) { for (int j = 0; j < 19; j++) { allchess[i][j] = 0; //다른 방법으로 allChess = new int[19][19]; blackTime = maxTime; whiteTime = maxTime; if (maxTime > 0) { blackMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600 * 60) + ":" + (maxTime - maxTime / 60 * 60) whiteMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600 * 60) + ":" + (maxTime - maxTime / 60 * 60) } else { blackMessage = "무제한" } message = "검은색이 먼저입니다"; isBlack = true; this.canPlay = true; //게임 설정 버튼 클릭 if(e.getX()>=400&&e.getX()<=470&&e.getY()>=130&&e.getY()<=160) { String input = JOptionPane .showInputDialog("입력하세요. 게임 최대 시간(단위: 분), 0을 입력하면 시간 제한이 없음을 의미: "); try { maxTime = Integer.parseInt(input) * 60; if (maxTime < 0) { JOptionPane.showMessageDialog(this, "정확한 정보를 입력하세요. 음수는 허용되지 않습니다!") } if (maxTime == 0) { int result = JOptionPane.showConfirmDialog(this, "설정" 완료, 게임을 다시 시작하시겠습니까?"); if (result == 0) { for (int i = 0; i < 19; i++) { for (int j = 0; j < 19; j++) { allchess[i][j] = 0; } } // 다른 방법 allChess = new int[19][19] message = "Black이 먼저입니다"; blackTime = maxTime; blackMessage = "제한 없음" this.canPlay = true } } if (maxTime > 0) { int result = JOptionPane.showConfirmDialog(this, "설정이 완료되었습니다. 게임을 다시 시작하시겠습니까?") if (result == 0) { for (int i = 0; i < 19; i++) { for (int j = 0; j < 19; j++) { allchess[i][j] = 0 } } // 또 다른 방법 allChess = new int[19][19] message = "검은색이 먼저입니다"; isBlack = true; blackTime = maxTime; blackMessage = maxTime / 3600 + ":" + (maxTime / 3600 * 60 ) + ":" + (maxTime - maxTime / 60 * 60) whiteMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600 * 60) + ":" + (maxTime - maxTime / 60 * 60); this.canPlay = true; } } catch (NumberFormatException e1) / TODO 자동 생성된 catch 블록 JOptionPane.showMessageDialog(this, "정보를 올바르게 입력하세요!"); //게임 설명 버튼 클릭 if(e.getX()>=400&&e.getX()<=470&&e.getY()>=180&&e.getY()<=210) { JOptionPane.showMessageDialog(this, "이것은 주사위 놀이 게임 프로그램에서는 검은색과 흰색이 차례로 체스를 두며 한 쪽이 연속으로 5개의 말에 도달하면 게임이 종료됩니다. "); } //패배 인정 버튼 클릭 if(e.getX()>=400&&e.getX()<=470&&e.getY()>=280&&e.getY()<=310) { int result=JOptionPane.showConfirmDialog (this,"패배를 인정하시겠습니까?") if (result == 0) { if (isBlack) { JOptionPane.showMessageDialog(this, "Black이 항복했습니다. 게임이 끝났습니다!"); } else { JOptionPane.showMessageDialog(this, "White가 항복했습니다. 게임이 끝났습니다!") } canPlay = false } } //정보 버튼 클릭 if(e.getX()>=400&&e.getX()<=470&&e.getY()>=330&&e.getY()<=360) { JOptionPane.showMessageDialog(this,"이 게임은 제공됩니다. 작성자: Nanmu 스튜디오에서 제작, 관련 질문이 있는 경우 www.yiyiinformation.com을 방문하세요."); } //종료 버튼 클릭 if(e.getX()>=400&&e.getX()<=470&&e.getY()>=380&&e.getY()<=410) { JOptionPane.showMessageDialog(this, "Game Over") ; System.exit(0); } } //************************// @Override public void mouseEntered(MouseEvent arg0) { // TODO 자동 생성된 메서드 스텁 } @Override public void mouseExited(MouseEvent arg0) { // TODO 자동 생성된 메서드 스텁 } @Override public void mousePressed(MouseEvent arg0) { // TODO 자동 생성된 메서드 스텁 } @Override public void mouseReleased (MouseEvent arg0) { // TODO 자동 생성된 메서드 스텁 } @Override public void run() { if (maxTime > 0) { while (true) { if (isBlack) { blackTime--; if (blackTime == 0) { JOptionPane.showMessageDialog(this, "Black이 시간 초과되었습니다. 게임이 끝났습니다! "); } } else { whiteTime--; if (whiteTime == 0) { JOptionPane.showMessageDialog(this, "화이트가 시간 초과되었습니다. 게임이 끝났습니다!"); } } blackMessage = blackTime / 3600 + ":" + (blackTime / 60 - blackTime / 3600 * 60) + ":" + (blackTime - blackTime / 60 * 60) whiteMessage = whiteTime / 3600 + ":" + (whiteTime / 60 - whiteTime / 3600 * 60) + ":" + (화이트타임 - 화이트타임 / 60 * 60); this.repaint(); try { Thread.sleep(1000) } catch (InterruptedException e) { // TODO 자동 생성된 catch 블록 e.printStackTrace() } System.out.println(blackTime) 화이트타임) } } } }
데모 사진:
이상이 이 글의 전체 내용입니다. 모든 분들이 자바를 능숙하게 마스터하는데 도움이 되었으면 좋겠습니다.