第六周
完成内部类学习并进行了简单的项目练习;
学会了容器的部分用法,做简单的小游戏
点击查看代码
package ui;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
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];
//x,y为二维数组的位置
int x = 0;
int y = 0;
//win为正确图片排列位置
int[][] win = new int[][]{
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11},
{12, 13, 14, 15}
};
//用于记录步数
int count = 0;
//创建功能选项的条目
JMenuItem replayItem = new JMenuItem("重新开始");
JMenuItem reLoginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("关闭游戏");
JMenuItem accountItem = new JMenuItem("公众号");
//空参构造
public GameJFrame() {
//初始化主界面
initJFrame();
//初始化菜单
initJMenuBar();
//初始化数据(打乱图片)
initDate();
//初始化图片
initImage();
//设置主界面显现
this.setVisible(true);
}
//初始化数据(打乱图片)
private void initDate() {
int[] tempArray = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//将一维数组打乱
Random r = new Random();
for (int i = 0; i < tempArray.length; i++) {
int index = r.nextInt(tempArray.length);
int temp = tempArray[i];
tempArray[i] = tempArray[index];
tempArray[index] = temp;
}
//将打乱的一维数组放入二维数组中
for (int i = 0; i < tempArray.length; i++) {
//空白图片的位置
if (tempArray[i] == 15) {
x = i / 4;
y = i % 4;
}
date[i / 4][i % 4] = tempArray[i];
}
}
//初始化图片
private void initImage() {
//清空以前图片
this.getContentPane().removeAll();
//判断是否胜利
if (victory()){
//创建容器管理图片
JLabel panel = new JLabel(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\photo1\\th.jpg"));
panel.setBounds(203,283,197,73);
this.getContentPane().add(panel);
}
//创建容器管理文字
JLabel stepCount = new JLabel("步数: "+ count);
stepCount.setBounds(50,20,100,20);
this.getContentPane().add(stepCount);
//通过循环添加图片
//循环列
for(int i=0;i<4;i++){
//添加行的图片
for(int j=0;j<4;j++){
//选用第num个图片
int num = date[i][j];
//创建一个图片Image对象
ImageIcon icon = new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\photo1\\"+num+".png");
//创建一个Jabel对象
JLabel label = new JLabel(icon);
//指定图片的位置,xy看左上角的坐标
label.setBounds(105*j + 83, 105*i + 134, 105,105);
//添加边框
//1是让图片凹进去
//0是让图片凸出来
label.setBorder(new BevelBorder(1));
//把管理容器添加到主界面中
this.getContentPane().add(label);
}
}
//添加背景图片,在最后放,如果先设置因为图片较大覆盖打乱的图片
ImageIcon icon1 = new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\photo1\\112.jpg");
JLabel label1 = new JLabel(icon1);
label1.setBounds(40,40,508,560);
this.getContentPane().add(label1);
//刷新界面
this.getContentPane().repaint();
}
//初始化界面方法
private void initJFrame() {
//设置主界面的宽高
this.setSize(603, 680);
//设置主界面标题
this.setTitle("拼图单机版 v1.0");
//设置主界面置顶
this.setAlwaysOnTop(true);
//设置主界面居中
this.setLocationRelativeTo(null);
//设置主界面关闭
this.setDefaultCloseOperation(3);
//取消默认的居中方式,只有取消才能按照xy轴方式添加组件
this.setLayout(null);
//在界面添加键盘接听事件
this.addKeyListener(this);
}
//初始化菜单方法
private void initJMenuBar() {
//设置菜单
//创建菜单对象
JMenuBar menuBar = new JMenuBar();
//创建菜单上的选项对象(功能,关于我们)
JMenu functionJMenu = new JMenu("功能");
JMenu aboutJMenu = new JMenu("关于我们");
//将条目添加到选项中
functionJMenu.add(replayItem);
functionJMenu.add(reLoginItem);
functionJMenu.add(closeItem);
aboutJMenu.add(accountItem);
//给条目绑定事件
replayItem.addActionListener(this);
reLoginItem.addActionListener(this);
closeItem.addActionListener(this);
accountItem.addActionListener(this);
//将选项添加到菜单中
menuBar.add(functionJMenu);
menuBar.add(aboutJMenu);
//将菜单添加到主界面中
this.setJMenuBar(menuBar);
}
@Override
public void keyTyped(KeyEvent e) {
}
//按下按键不送调用这个方法
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if (code == 65) {
//把界面所有图片删除
this.getContentPane().removeAll();
//加载完整图片
JLabel all = new JLabel(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\photo1\\all.jpg"));
all.setBounds(83,134,420,420);
this.getContentPane().add(all);
//加载背景图片
ImageIcon icon1 = new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\photo1\\112.jpg");
JLabel label1 = new JLabel(icon1);
label1.setBounds(40,40,508,560);
this.getContentPane().add(label1);
this.getContentPane().repaint();
}
}
//松开按键
@Override
public void keyReleased(KeyEvent e) {
//胜利之后不能再移动
if(victory()){
initImage();
return;
}
int code = e.getKeyCode();
//左移
if (code == 37) {
//为最左方
if(y==0){
return;
}
//交换位置
date[x][y] = date[x][y-1] ;
date[x][y-1] = 15;
//交换后空白图片x+1,y不变
y--;
count++;
//加载图片
initImage();
}
//上移
else if (code == 38) {
//为最下方
if(x==0){
return;
}
//交换位置
date[x][y] = date[x-1][y] ;
date[x-1][y] = 15;
//交换后空白图片x+1,y不变
x--;
count++;
//加载图片
initImage();
}
//右移
else if (code == 39) {
//为最右方
if(y==3){
return;
}
//交换位置
date[x][y] = date[x][y+1] ;
date[x][y+1] = 15;
//交换后空白图片x+1,y不变
y++;
count++;
//加载图片
initImage();
}
//下移
else if (code == 40) {
//为最下方
if(x==3){
return;
}
//交换位置
date[x][y] = date[x+1][y] ;
date[x+1][y] = 15;
//交换后空白图片x+1,y不变
x++;
count++;
//加载图片
initImage();
}
else if (code == 65) {
initImage();
}
else if (code == 87) {
date = new int[][]{
{0,1,2,3},
{4,5,6,7},
{8,9,10,11},
{12,13,14,15}
} ;
initImage();
}
}
//判断date数组是否和win相同及胜利判断
public boolean victory(){
for(int i=0;i<date.length;i++){
for(int j=0;j<date[i].length;j++){
if(date[i][j] != win[i][j]){
return false;
}
}
}
//因为胜利之x=3,y=3,防止出现bug
x = 3;
y = 3;
return true;
}
//事件触发
@Override
public void actionPerformed(ActionEvent e) {
//获取当前被点击的条目对象
Object obj = e.getSource();
//判断
if(obj == replayItem){
System.out.println("重新开始");
//打乱二维数据中数组
initDate();
//计数器清零,因为计数器在加载图片中显示所以要先清零在加载图片
count = 0;
//加载图片
initImage();
}
else if(obj == reLoginItem){
System.out.println("重新登陆");
//关闭当前界面
this.setVisible(false);
//打开登陆界面
new LoginJFrame();
}else if(obj == closeItem){
System.out.println("关闭游戏");
//关闭虚拟机
System.exit(0);
}
else if(obj == accountItem){
System.out.println("公众号");
//创建一个弹窗对象
JDialog jd = new JDialog();
//创建一个管理图片的容器
JLabel jLabel = new JLabel(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\photo1\\vx.jpg"));
jLabel.setBounds(0,0,623,619);
jd.getContentPane().add(jLabel);
//设置弹窗大小
jd.setSize(623,619);
//设置弹窗置顶
jd.setAlwaysOnTop(true);
//设置弹窗居中
jd.setLocationRelativeTo(null);
//弹窗不关闭无法操作其他界面
jd.setModal(true);
//显示弹窗
jd.setVisible(true);
}
}
}
点击查看代码
package ui;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Objects;
//登录界面搭建
public class LoginJFrame extends JFrame implements MouseListener {
//创建集合添加用户名与对应的密码
static ArrayList<User> allUers = new ArrayList<User>();
static {
allUers.add(new User("张三", "123"));
allUers.add(new User("李四", "1234"));
}
//创建输入的验证码容器,因为其他方法要用所以作为成员变量
JLabel ringtCode = new JLabel();
//创建登录,注册按钮,同上
JButton login = new JButton();
JButton register = new JButton();
//创建用户名输入框
JTextField username = new JTextField();
//密码输入框
JPasswordField password = new JPasswordField();
//验证码输入框
JTextField code = new JTextField();
//登陆界面无参构造
public LoginJFrame() {
//初始化界面
initJframe ();
//在登陆界面添加内容
initView();
//设置登陆界面显现
this.setVisible(true);
}
private void initJFrame() {
}
//在登陆界面添加内容
private void initView() {
//添加用户名文字图片
//创建容器管理图片
JLabel usernameText = new JLabel(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\用户名.png"));
//设置大小位置
usernameText.setBounds(116, 135, 47, 17);
//添加到登陆界面
this.getContentPane().add(usernameText);
//添加用户名的输入框
//设置大小位置
username.setBounds(195, 134, 200, 30);
//添加到登陆界面
this.getContentPane().add(username);
//添加密码文字图片
//创建容器管理图片
JLabel passwordText = new JLabel(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\密码.png"));
//设置大小位置
passwordText.setBounds(130, 195, 32, 16);
//添加到登录界面
this.getContentPane().add(passwordText);
//添加密码输入框
//创建输入框
//设置大小位置
password.setBounds(195, 195, 200, 30);
//添加到登陆界面
this.getContentPane().add(password);
//验证码提示
JLabel codeText = new JLabel(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\验证码.png"));
codeText.setBounds(133, 256, 50, 30);
this.getContentPane().add(codeText);
//验证码输入框
code.setBounds(195, 256, 100, 30);
this.getContentPane().add(code);
//生成随机验证码
String codestr = CodeUtil.getCode();
//将验证码显示在界面上
ringtCode.setText(codestr);
//绑定鼠标事件
ringtCode.addMouseListener(this);
//设置验证码的大小位置
ringtCode.setBounds(300, 256, 50, 30);
//添加到登陆界面上
this.getContentPane().add(ringtCode);
//添加登录按钮
login.setBounds(123, 310, 128, 47);
login.setIcon(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\登录按钮.png"));
//去除按钮边框
login.setBorderPainted(false);
//去除按钮背景
login.setContentAreaFilled(false);
//绑定鼠标事件
login.addMouseListener(this);
//添加到界面中
this.getContentPane().add(login);
//添加注册按钮
register.setBounds(256, 310, 128, 47);
register.setIcon(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\注册按钮.png"));
register.setBorderPainted(false);
register.setContentAreaFilled(false);
register.addMouseListener(this);
this.getContentPane().add(register);
//添加背景图片
JLabel background = new JLabel(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\background.png"));
background.setBounds(0, 0, 470, 390);
this.getContentPane().add(background);
}
//初始化界面
public void initJframe(){
//设置登陆界面宽高
this.setSize(488, 430);
//设置登陆界面标题
this.setTitle("登录");
//设置登陆界面置顶
this.setAlwaysOnTop(true);
//设置登陆界面居中
this.setLocationRelativeTo(null);
//设置登陆界面关闭
this.setDefaultCloseOperation(3);
}
//点击
@Override
public void mouseClicked(MouseEvent e) {
//点击登录
if(e.getSource() == login) {
//获取用户名与密码输入框中内容
String usernameInput = username.getText();
String passwordInput = password.getText();
//验证码
String codeInput = code.getText();
//创建一个User对象
User user = new User(usernameInput, passwordInput);
if(codeInput.length() == 0) {
//创建一个弹窗,输出文字
showJDialog("验证码不能为空");
} else if (usernameInput.length()==0||passwordInput.length()==0) {
showJDialog("用户名或者密码为空");
} else if (!codeInput.equalsIgnoreCase(ringtCode.getText())) {
showJDialog("验证码输入错误");
//判断用户名密码是否正确
} else if (contains(user)) {
//关闭当前登陆界面
this.setVisible(false);
//打开游戏界面
new GameJFrame();
}
else {
showJDialog("用户名或密码错误");
}
//点击注册
} else if (e.getSource()==register) {
showJDialog("当前功能未开放");
//点击验证码
} else if (e.getSource()==ringtCode) {
String code = CodeUtil.getCode();
ringtCode.setText(code);
}
}
private void showJDialog(String content) {
//创建弹窗对象
JDialog jDialog = new JDialog();
//给弹框设置大小
jDialog.setSize(200, 150);
//让弹框置顶
jDialog.setAlwaysOnTop(true);
//让弹框居中
jDialog.setLocationRelativeTo(null);
//弹框不关闭永远无法操作下面的界面
jDialog.setModal(true);
//创建Jlabel对象管理文字并添加到弹框当中
JLabel warning = new JLabel(content);
warning.setBounds(0, 0, 200, 150);
jDialog.getContentPane().add(warning);
//让弹框展示出来
jDialog.setVisible(true);
}
//按下不送
@Override
public void mousePressed(MouseEvent e) {
if(e.getSource() == login) {
login.setIcon(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\登录按下.png"));
}else if (e.getSource() == register) {
register.setIcon(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\注册按下.png"));
}
}
//松开按钮
@Override
public void mouseReleased(MouseEvent e) {
if(e.getSource() == login) {
login.setIcon(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\登录按钮.png"));
}else if (e.getSource() == register) {
register.setIcon(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\注册按钮.png"));
}
}
//鼠标划入
@Override
public void mouseEntered(MouseEvent e) {
}
//鼠标划出
@Override
public void mouseExited(MouseEvent e) {
}
//判断用户在集合中是否存在
public boolean contains (User user) {
for (int i = 0; i < allUers.size(); i++) {
User u = allUers.get(i);
if(user.getName().equals(u.getName()) && user.getPassword().equals(u.getPassword())) {
return true;
}
}
return false;
}
}
点击查看代码
package ui;
import java.util.ArrayList;
import java.util.Random;
//登陆界面中生成随机验证工具类
public class CodeUtil {
public static String getCode(){
//创建一个集合
ArrayList<Character> list = new ArrayList<>();
//将A-Z与a-z放入集合中
//共52个字符,循环一次添加2个字符
for (int i = 0; i < 26; i++) {
list.add((char)('a' + i));
list.add((char)('A' + i));
}
//随机生成四个字母
String result = "";
Random r = new Random();
for(int i = 0; i < 4; i++){
//从集合中随机抽取4个字母
result += list.get(r.nextInt(list.size()));
}
//随机生成一个数字
int number = r.nextInt(10);
//将数字拼接到字母后面
result = result + number;
//将字符串变成一个字符数组
char[] arr = result.toCharArray();
//生成随机索引
int index = r.nextInt(arr.length);
//将数字放到随机索引处
char ch = arr[4];
arr[4] = arr[index];
arr[index] = ch;
//将字符数组转化为字符串
String code = new String(arr);
return code;
}
}
点击查看代码
package ui;
//登陆界面用户对象
public class User {
private String name;
private String password;
public User() {
}
public User(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
点击查看代码
import ui.RegisterJFrame;
import ui.GameJFrame;
import ui.LoginJFrame;
//程序入口
public class App {
public static void main(String[] args) {
//new GameJFrame();
//new RegisterJFrame();
new LoginJFrame();
}
}