今天为大家分享一个java语言编的拼图游戏,目前系统已经完成了主要功能,后续会进一步完善。整个系统界面漂亮,有完整得源码,希望大家可以喜欢。喜欢的帮忙点赞和关注。一起编程、一起进步
开发环境
开发语言为Java,开发环境Eclipse或者IDEA都可以,数据为MySQL。运行主程序,或者执行打开JAR文件即可以运行本程序。
系统框架
利用JDK自带的SWING框架开发,下载。纯窗体模式,直接运行Main文件即可以。同时带有详细得设计文档。
主要功能
游戏玩法
拼图游戏内容由若干小图像块组成的,其中有一个空白的小图像块,该图像块是来与别的图像块交换的,以此来实现大图像的拼凑。在Java标准环境下运行,通过鼠标点击图像块上下左右移动,完成大图像的拼凑。通过所创建的窗体类、菜单、中间面板和左右面板完成设计拼图的交互界面 ,实现游戏登录、开始游戏、退出游戏、选择图片、图片缩放、图片分割、调整难易度、计数计时、打乱图片、判断拼图成功等功能。游戏可以通过对图片文件的读取和加载,从多张图片中选择来进行拼图游戏,通过设置图像块的个数来实现对游戏难易度的调整,最后将游戏完成后所用时间和步数记录到游戏记录中,方便用户查看游戏记录。
程序启动方法
1 在SRC目录下,找到GAME包,对MedleyGame.java文件运行Run as Application
2 弹出拼图界面,点击开局,开始完游戏
主要模块
1 一轮游戏有5张图片需要完成拼凑
2 面板的左上角有一张图片,是原图,一张图,随机分成12个小图
3 双击两个小图,完成交换位置。直到12个小图合成的图片和左上角的图片一摸一样的时候,该张图片完成拼接。
4 点下一张图片,开始下轮图片的拼接,直到5张图片都完成。5张图片分别如下:
实现效果
关键代码
public class MedleyGame extends JFrame {
private JLabel modelLabel;
private JPanel centerPanel;
private JButton emptyButton;
int num = 0;
public static void main(String[] args) {
try {
MedleyGame frame = new MedleyGame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
//建立窗口构造方法
public MedleyGame() {
super();
setResizable(false);
setTitle("拼图游戏");
setBounds(100, 100, 370, 525);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//创建面板对象,并增加边框、布局
final JPanel topPanel = new JPanel();
topPanel.setBorder(new TitledBorder(null, "", TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
topPanel.setLayout(new BorderLayout());
getContentPane().add(topPanel, BorderLayout.NORTH);//放于上方
//创建标签放原图
modelLabel = new JLabel();
modelLabel.setIcon(new ImageIcon("image/"+ num+ "model.jpg"));
topPanel.add(modelLabel, BorderLayout.WEST);
//在右侧加个面板,添加两个按钮
JPanel eastPanel = new JPanel();
topPanel.add(eastPanel,BorderLayout.CENTER);
eastPanel.setLayout(new BorderLayout());
JButton nextButton = new JButton();
nextButton.setText("下一张");
nextButton.addActionListener(new NextButtonAction());
eastPanel.add(nextButton,BorderLayout.NORTH);
//创建按钮开局添加监听
final JButton startButton = new JButton();
startButton.setText("开局");
startButton.addActionListener(new StartButtonAction());
eastPanel.add(startButton, BorderLayout.CENTER);
//初始化中心面板,设置边框,添加按钮
centerPanel = new JPanel();
centerPanel.setBorder(new TitledBorder(null, "", TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
centerPanel.setLayout(new GridLayout(4, 0));
getContentPane().add(centerPanel, BorderLayout.CENTER);
//初始化图片
String[][] exactnessOrder = order();
//按排列添加按钮,设置图片
for (int row=0; row<4; row++) {
for (int col=0; col<4; col++) {
final JButton button = new JButton();
button.setName(row+""+col);
button.setIcon(new ImageIcon(exactnessOrder[row][col]));
if (exactnessOrder[row][col].equals("image/"+ num+"00.jpg"))
emptyButton = button;
button.addActionListener(new ImgButtonAction());
centerPanel.add(button);
}
}
}
//初始化图片
private String[][] order() {
String[][] exactnessOrder = new String[4][4];
for (int row=0; row<4; row++) {
for (int col=0; col<4; col++) {
exactnessOrder[row][col] = "image/"+ num+ row+ col+ ".jpg";
}
}
return exactnessOrder;
}
//随机排列图片
private String[][] reorder() {
String[][] exactnessOrder = new String[4][4];
for (int row=0; row<4; row++) {
for (int col=0; col<4; col++) {
exactnessOrder[row][col] = "image/"+ num+ row+ col+ ".jpg";
}
}
String[][] stochasticOrder = new String[4][4];
for (int row=0; row<4; row++) {
for (int col=0; col<4; col++) {
while (stochasticOrder[row][col]==null) {
int r = (int) (Math.random()*4);
int c = (int) (Math.random()*4);
if (exactnessOrder[r][c] != null) {
stochasticOrder[row][col] = exactnessOrder[r][c];
exactnessOrder[r][c] = null;
}
}
}
}
return stochasticOrder;
}
//游戏时排列图片
class ImgButtonAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
String emptyName= emptyButton.getName();
char emptyRow = emptyName.charAt(0);
char emptyCol = emptyName.charAt(1);
JButton clickButton = (JButton) e.getSource();
String clickName = clickButton.getName();
char clickRow = clickName.charAt(0);
char clickCol = clickName.charAt(1);
if (Math.abs(clickRow - emptyRow) + Math.abs(clickCol - emptyCol) == 1) {
emptyButton.setIcon(clickButton.getIcon());
clickButton.setIcon(new ImageIcon("image/"+ num+ "00.jpg"));
emptyButton = clickButton;
}
}
}
//换下一张图片
class NextButtonAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (num==5) {
num=0;
} else {
++num;
}
modelLabel.setIcon(new ImageIcon("image/"+num+"model.jpg"));
String[][] exactnessOrder = order();
int i= 0;
for (int row=0; row<4; row++) {
for (int col=0; col<4; col++) {
JButton button = (JButton) centerPanel.getComponent(i++);
button.setIcon(new ImageIcon(exactnessOrder[row][col]));
if(exactnessOrder[row][col].equals("image/"+ num+ "00.jpg"))
emptyButton=button;
}
}
}
}
//开局排列图片
class StartButtonAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
String[][] stochasticOrder = reorder();
int i= 0;
for (int row=0; row<4; row++) {
for (int col=0; col<4; col++) {
JButton button = (JButton) centerPanel.getComponent(i++);
button.setIcon(new ImageIcon(stochasticOrder[row][col]));
if(stochasticOrder[row][col].equals("image/"+ num+ "00.jpg"))
emptyButton=button;
}
}
}
}
}