今天向大家分享我最近写的一个java小游戏-拼图游戏
游戏隐藏功能:
按W键图片会直接变成成功之后的图片,成功之后会有成功的标志显示出来
作弊小技巧:一直按A键,会一直显示出完整的图片,松开A键,会返回之前的画面
为了使结构更加美观,我们要把关于游戏的登录页面,注册页面,游戏页面分为3个类来分别写,最后在主函数中进行运行
在这里,由于登录界面以及注册界面的不完善,所以我仅为大家分享一下关于游戏的游戏界面以及一些我自己的分析与理解分析,代码中有详细的解释,如果大家有什么不会的以及不太懂的地方可以随时问我
以下便是我所写都App的主函数的运行界面
运行界面App:
public class App {
public static void main(String[] args) {
//创建一个拼图界面
new gameJFrame();
//创建一个登录界面
new loginJFrame();
//创建一个注册界面
new registerJFrame();
}
}
游戏界面JFrame:
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class gameJFrame extends JFrame implements KeyListener, ActionListener {
int[][] date = new int[4][4];
int x;
int y;
//D:\idea.java\puzzlegame\image\image\animal\animal1\1.jpg
String path1 = "D:\\idea.java\\puzzlegame\\image\\image\\";
//默认初始化图片
String path2="animal\\animal";
//String girl="girl\\girl";
//String sport="sport\\sport";
int[][] win={
{1,2,3,4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
int step=0;
int i=0;
Random r=new Random();
int number=3;
//由于接口要用到,所以放在成员位置
JMenuItem animalItem=new JMenuItem("动物");
JMenuItem girlItem=new JMenuItem("美女");
JMenuItem sportItem=new JMenuItem("运动");
JMenuItem replayItem = new JMenuItem("重新游戏");
JMenuItem reLoginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("退出游戏");
JMenuItem accountItem = new JMenuItem("公众号");
//以后写界面的代码都放在这里
public gameJFrame() {
//初始化界面
initJFrame();
//初始化菜单
initJMenubar();
//打乱图片
disorganizedArr();
//添加图片
initImage();
//放在最后,将游戏界面显示出来
this.setVisible(true);
}
//打乱顺序添加图片,数组
private void initImage() {
getContentPane().removeAll();
if(victory()){
JLabel win=new JLabel(new ImageIcon("D:\\idea.java\\puzzlegame\\image\\image\\win.png"));
win.setBounds(200,200,197,73);
this.getContentPane().add(win);
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j< 4; j++) {
//创建对象,添加图片
//创建容器
JLabel jLabel = new JLabel(new ImageIcon(path1+path2+number+"\\"+date[i][j] + ".jpg"));
//指定位置
jLabel.setBounds(105 * j + 73, 105 * i + 83, 105, 105);
//将容器添加到界面当中
//添加边框
jLabel.setBorder(new BevelBorder(BevelBorder.RAISED));
//将图片添加到隐藏容器中
this.getContentPane().add(jLabel);
//this.add(jLabel);
}
}
//将背景放在图片后面,才可以把图片显现出来
//添加背景图
JLabel stepjlable=new JLabel(step+"步数");
stepjlable.setBounds(10,10,100,20);
this.getContentPane().add(stepjlable);
JLabel background = new JLabel(new ImageIcon("D:\\idea.java\\puzzlegame\\image\\image\\" + "background.png"));
background.setBounds(30, 0, 508, 540);
this.getContentPane().add(background);
getContentPane().repaint();
}
//打乱数组
private void disorganizedArr() {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
int index = r.nextInt(16);
int tmp = arr[index];
arr[index] = arr[i];
arr[i] = tmp;
}
int count = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (arr[count] == 16) {
x = i;
y = j;
}
date[i][j] = arr[count];
count++;
}
}
}
private void initJMenubar() {
//创建菜单对象
JMenuBar jMenuBar = new JMenuBar();
//在菜单中添加菜单对象
JMenu functionJMenu = new JMenu("功能");
JMenu aboutJMenu = new JMenu("关于我们");
//将功能中的更换图片设为JMenu对象
JMenu changeImage=new JMenu("更换图片");
//功能
functionJMenu.add(changeImage);
functionJMenu.add(replayItem);
functionJMenu.add(reLoginItem);
functionJMenu.add(closeItem);
//将更换照片内容更新到更换照片当中
changeImage.add(animalItem);
changeImage.add(girlItem);
changeImage.add(sportItem);
//关于我们--公众号图片菜单
aboutJMenu.add(accountItem);
//将两个jMenu添加到jMenuBar当中
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
//给条目绑定事件
//鼠标监听对项目一一绑定事件
replayItem.addActionListener(this);
reLoginItem.addActionListener(this);
closeItem.addActionListener(this);
accountItem.addActionListener(this);
animalItem.addActionListener(this);
girlItem.addActionListener(this);
sportItem.addActionListener(this);
this.setJMenuBar(jMenuBar);
}
public boolean victory(){
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if(date[i][j]!=win[i][j])
{
return false;
}
}
}
return true;
}
//界面设置以及布局
private void initJFrame() {
//游戏界面的大小
this.setSize(570, 630);
//设置标题
this.setTitle("拼图单机版 v1.0");
//设置将游戏界面置顶
this.setAlwaysOnTop(true);
//将界面开始显示在中间
this.setLocationRelativeTo(null);
//设置界面关闭的装置
this.setDefaultCloseOperation(3);
//取消默认居中放置,只有取消了才能按xy组件放置
this.setLayout(null);
//给整个界面添加键盘监听事件
this.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
//键盘按住不松
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if (code == 65) {
getContentPane().removeAll();
JLabel all = new JLabel(new ImageIcon(path1 + "all.jpg"));
all.setBounds(30, 0, 510, 589);
this.getContentPane().add(all);
JLabel background = new JLabel(new ImageIcon("puzzlegame\\image\\image\\background.png"));
background.setBounds(30, 0, 508, 540);
this.getContentPane().add(background);
getContentPane().repaint();
}
}
//鼠标松开执行
@Override
public void keyReleased(KeyEvent e) {
if(victory()){
return;
}
int code = e.getKeyCode();
if (code == 37) { // 左键
if (y == 3) {
return;
}
System.out.println("点击左键");
date[x][y] = date[x][y + 1];
date[x][y + 1] = 16;
y++;
step++;
initImage();
} else if (code == 38) { // 上键
if (x == 3) {
return;
}
System.out.println("点击上键");
date[x][y] = date[x + 1][y];
date[x + 1][y] = 16;
x++;
step++;
initImage();
} else if (code == 39) { // 右键
if (y == 0) {
return;
}
System.out.println("点击上键");
date[x][y] = date[x][y - 1];
date[x][y - 1] = 16;
y--;
step++;
initImage();
} else if (code == 40) { // 下键
if (x == 0) {
return;
}
System.out.println("点击下键");
date[x][y] = date[x - 1][y];
date[x - 1][y] = 16;
x--;
step++;
initImage();
} else if (code == 65) { // 'A'键
initImage();
} else if (code == 87) {
date = new int[][]{
{1,2,3,4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
initImage();
}
}
@Override
public void actionPerformed(ActionEvent e){
Object object=e.getSource();
if(object==replayItem){
//计步器归0
step=0;
//重新打乱图片
disorganizedArr();
//更新
initImage();
}
else if(object==reLoginItem){
//关闭当前界面
setVisible(false);
//返回登录界面
new loginJFrame();
}
else if(object==closeItem){
//关闭虚拟机
System.exit(0);
}
else if(object==accountItem){
//创建一个弹框对象
JDialog jDialog=new JDialog();
JLabel jLabel=new JLabel(new ImageIcon(path1+"about.png"));
//不是相当于界面而言的,而是相当于弹框而言的
jLabel.setBounds(0,0,258,258);
//将图片添加到弹框当中
jDialog.getContentPane().add(jLabel);
//设置弹框的大小
jDialog.setSize(400,400);
//将弹框置顶
jDialog.setAlwaysOnTop(true);
//将弹框居中
jDialog.setLocationRelativeTo(null);
//如果弹框不关闭,就无法进行接下来的操作
jDialog.setModal(true);
//显示界面
jDialog.setVisible(true);
}
else if(object==animalItem){
path2="animal\\animal";
number=r.nextInt(8)+1;
initImage();
}
else if(object==girlItem){
path2="girl\\girl";
number=r.nextInt(8)+1;
initImage();
}
else if(object==sportItem){
path2="sport\\sport";
number=r.nextInt(8)+1;
initImage();
}
}
}
这周的分享就到此结束,谢谢大家的观看!