石头阵游戏
绘制画布
先看看游戏的效果
java石头阵小游戏
参考上一篇2048小游戏,可以先绘制出来一个画布
这一篇我会写细一点,更方便大家学习
-
首先创建两个java文件
- 目的就是一个作为启动类,另外一个存放代码模块
public class main { public static void main(String[] args) { new MainFrame();//创建一个对象,他会默认调用里面的空参函数 } } //另外一个java文件 import javax.swing.*; public class MainFrame extends JFrame { //空参构造 public MainFrame(){ //里面编写各个函数的调用 } }
-
初始化画布,并且在空参函数里面调用
/** * 初始化画布 */ public void initFrame(){ setSize(514,538);//设置宽高 setLocationRelativeTo(null);//设置窗体居中 setAlwaysOnTop(true);//设置窗口置顶 setDefaultCloseOperation(3);//调用成员方法,设置关闭模式 因为窗体关闭后,程序不会自动结束 setTitle("石头阵游戏");//调用成员方法,设置标题 setLayout(null);//取消默认布局 } //空参构造 public MainFrame(){ initFrame(); setVisible(true);//设置窗口可见 }
创建数组,并且渲染到画布上面
-
创建一个数组,循环渲染上去
int data[][] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}}; //空参构造 public MainFrame(){ initFrame(); paintView();//将数组绘制在画布上面 setVisible(true);//设置窗口可见 } public void paintView(){ for (int j = 0;j < 4;j++){ for (int i = 0;i < 4;i++){ JLabel ji1 = new JLabel(new ImageIcon("M:\\icon-"+data[j][i]+".png")); ji1.setBounds(58 + 100*i,58 + j *100,100,100); getContentPane().add(ji1); } } //这里画的是背景 JLabel ji2 = new JLabel(new ImageIcon("M:\\icon-background.jpg")); ji2.setBounds(50,50,420,420); getContentPane().add(ji2); }
让数字可以动起来
这个时候就需要一个接口
用到键盘接口,将接口接到那个类上面
public class MainFrame extends JFrame implements KeyLister{//新增加一个接口
//里面需要重写几个方法
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
//用键盘抬起来代表
int code = e.getKeyCode();
// System.out.println(code);
switch (code){
case 37:
// System.out.println("左移动");
moveToLeft();
break;
case 38:
// System.out.println("上移动");
moveToTop();
break;
case 39:
// System.out.println("右移动");
moveToRight();
break;
case 40:
// System.out.println("下移动");
moveToBottom();
break;
default:
break;
}
}
//下面就是实现移动的方法
public void moveToLeft(){
lo:
for (int i = 0; i < data.length; i++) {
for (int i1 = 0; i1 < data[i].length - 1; i1++) {
if(data[i][i1] == 0){
data[i][i1] = data[i][i1+1];
data[i][i1+1] = 0;
break lo;
}
}
}
paintView();
}
public void moveToRight(){
lo:
for (int i = 0; i < data.length; i++) {
for (int i1 = 1; i1 < data[i].length; i1++) {
if(data[i][i1] == 0){
data[i][i1] = data[i][i1-1];
data[i][i1-1] = 0;
break lo;
}
}
}
paintView();
}
public void moveToBottom(){
lo:
for (int i = 1; i < data.length; i++) {
for (int i1 = 0; i1 < data[i].length; i1++) {
if(data[i][i1] == 0){
data[i][i1] = data[i-1][i1];
data[i-1][i1] = 0;
break lo;
}
}
}
paintView();
}
public void moveToTop(){
lo:
for (int i = 0; i < data.length - 1; i++) {
for (int i1 = 0; i1 < data[i].length; i1++) {
if(data[i][i1] == 0){
data[i][i1] = data[i+1][i1];
data[i+1][i1] = 0;
break lo;
}
}
}
paintView();
}
//在绘制画面里面加入刷新
public void paintView(){
//移除掉原来所有的页面
getContentPane().removeAll();
//原来的函数
//刷新界面
getContentPane().repaint();
}
}
生成随机数组
生成随机数组
//刷新,随机数组
public void RandomArray(){
for (int i = 0;i < 4;i++){
for(int j = 0;j < 4;j++){
Random r = new Random();
int x = r.nextInt(4);
int y = r.nextInt(4);
int temp = data[i][j];
data[i][j] = data[x][y];
data[x][y] = temp;
}
}
}
//然后在空参函数里面调用
最后一步就是计步数
//首先初始化分数
int score = 0;
//然后将数据渲染在画布上面
JLabel scoreLabel = new JLabel("步数:" + score);
scoreLabel.setBounds(50,20,100,20);
getContentPane().add(scoreLabel);
//然后将每走一步就加一下分数
public void moveToLeft(){
lo:
for (int i = 0; i < data.length; i++) {
for (int i1 = 0; i1 < data[i].length - 1; i1++) {
if(data[i][i1] == 0){
data[i][i1] = data[i][i1+1];
data[i][i1+1] = 0;
score++;//这里是新加的移动
break lo;
}
}
}
paintView();
}
//其他移动也是一样的
最后判断游戏成功
/判断游戏是否成功
public boolean GameSuccess(){
boolean flag = true;
lo:
for (int i = 0; i < data.length; i++) {
for (int i1 = 0; i1 < data.length; i1++) {
if(i+i1!=6 && data[i][i1] != i*4 + i1 + 1){
flag = false;
break lo;
}
}
}
return flag;
}
//下面的代码写在绘制画面
if(GameSuccess()){
JLabel GameSuccess = new JLabel("游戏成功");
GameSuccess.setBounds(200,20,100,20);
getContentPane().add(GameSuccess);
}
游戏的优化
-
考虑一下,游戏结束,我们的按键依旧可以动,得设置不能让按键移动
-
加入按下空格键就会刷新一下数组
-
用一种算法,实现这个游戏是肯定可以完成得,要不然,随意打乱是不一定可以完成的
图片地址:https://wws.lanzous.com/isOuUndpote
欢迎大家在评论区讨论