java基礎(chǔ)教程之拼圖游戲的實(shí)現(xiàn)
前言
大家在初學(xué)java的時(shí)候,大部分的代碼都是在控制臺(tái)上運(yùn)行的.可能大家辛辛苦苦寫了幾十行代碼,最終就只是在控制臺(tái)輸出一個(gè)字符,這個(gè)時(shí)候,心里肯定是拔涼拔涼的,心中那一朵編程的火花,就馬上給撲滅了.我們都知道興趣是最好的老師.為了拯救大家快要熄滅的小火花,小編在這里給大家?guī)硎褂胘ava做個(gè)小游戲,并且通過做這個(gè)游戲,好好收悉一下面向?qū)ο蟮膶?shí)際使用.
廢話不多說,直接上效果圖:

1.所需技術(shù)
- java基礎(chǔ)
- java的GUI相關(guān)技術(shù)
2.具體實(shí)現(xiàn)
2.1 圖片制作
選擇你喜歡的一張圖片,(友情提示:圖片盡量在400*600 范圍內(nèi)),然后通過網(wǎng)上的在線分割圖片,或者你ps等其他軟件,把圖片分割為大小相等的12份.如下圖所示

推薦大家給小圖片取名按照: 大圖片的文件名-序號(hào) 這種方式命名,方便程序讀取
2.2 創(chuàng)建項(xiàng)目
使用idea或者是Eclipse創(chuàng)建一個(gè)java項(xiàng)目,小編使用的是idea,然后再項(xiàng)目下,創(chuàng)建一個(gè)image的目錄,把上一步的圖片復(fù)制到項(xiàng)目下的image目錄下:

2.3 編碼實(shí)現(xiàn)
我們首先創(chuàng)建一個(gè)勇于描述游戲中顯示的圖片的實(shí)體類:Picture類,代碼如下
public class Picture {
private String alisa;//別名
private String picPath;//預(yù)覽圖片的路徑
private String[] subPicPaths;//拼圖區(qū)的切片圖片路徑
//省略了setter/getter 構(gòu)造方法的代碼
}
這里我們就應(yīng)用了java的OOP思想,把游戲中的一個(gè)拼圖抽象成一個(gè)Picture類, 上圖左邊的小圖片對(duì)應(yīng)Picture類的subPicPaths屬性, 右邊的預(yù)覽圖對(duì)應(yīng)Picture類的picPath屬性,以及我們給這個(gè)拼圖取了一個(gè)名稱,對(duì)應(yīng)Picture的alisa屬性.
我們已經(jīng)封裝好了Picture類,接下來我們需要編寫我們的游戲主界面類 MainFrame,我們現(xiàn)在的程序不是運(yùn)行在控制臺(tái),而是運(yùn)行一個(gè)界面窗口,所有我們的主界面類必須實(shí)現(xiàn)Swing包下的JFrame類,JFrame簡單的理解就是一個(gè)游戲窗口.
public class MainFrame extends JFrame{
private String[] items = {"小熊","美女"};
private Map<String,Picture> picMap = new HashMap<>(); //游戲中的圖片
private static final long serialVersionUID = -3974891708686273202L;
private JComboBox<String> imgComboBox; //選擇圖片的下拉框
private PictureCanvasPanle canvasPanle; //拼圖區(qū)的面板
private PicturePreviewPanel previewPanle; //預(yù)覽區(qū)的面板
private JTextField nameTxt; //顯示圖片名詞的文本域
public static Picture selectedPicture; //被選中的圖片
private JButton startBtn; //開始按鈕
public static JTextField stepTxt; //顯示步數(shù)的文本域
//添加圖片
public void setMap(){
for(int i = 0; i < items.length;i++){
String[] subPaths = new String[12];
for(int j = 0; j < subPaths.length; j++){
subPaths[j] = "image/" +(i+1)+"-"+(j+1)+".jpg";
}
Picture pic = new Picture(items[i], "image/" +(i+1)+".jpg", subPaths);
picMap.put(pic.getAlisa(), pic);
}
}
//無參構(gòu)造方法,進(jìn)行界面的初始化
public MainFrame(){
setMap();
//初始化
init();
//添加組件
addComponent();
//添加拼圖和預(yù)覽
addPreview();
//給組件添加事件
addActionLisener();
}
//給界面上的組件綁定事件
private void addActionLisener() {
//給下拉框添加事件
imgComboBox.addActionListener(new ActionListener() {
@SuppressWarnings("unchecked")
@Override
public void actionPerformed(ActionEvent e) {
JComboBox<String> cbx = (JComboBox<String>) e.getSource();
selectedPicture = picMap.get(cbx.getSelectedItem());
previewPanle.setPath(selectedPicture.getPicPath());
nameTxt.setText("圖片名稱:"+cbx.getSelectedItem());
canvasPanle.changePictureCell();
previewPanle.repaint();
}
});
//給開始按鈕添加事件監(jiān)聽
startBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//把移動(dòng)的步數(shù)清零
canvasPanle.stepNum = 0;
stepTxt.setText("步數(shù):"+canvasPanle.stepNum);
//打亂拼圖區(qū)的小方塊
canvasPanle.start();
}
});
}
//添加預(yù)覽圖片
private void addPreview() {
JPanel mainPanle = new JPanel();
mainPanle.setLayout(new GridLayout(1,2));
canvasPanle = new PictureCanvasPanle();
previewPanle = new PicturePreviewPanel();
mainPanle.add(canvasPanle,BorderLayout.WEST);
mainPanle.add(previewPanle,BorderLayout.EAST);
this.add(mainPanle,BorderLayout.CENTER);
}
private void addComponent() {
//上部分的內(nèi)容
JPanel topPanel = new JPanel();
//設(shè)置布局器
topPanel.setLayout(new GridLayout(1,2));
//給上面板添加左右面板
//左面板
JPanel leftPanel = new JPanel();
//設(shè)置背景顏色
leftPanel.setBackground(Color.PINK);
leftPanel.setBorder(new TitledBorder("游戲設(shè)置區(qū)"));
//添加其他組件
//設(shè)置左邊的布局
leftPanel.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
//標(biāo)簽
JLabel infoLabel = new JLabel("選擇圖片: ");
leftPanel.add(infoLabel);
//設(shè)置下拉框
imgComboBox = new JComboBox<String>(items);
imgComboBox.setBackground(Color.PINK);
leftPanel.add(imgComboBox);
//設(shè)置添加按鈕
startBtn = new JButton("Start");
startBtn.setBackground(Color.PINK);
leftPanel.add(startBtn);
//添加
topPanel.add(leftPanel, BorderLayout.WEST);
//右面板
JPanel rightPanle = new JPanel();
rightPanle.setBackground(Color.PINK);
rightPanle.setBorder(new TitledBorder("游戲狀態(tài)區(qū)"));
rightPanle.setLayout(new GridLayout(1,2));
nameTxt = new JTextField("圖片名稱:小熊");
nameTxt.setEditable(false);
nameTxt.setBackground(Color.PINK);
stepTxt = new JTextField("步數(shù):0");
stepTxt.setEditable(false);
stepTxt.setBackground(Color.PINK);
rightPanle.add(nameTxt,BorderLayout.WEST);
rightPanle.add(stepTxt,BorderLayout.EAST);
topPanel.add(rightPanle, BorderLayout.EAST);
//把這個(gè)面板添加到窗口
this.add(topPanel,BorderLayout.NORTH);
}
private void init() {
//設(shè)置窗體的標(biāo)題
this.setTitle("拼圖游戲");
//設(shè)置窗體的大小
this.setSize(1000, 720);
//設(shè)置窗體在屏幕居中
this.setLocationRelativeTo(null);
//設(shè)置固定大小
this.setResizable(false);
//設(shè)置窗口的默認(rèn)關(guān)閉操作
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
selectedPicture = this.picMap.get(items[0]);
}
}此時(shí),我們已經(jīng)把游戲的主界面給搭建好了,但是這個(gè)主界面的游戲拼圖區(qū)和游戲預(yù)覽區(qū)的代碼還沒有實(shí)現(xiàn).并且我們還需要把游戲拼圖區(qū)中每一小塊的拼圖片也抽象成一個(gè)類,并且需要給每一個(gè)拼圖片綁定鼠標(biāo)事件.
由于篇幅有限,游戲拼圖區(qū)和游戲預(yù)覽區(qū)的代碼我們在下一篇文章給各位看官老爺展示,各位看官老爺也可以自己思考一下,后面的代碼的實(shí)現(xiàn)思路,并嘗試自己動(dòng)手.俗話說:"紙上得來終覺淺,絕知此事要躬行".
總結(jié)
到此這篇關(guān)于java基礎(chǔ)教程之拼圖游戲?qū)崿F(xiàn)的文章就介紹到這了,更多相關(guān)java拼圖游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot配置 Druid 三種方式(包括純配置文件配置)
本文給大家分享在項(xiàng)目中用純 YML(application.yml 或者 application.properties)文件、Java 代碼配置 Bean 和注解三種方式配置 Alibaba Druid 用于監(jiān)控或者查看 SQL 狀況的相關(guān)知識(shí),感興趣的朋友一起看看吧2021-10-10
java進(jìn)階解析Springboot上傳excel存入數(shù)據(jù)庫步驟
項(xiàng)目需要,寫了一個(gè),批量導(dǎo)入的接口。因?yàn)樾枰褂胑xcel去批量導(dǎo)入數(shù)據(jù),所以寫了一個(gè)例子,經(jīng)過測試已經(jīng)可以用于實(shí)際開發(fā),這里記錄一下2021-09-09
springboot json時(shí)間格式化處理的方法
這篇文章主要介紹了springboot json時(shí)間格式化處理的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
使用CXF和Jersey框架來進(jìn)行Java的WebService編程
這篇文章主要介紹了使用CXF和Jersey框架來進(jìn)行Java的WebService編程,Web service是一個(gè)平臺(tái)獨(dú)立的低耦合的自包含的基于可編程的web的應(yīng)用程序,需要的朋友可以參考下2015-12-12
java之scan.next()與scan.nextline()函數(shù)的使用及區(qū)別
這篇文章主要介紹了java之scan.next()與scan.nextline()函數(shù)的使用及區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Mybatis批量插入大量數(shù)據(jù)的最優(yōu)方式總結(jié)
批量插入功能是我們?nèi)粘9ぷ髦斜容^常見的業(yè)務(wù)功能之一,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Mybatis批量插入大量數(shù)據(jù)的幾種最優(yōu)方式,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03

