java实现窗口小游戏2048 初始版

1、窗口化
2、2048游戏可正常运行
3、可以显示分数
4、直接处于src下
5、因为此程序涉及数据库,修改了点,把有关数据库的内容进行了删除或者注释

//主函数
public class userPlay {
    public static void main(String[] args) {//主函数
   		//游戏窗口
   	     new initWindow();
    }
}

//游戏窗口
初始界面
随机出现一个数字
在这里插入图片描述
在这里插入图片描述

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;
import java.util.Timer;
import javax.swing.*;

public class initWindow extends JFrame implements ActionListener , KeyListener {
    //游戏结束之后输入名字
    JTextField name=new JTextField();
    boolean isExists;//是否开始了
    JButton restart=new JButton("重新开始");
    JButton confirm=new JButton("确定");
 //方格数目为  number*number
    static int number=4;
    int  Number[][]=new int[number][number];//定义一个四行四列的数字数组
    int localx[][]=new int[number][number];//x位置
    int localy[][]=new int[number][number];//y位置
    int oldNumber[][]=new int[number][number];//之前的

    public initWindow() {//构造方法
        init();//初始化
        setSize(800, 800);//窗口大小
        setVisible(true);//显示窗口可见
        setResizable(false);//不可扩大
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击右上角直接关闭程序
        setTitle("2048小游戏");//设置标题
        this.addKeyListener(this);//添加键盘事件
        this.setFocusable(true);//获取焦点
        validate();
    }

    public void init(){
        setLayout(null);//布局
        add(name);//加入布局---加入这个窗口中
        add(confirm);//加入布局
        add(restart);
        restart.setBounds(300,675,200,50);//设置位置和大小
        restart.addActionListener(this);//添加事件
        restart.setFont(new Font("华文楷体",1,30));//设置字体大小和样式
        restart.setBackground(Color.GREEN);//设置背景颜色
        //存储文字显示的位置
        for (int i = 0; i < number; i++) {
            for (int j = 0; j < number; j++) {
               localx[j][i]=100+150*i+65;
               localy[j][i]=50+150*j+75;
            }
        }
        //初始随机数字  里面的是随机数字的数字
        rollNum(2);//刚开始的时候是出现两个数字,之后每次运动后随机出一个数字
        common();//把旧的复制为新的---为了让新随机出现的数字和以前数字隔离出来
        isExists=true;//游戏开始

    }

    public void paint(Graphics g) {
        super.paint(g);//如果没有这个,图像不会重新绘制
        if(!isExists){//游戏结束
            name.setBounds(200, 500, 200, 50);
            name.setFont(new Font("华文行楷",1,30));
            g.setFont(new Font("华文楷体", 1, 50));
            g.setColor(Color.black);
            g.setFont(new Font("华文楷体", 1, 30));
            g.drawString("输入你的昵称(确定之后不可更改):",200 ,500 );
            //设置按钮大小
            confirm.setBounds(400,500,100,50);
            //统计分数----窗口上出现的所有数字之和
            int fs=0;
            for (int i = 0; i < number; i++) {
                for (int j = 0; j < number; j++) {
                    fs+=Number[i][j];
                }
            }
            //点击确定之后
            String finalFs = String.valueOf(fs);//把分数转为字符形式
            confirm.addActionListener(new ActionListener() {//确定名字之后执行
                @Override
                public void actionPerformed(ActionEvent e) {
                //下面的为数据库操作
                 /*   String sql=null;
                    if(name.getText().equals("")){
                        JOptionPane.showMessageDialog(null, "名字都补数!",
                                "",JOptionPane.PLAIN_MESSAGE);
                        return;
                    }

                    sql="insert into game_2048 values('"+name.getText()+"','"+finalFs+"')";

                    if(gamedatabase.Insertdata(sql))
                        JOptionPane.showMessageDialog(null, "存储成功!",
                            "",JOptionPane.PLAIN_MESSAGE);
                   else
                       JOptionPane.showMessageDialog(null, "存储失败!",
                               "",JOptionPane.PLAIN_MESSAGE);
                }
                 */
            });
           
        
         ===============================================================
            g.setFont(new Font("华文楷体", 1, 50));
            g.setColor(Color.RED);

            g.drawString("你的分数为:"+finalFs ,200 ,300 );
        }
        else {
            Graphics2D g2 = (Graphics2D) g;  //g是Graphics对象
            g2.setStroke(new BasicStroke(10.0f));//设置线条宽度
            g2.setColor(new Color(255, 245, 170));//设置字体颜色
            for (int i = 0; i < number + 1; i++) {//用线条画出图形面板
                g2.drawLine(100 + 150 * i, 50, 100 + 150 * i, 50 + 600);
                g2.drawLine(100, 50 + 150 * i, 100 + 600, 50 + 150 * i);
            }
            g.setFont(new Font("华文楷体", 1, 30));
            g.setColor(Color.BLUE);

            for (int i = 0; i < number; i++) {//把所有的数字显示出来
                for (int j = 0; j < number; j++) {
                    if (Number[i][j] == 0) {//为空的话
                        //覆盖掉数字
                        g.drawString("  ", localx[i][j], localy[i][j]);
                    } else {
                        //显示数字
                        if (oldNumber[i][j] != Number[i][j]) {
                            g.setColor(Color.red);
                            g.setFont(new Font("华文楷体", 3, 40));
                            g.drawString(String.valueOf(Number[i][j]), localx[i][j], localy[i][j]);
                            g.setColor(Color.blue);
                            g.setFont(new Font("华文楷体", 1, 30));
                        } else {
                            g.drawString(String.valueOf(Number[i][j]), localx[i][j], localy[i][j]);
                        }
                    }
                }
            }
        }
    }

    /*
    * 开始随机出现数字*/
    public void rollNum( int num){
        int k=0;
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                if(Number[i][j]==0){
                    ++k;
                }
            }
        }
        if(k==0){
            isExists=false;//结束
            //弹出框提示
            JOptionPane.showMessageDialog(this, "要加油啊!",
                    "你失败了",JOptionPane.PLAIN_MESSAGE);
            return;
        }
        Random random = new Random();
        for (int i = 0; i < num;) {
            int x = random.nextInt(4);//从0-3中随机选择  
            int y = random.nextInt(4);

            if(Number[x][y]==0){//等于空的时候---- 这个位置上没有数字
                if(random.nextInt(2)==0){//随机数字为2 or 4
                    Number[x][y] = 2;
                }
                else{
                    Number[x][y] = 4;
                }
                i++;
            }

        }
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        dispose(); //关掉窗口
        new initWindow();//重新打开一个
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {

        //上下左右---1-4
        int keyCode = e.getKeyCode();
        if(isExists) {//游戏进行中
            if (keyCode == KeyEvent.VK_UP) {//上
                go(1);
            }
            if (keyCode == KeyEvent.VK_DOWN) {//下
                go(2);
            }
            if (keyCode == KeyEvent.VK_LEFT) {//左
                go(3);
            }
            if (keyCode == KeyEvent.VK_RIGHT) {右箭头
                go(4);
            }
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    /*
    * 移动位置*/
    public void go(int num){
        //上下左右---1-4
        int sz[]=new int[4];//设置一个一维数组
        if(num==1){
            for(int i=0;i<4;++i){
                //移动前
                for (int j = number -1 ; j >=0 ; j--) {
                    sz[number - j - 1]=Number[j][i];//把需要移动的方格按照移动方向存进数组
                    //如:一维数组每次移动都是从左到右
                    //所以按了上箭头之后,移动便是从下到上,依次从上到下复制到从左到有
                }
                for (int j = 0; j < 4; j++) {
                }
                //移动中
                goes(sz);
                //移动后
                for (int j = number -1 ; j >=0 ; j--) {//移动好的复制回去
                    Number[j][i]=sz[number - j - 1];
                }
            }
        }else if(num==2){
            for(int i=0;i<4;++i){
                //移动前
                for (int j = 0; j < 4; j++) {
                    sz[j]=Number[j][i];
                }
                //移动中
                goes(sz);
                //移动后
                for (int j = 0; j < 4; j++) {
                    Number[j][i]=sz[j];
                }
            }
        }else if(num==3){
            for (int i = 0; i < 4; i++) {
                for (int j = number-1; j >=0 ; j--) {
                    sz[number - j - 1]=Number[i][j];
                }
                goes(sz);;
                for (int j = number-1; j >=0 ; j--) {
                    Number[i][j]= sz[number - j - 1];
                }

            }
        }else{
            for(int i=0;i<4;++i){
                //移动前
                for (int j = 0; j < 4; j++) {
                    sz[j]=Number[i][j];
                }
                //移动中
                goes(sz);;
                //移动后
                for (int j = 0; j < 4; j++) {
                    Number[i][j]=sz[j];
                }
            }
        }
        //旧的等于新的
        common();
        //每次移动完出现新的数字
        rollNum(1);//出现一个
        repaint();//重画
    }

    //每次都是左边到右边
    public void goes(int sz[]) {
        int goNum = number - 1;
        boolean ising = false;
        for (int i = number - 2; i >= 0; i--) {
            if(sz[i]!=0){
                if(sz[goNum]!=0){
                    //相等即相加
                    if(sz[goNum]==sz[i] && ising==false){
                        sz[goNum]+=sz[i];
                        sz[i]=0;
                        ising=true;
                    }
                    else
                    {
                        goNum--;
                        if(goNum!=i) {
                            sz[goNum] = sz[i];
                            sz[i] = 0;
                        }
                        ising=false;
                    }
                }
                else{
                    if(goNum!=i) {
                        sz[goNum] += sz[i];
                        sz[i] = 0;
                    }
                }
            }
        }
    }
    public void common(){
        for (int i = 0; i < number; i++) {
            for (int j = 0; j < number; j++) {
                oldNumber[i][j]=Number[i][j];
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44922497/article/details/106427392