溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用java實(shí)現(xiàn)一個(gè)九宮格游戲

發(fā)布時(shí)間:2020-11-02 15:01:41 來源:億速云 閱讀:190 作者:Leah 欄目:開發(fā)技術(shù)

今天就跟大家聊聊有關(guān)使用java實(shí)現(xiàn)一個(gè)九宮格游戲,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

代碼思路:

創(chuàng)建了一個(gè)九宮格按鈕類(繼承了JButton),定義了一個(gè)九宮格類,先隨機(jī)生成8個(gè)數(shù),用網(wǎng)格排版放入9個(gè)格子,然后在游戲創(chuàng)建了3x3的矩陣用于存儲狀態(tài),再對每個(gè)按鍵加監(jiān)聽器,當(dāng)按下去時(shí)判斷能否移動,能移動則交換空格和這個(gè)按鈕的名字,每次按下去判斷是否從1-8排布,判斷是否贏。
由于隨機(jī)生成的排序,所以沒有考慮到無解的情況。如果要使有解,可以對于12345678這樣的排列,逆序?qū)?,因此為偶排列,我們對其中的任意兩個(gè)數(shù)進(jìn)行交換一次,奇偶性對調(diào),變成奇排列,再交換一次又變成偶排列,因此你可以初始化游戲時(shí),通過對12345678進(jìn)行偶數(shù)次有效移動即可。

代碼

Play.java

package game;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Random;

import javax.swing.*;
import java.util.*;
class Number extends JButton{//按鍵
 Number(int x,int y,String name){
 super(name);
 this.name=name;
 this.x=x;
 this.y=y;
 }
 private String name;
 private int x;//所在位置的x
 private int y;//所在位置的y
 String GetName() {
 return name;
 }
 int GetX() {
 return x;
 }
 int GetY() {
 return y;
 }
}

//九宮格
class Box extends JFrame{
/*
 * 成員變量
 */
 Number []n;//方塊
 int [][]A=new int[3][3];//地圖
 Box(){//初始化
 
 super("九宮格");
 final int N = 9;
 setSize(500,500);
 
 Container c = getContentPane();
 setLayout(new GridLayout(3,3));
 
 n = new Number[N];
 Font f=new Font("華文行楷",Font.BOLD,20);//根據(jù)指定字體名稱、樣式和磅值大小,創(chuàng)建一個(gè)新 Font。
 Init();
 for(int i=0;i<N-1;i++) {
  n[i]=new Number(i/3,i%3," "+(Rand[i]));
  n[i].setBackground(Color.yellow);
  n[i].setFont(f);
  c.add(n[i]);
  
  n[i].addActionListener(new Change());//添加監(jiān)聽器
 }
 
 
 n[N-1]=new Number(2,2,"");//空格
 n[N-1].setBackground(Color.yellow);
 n[N-1].setFont(f);
 n[N-1].addActionListener(new Change());
 c.add(n[N-1]);
 for(int i=0;i<A.length;i++) {
  for(int j=0;j<A[i].length;j++) {
  if(i==2&&j==2) {
   continue;
  }
  A[i][j]=Rand[i*3+j];
  }
 }
 A[2][2]=0;
 for(int i=0;i<A.length;i++) {
  for(int j=0;j<A[i].length;j++) {
  System.out.print(A[i][j]+" ");
  }
  System.out.println();
 }
 
 setVisible(true);
 }
 int []Rand;
 void Init() {//生成1-8的隨機(jī)數(shù)
 Rand = new int[8];//隨機(jī)數(shù)
 Random r = new Random(1);
 
 int n;
 LinkedList<Integer> l = new LinkedList<Integer>();
 for(int i=1;i<=8;i++) {
  n = r.nextInt(8);
  n=(int)(Math.random()*8);
  n = n+1;
  while(l.contains(n)) {
  n = (int)(Math.random()*8);
  n = n +1;
  }
  l.add(n);
 }
 for (int i = 0; i < l.size(); i++) {
      Rand[i]=l.get(i);
      
      System.out.println(Rand[i]);
    }
 }
 
 int []move=new int[2];//移動坐標(biāo)
 boolean Move(int x,int y) {//是否可以移動
 int [][]Flag = {//四個(gè)方向
  {-1,0},{0,1},{1,0},{0,-1}
 };
 for(int i=0;i<4;i++) {//判斷四個(gè)方向是否可以移動
  int xi,yi;
  xi=x+Flag[i][0];
  yi=y+Flag[i][1];
  if(xi>=0&&xi<=2&&yi>=0&&yi<=2&&A[xi][yi]==0) {//有空格,可以移動
  move[0]=xi;
  move[1]=yi;
  return true;
  }
 }
 return false;//是否不可以運(yùn)動
 }
 
 boolean Win() {//是否贏
 boolean flag=true;
 
 for(int i=0;i<3;i++) {
  for(int j=0;j<3;j++) {
  System.out.print(A[i][j]+" ");
  if(i==2&&j==2) {
   if(A[i][j]!=0)
   flag = false;
  }
  else{
   if((A[i][j]!=i*3+j+1))
   flag=false;
  }
  }
  System.out.println();
 }
 if(flag) {
  System.out.println("你贏了");
 }
 return flag;
 }
 class Change implements ActionListener{

 @Override
 public void actionPerformed(ActionEvent e) {
  // TODO 自動生成的方法存根
  //((Number)e.getSource()).setText("取消");
  int x=((Number)e.getSource()).GetX();
  int y=((Number)e.getSource()).GetY();
  System.out.print(x+" "+y+"|||");
  String s = ((Number)e.getSource()).GetName();
  System.out.print(s);
  if(Move(x,y)) {
  System.out.println("可以移動");
  int t = A[x][y];
  System.out.print(t);
  A[x][y]=0;
  A[move[0]][move[1]]=t;
  
  System.out.println(move[0]+" "+move[1]);
  ((Number)e.getSource()).setText("");
  System.out.println(t);
  n[move[0]*3+move[1]].setText(t+" ");
  }
  else {
  System.out.println("不可以移動");
  }
  if(Win()) {
  int res = JOptionPane.showConfirmDialog(null, "GameWin", "你贏了,是否繼續(xù)", JOptionPane.YES_NO_OPTION);
  if (res == JOptionPane.YES_OPTION) {
   new Box();
  } else {
   return;
  }
  }
 }
 
 }
}

public class Play {

 public static void main(String[] args) {
 // TODO 自動生成的方法存根
 Box b = new Box();
 
 }

}

看完上述內(nèi)容,你們對使用java實(shí)現(xiàn)一個(gè)九宮格游戲有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI