java實(shí)現(xiàn)九宮格游戲
本文實(shí)例為大家分享了java實(shí)現(xiàn)九宮格游戲的具體代碼,供大家參考,具體內(nèi)容如下
代碼思路:
創(chuàng)建了一個(gè)九宮格按鈕類(lèi)(繼承了JButton),定義了一個(gè)九宮格類(lèi),先隨機(jī)生成8個(gè)數(shù),用網(wǎng)格排版放入9個(gè)格子,然后在游戲創(chuàng)建了3x3的矩陣用于存儲(chǔ)狀態(tài),再對(duì)每個(gè)按鍵加監(jiān)聽(tīng)器,當(dāng)按下去時(shí)判斷能否移動(dòng),能移動(dòng)則交換空格和這個(gè)按鈕的名字,每次按下去判斷是否從1-8排布,判斷是否贏。
由于隨機(jī)生成的排序,所以沒(méi)有考慮到無(wú)解的情況。如果要使有解,可以對(duì)于12345678這樣的排列,逆序?qū)?,因此為偶排列,我們對(duì)其中的任意兩個(gè)數(shù)進(jìn)行交換一次,奇偶性對(duì)調(diào),變成奇排列,再交換一次又變成偶排列,因此你可以初始化游戲時(shí),通過(guò)對(duì)12345678進(jìn)行偶數(shù)次有效移動(dòng)即可。
代碼
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ù)指定字體名稱(chēng)、樣式和磅值大小,創(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)聽(tīng)器
}
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];//移動(dòng)坐標(biāo)
boolean Move(int x,int y) {//是否可以移動(dòng)
int [][]Flag = {//四個(gè)方向
{-1,0},{0,1},{1,0},{0,-1}
};
for(int i=0;i<4;i++) {//判斷四個(gè)方向是否可以移動(dòng)
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) {//有空格,可以移動(dòng)
move[0]=xi;
move[1]=yi;
return true;
}
}
return false;//是否不可以運(yùn)動(dòng)
}
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 自動(dòng)生成的方法存根
//((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("可以移動(dòng)");
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("不可以移動(dòng)");
}
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 自動(dòng)生成的方法存根
Box b = new Box();
}
}
運(yùn)行結(jié)果:


更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專(zhuān)題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Native 基礎(chǔ)環(huán)境搭建過(guò)程
Spring?Native可以通過(guò)GraalVM將Spring應(yīng)用程序編譯成原生鏡像,提供了一種新的方式來(lái)部署Spring應(yīng)用,本文介紹Spring?Native基礎(chǔ)環(huán)境搭建,感興趣的朋友跟隨小編一起看看吧2024-02-02
Hadoop環(huán)境配置之hive環(huán)境配置詳解
這篇文章主要介紹了Hadoop環(huán)境配置之hive環(huán)境配置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
使用Mybatis時(shí)SqlSessionFactory對(duì)象總是報(bào)空指針
本文主要介紹了使用Mybatis時(shí)SqlSessionFactory對(duì)象總是報(bào)空指針,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09
關(guān)于dubbo的RPC和RESTful性能及對(duì)比
這篇文章主要介紹了關(guān)于dubbo的RPC和RESTful性能及對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
詳解JavaWeb過(guò)濾器 Filter問(wèn)題解決
過(guò)濾器就是對(duì)事物進(jìn)行過(guò)濾的,在Web中的過(guò)濾器,當(dāng)然就是對(duì)請(qǐng)求進(jìn)行過(guò)濾,我們使用過(guò)濾器,就可以對(duì)請(qǐng)求進(jìn)行攔截,然后做相應(yīng)的處理,實(shí)現(xiàn)許多特殊功能,今天主要給大家講解JavaWeb過(guò)濾器 Filter問(wèn)題解決,感興趣的朋友一起看看吧2022-10-10
java開(kāi)發(fā)線上事故理解RocketMQ異步精髓
這篇文章主要介紹了java開(kāi)發(fā)線上事故理解RocketMQ異步精髓2022-07-07
Java異或運(yùn)算應(yīng)用場(chǎng)景詳解
這篇文章主要給大家介紹了關(guān)于Java異或運(yùn)算應(yīng)用場(chǎng)景的相關(guān)資料,異或運(yùn)算會(huì)應(yīng)用在很多算法題中,這里整理了幾個(gè)最常見(jiàn)的應(yīng)用場(chǎng)景,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
哈希表在算法題目中的實(shí)際應(yīng)用詳解(Java)
散列表(Hash?table,也叫哈希表)是根據(jù)關(guān)鍵碼值(Key?value)而直接進(jìn)行訪問(wèn)的數(shù)據(jù)結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于哈希表在算法題目中的實(shí)際應(yīng)用,文中介紹的方法是Java,需要的朋友可以參考下2024-03-03

