자바 버 전 2048 게임 기능 구현

6708 단어 자바2048 게임
본 논문 의 사례 는 자바 가 2048 게임 기능 을 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
기능 요구:2048 의 기본 인터페이스 로 2048 의 게임 기능 을 실현 할 수 있 습 니 다.
총 사고방식:두 가지 유형:Game 과 GameListener.
Game 은 인터페이스의 실현 과 paint 방법의 재 작성 을 책임 집 니 다.
GameListener 는 키보드 와 마우스 이벤트 처 리 를 담당 합 니 다.이동 방법,더하기 방법,승부 판단 과 난수 의 출현 은 모두 키보드 감청 방법 에서 이 루어 져 야 한다.
실현 분석:2048 게임 을 실현 하려 면 먼저 2048 에 무엇이 있 는 지 고려 해 야 한다.
인터페이스 구현:
2048 의 게임 화면 은 매우 간단 하 다.바로 사각형 과 숫자 이다.이러한 인터페이스 를 실현 하려 면 자바 의 그래 픽 기능 을 사용 하 는 것 을 고려 해 볼 수 있다.구체 적 으로 JFrame 클래스 가 제공 하 는 Graphics 대상 을 사용 하여 그림 을 그 리 는 것 이다.2048 인터페이스 는 큰 사각형 배경 과 숫자 를 포함 한 많은 작은 사각형 으로 구성 된다.Graphics 대상 의 사각형 그리 기 방법 은 배경 과 작은 사각형 그리 기 를 실현 할 수 있 습 니 다.작은 칸 안의 숫자 는 graphics 의 drawString 방법 으로 그 릴 수 있 습 니 다.그림 을 그 릴 때 색상 만 주의 하면 됩 니 다.인터페이스 가 실현 되 려 면 주로 JFrame 류 입 니 다.
기본 인터페이스 에서 코드 를 실현 하 는 것 은 버튼 과 같은 것 일 뿐 할 말 이 없다.

private void initUI() {
 setTitle("2048");
 setDefaultCloseOperation(3);
 setSize(600, 700);
 setLocationRelativeTo(null);
 this.setLayout(null);
 //    
 jl2 = new JLabel("  :0");
 jl2.setFont(new Font("  ", Font.BOLD, 30));
 jl2.setBounds(20, 30, 200, 50);
 this.add(jl2);
 //      
 ImageIcon start=new ImageIcon("res/start.png");//      ,      
 startJB=new JButton(start);
 startJB.setBounds(280, 40, 120, 30);
 startJB.setFocusable(false);
 startJB.setBorderPainted(false);//         
 startJB.setFocusPainted(false);
 startJB.setContentAreaFilled(false);//            
 
 //       
 ImageIcon back=new ImageIcon("res/backicon.png");//      ,      
 backJB=new JButton(back);
 backJB.setBounds(430, 40, 120, 30);
 backJB.setFocusable(false);
 backJB.setBorderPainted(false);
 backJB.setFocusPainted(false);
 backJB.setContentAreaFilled(false);
 
 this.add(startJB);
 this.add(backJB);
 setVisible(true);
 GameListener gl = new GameListener(this, arry, jl2,startJB,backJB);
 addKeyListener(gl);
 startJB.addActionListener(gl);
 backJB.addActionListener(gl);
 }
격자 와 숫자 그리 기:
격자 와 숫자 그리 기 역시 JFrame 의 캔버스 대상 을 사용 하여 사각형 을 그 리 는 방법 으로 이 루어 집 니 다.

public void buffPaint(Graphics g) {
 Image image = createImage(600, 600);
 Graphics g2 = image.getGraphics();
 g2.setColor(Color.LIGHT_GRAY);
 Graphics2D g2d = (Graphics2D) g2;
 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
  RenderingHints.VALUE_ANTIALIAS_ON);
 g2.fillRoundRect(0, 0, Draw2048.RD, Draw2048.RD, 20, 20);
 g2.setColor(Color.GRAY);
 for (int r = 0; r < arry.length; r++) {
  for (int c = 0; c < arry[r].length; c++) {
  g2.fillRect(20 + c * (Draw2048.D + Draw2048.space), 20 + r
   * (Draw2048.D + Draw2048.space), Draw2048.D, Draw2048.D);
  }
 }
 for (int r = 0; r < arry.length; r++) {
  for (int c = 0; c < arry[r].length; c++) {
  if (arry[r][c] != 0) {
   g2.setColor(255, 250, 240);
   g2.fillRect(20 + c * (Draw2048.D + Draw2048.space), 20 + r
    * (Draw2048.D + Draw2048.space), Draw2048.D,
    Draw2048.D);
   g2.setColor(new Color(0, 191, 255));
   g2.setFont(new Font("  ", Font.BOLD, Draw2048.FSIZE));
   g2.drawString(arry[r][c] + "", 50 + c
    * (Draw2048.D + Draw2048.space), 90 + r
    * (Draw2048.D + Draw2048.space));
  }
  }
 }
 g.drawImage(image, 50, 150, this);
 }
Draw 2048 은 격자 그리 기 에 관 한 상수,D 격자 길이,space 격자 사이 의 간격 을 정의 하 는 인터페이스 입 니 다.RD 배경 큰 사각형 의 길이 입 니 다.인 터 페 이 스 를 사용 하 는 장점 은 인터페이스의 변경(예 를 들 어 5*5 칸 으로 변경)을 더욱 편리 하 게 실현 하고 프로그램의 확장 성 을 향상 시 키 는 것 이다.또한 인터페이스 가 계속 업데이트 되 어야 하기 때문에 paint 방법 으로 끊임없이 다시 그 려 야 합 니 다.이 그림 을 paint 방법 에 직접 쓰 면 화면 이 계속 반 짝 거 릴 수 있 습 니 다.여기 서 해결 방안 은 그림 버퍼 를 사용 하 는 것 입 니 다.먼저 그림 에 그림 을 그 려 서 그림 을 한꺼번에 그 리 는 것 입 니 다.그러면 인터페이스의 반 짝 임 문제 가 발생 하지 않 습 니 다.
이동 실현:
네모 난 칸 을 움 직 이려 면,고려 할 수 있 는 방법 은 화판 을 다시 그 리 는 것 이다.격자 안의 숫자 는 2 차원 배열 로 저장 합 니 다.이동 할 때마다 배열 의 값 을 바 꾸 면 됩 니 다.그리고 배열 의 값 에 따라 데 이 터 를 인터페이스 에 그립 니 다.물론 게임 을 할 때 의 념 으로 조작 해 서 는 안 된다.우 리 는 입력 장치,즉 키보드 가 필요 하 다.그래서 인터페이스 에 키보드 감청 을 넣 어야 합 니 다.사용자 가 서로 다른 키 를 누 르 면 서로 다른 이동 알고리즘 을 실현 합 니 다.주의해 야 할 것 은 감청 류 에서 해당 하 는 모 바 일 알고리즘 을 작성 할 때 순환 적 인 사용 과 끝(특히 break 문장의 사용)을 정리 해 야 합 니 다.그렇지 않 으 면 다양한 bug 가 발생 할 수 있 습 니 다.이동 실현 은 키 리스터 클래스 를 사용 해 야 합 니 다.
다음은 위로 이동 하 는 실현 이 고 다른 방향의 이동 이 많 지 않 으 니 스스로 생각해 보면 된다.

//       
for (int r = 0; r < arry.length; r++) 
  for (int c = 0; c < arry[r].length; c++) {
   if (arry[r][c] > max)//       ,             2048
   max = arry[r][c];
   if (arry[r][c] == 0) {
   for (int r1 = r + 1; r1 < arry[c].length; r1++) 
    if (arry[r1][c] != 0) {
    arry[r][c] = arry[r1][c];
    arry[r1][c] = 0;
    count++;//        ,             
    break;
    }
     }
  }
이중 순환 을 통 해 모든 값 을 순환 하고 0 이면 위로 이동 할 수 있 습 니 다.이 값 이 있 는 열 을 옮 겨 다 니 며 0 이 아 닌 첫 번 째 값 을 찾 아 이 값 을 이동 합 니 다(즉,두 수의 값 을 교환 합 니 다).이동 후 내부 순환 을 종료 하고 다음 값 을 계속 옮 겨 다 닙 니 다.
숫자의 더하기:
독립 된 알고리즘 을 사용 하여 배열 을 옮 겨 다 니 며 이동 방향 에 있 는 인접 수 두 개 를 더 한 다음 하 나 를 0 으로 설정 합 니 다.이곳 의 알고리즘 실현 은 이동 알고리즘 과 매우 비슷 하고 주의해 야 할 부분 도 역시 break 와 순환 의 사용 이다.또 주의해 야 할 것 은 숫자 를 더 하면 숫자 가 이동 하기 전에 완성 해 야 한 다 는 것 이다.그렇지 않 으 면 이동 후의 숫자 빈 칸 이 나타 날 것 이다.

//       
for (int r = 0; r < arry.length; r++)
 for (int c = 0; c < arry[r].length; c++)
 if (arry[r][c] != 0)
  for (int c1 = c + 1; c1 < arry[r].length; c1++)
  if (arry[r][c] == arry[r][c1]) {
   arry[r][c] *= 2;
   score += arry[r][c];
   arry[r][c1] = 0;
   count++;//        ,           。
   break;
   } else if (arry[r][c1] != 0) {
   break;
   }
마찬가지 로 배열 의 모든 값 을 옮 겨 다 니 는 것 입 니 다.이 값 이 0 이 아니라면 줄 에 있 는 같은 값 을 찾 아 더 하면 가장 안쪽 순환 을 끝 냅 니 다.인접 한 두 값 이 다 르 면,최 내층 순환 도 끝난다.두 브레이크 문장의 사용 은 숫자 간 의 도약 을 피 했다.
승패 의 판단:
2048 이 기 는 규칙 은 숫자 를 더 해 2048 이 나 오기 때문에 배열 에 2048 과 같은 숫자 가 있 는 지 판단 하면 되 고 있 으 면 그 에 따 른 승리 정 보 를 출력 하 는 것 이다.
2048 의 지 는 규칙 은 인터페이스 가 가득 차 있다 는 것 이다(배열 이 가득 차 있 고 이동 할 수 없 으 며 추 가 된 숫자).개인 적 인 판단 방법 은 전역 변수 count 에 배열 이 가득 찼 는 지 판단 하 는 것 입 니 다.count 가 0 과 같 으 면 이동 할 수 없고 더 할 수 없 음 을 나타 내 며,배열 이 가득 찬 조건 에 맞 춰 유저 가 이미 졌 음 을 판단 할 수 있 습 니 다.
무 작위 숫자의 출현:
무 작위 숫자 가 나타 나 는 조건 은 이동 이나 더하기 가 발생 하기 때문에 count 를 사용 하 라 고 판단 합 니 다.조건 이 성립 되면 상응하는 알고리즘 을 호출 하여 실현 한다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기