gui界面2048小游戏

坑的地方

JLabel色块要调透明

方向键要用press方法

主界面

package game;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.GridLayout;
import java.awt.Color;

public class Game extends JFrame implements KeyListener{

    private JPanel contentPane;
    Block[][] block1=new Block[4][4];//色块
    GameSrc game=new GameSrc();//游戏类
    int[][] pane=new int[4][4];//游戏类的数据
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Game frame = new Game();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Game() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new GridLayout(4, 4, 5, 5));

        game.newgame();
        pane=game.getPane();
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                block1[i][j]=new Block();
                block1[i][j].setValue(pane[i][j]);
                contentPane.add(block1[i][j]);
            }
        }
        this.addKeyListener(this);

    }

    @Override
    public void keyTyped(KeyEvent e) {}

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO 自动生成的方法存根
        if(e.getKeyCode()==KeyEvent.VK_LEFT){
            game.left();
            pane=game.getPane();
            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    block1[i][j].setValue(pane[i][j]);
                }
            }
            if(game.gameOver()==1){
                JOptionPane.showMessageDialog(this, "you lose");
            }
        }
        else if(e.getKeyCode()==KeyEvent.VK_RIGHT){
            game.right();
            pane=game.getPane();
            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    block1[i][j].setValue(pane[i][j]);
                }
            }
            if(game.gameOver()==1){
                JOptionPane.showMessageDialog(this, "you lose");
            }
        }
        else if(e.getKeyCode()==KeyEvent.VK_DOWN){
            game.low();
            pane=game.getPane();
            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    block1[i][j].setValue(pane[i][j]);
                }
            }
            if(game.gameOver()==1){
                JOptionPane.showMessageDialog(this, "you lose");
            }
        }
        else if(e.getKeyCode()==KeyEvent.VK_UP){
            game.up();
            pane=game.getPane();
            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    block1[i][j].setValue(pane[i][j]);
                }
            }
            if(game.gameOver()==1){
                JOptionPane.showMessageDialog(this, "you lose");
            }
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO 自动生成的方法存根

    }

}

本来逻辑代码

package game;

import java.util.Random;

public class GameSrc{
    private int pane[][]=new int[4][4];    //棋盘
    int gameOver()    //显示棋盘
    {
        int gameOver=1;//   判断游戏结束条件
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                if(pane[i][j]==0){
                    gameOver=0;
                }
            }
        }
        return gameOver;
    }
    int[][] getPane(){//返回数据
        return pane;
    }
    void newgame()    //开始游戏
    {
        for(int i=0;i<=3;i++)    //初始化棋盘
            for(int j=0;j<=3;j++)
                pane[i][j]=0;

        Random random = new Random();
        int m=random.nextInt(4);//产生一个0到4(不包括4的随机数)
        int n=random.nextInt(4);
        int p=random.nextInt(4);
        int q=random.nextInt(4);

        //在随机的位置上产生初值2
        pane[m][n]=pane[p][q]=2;
    }
    void up(){//向上操作
        int i,j,three;
        boolean move=false;
        for(j=0;j<4;j++){  //上移动
            three=0;
            for(i=0;i<4;i++){
                if(pane[i][j]>0){
                    if(i!=three)
                        move=true;
                    int t=pane[i][j];
                    pane[i][j]=0;
                    pane[three][j]=t;
                    three++;
                }
            }
        }
        for(j=0;j<4;j++){  //合并数
            for(i=0;i<3;i++){
                if(pane[i][j]==pane[i+1][j]&&pane[i][j]!=0){
                    move=true;
                    pane[i][j]=pane[i][j]*2;
                    pane[i+1][j]=0;
                    int k=i+1;
                    for(;k+1<=3&&pane[k+1][j]>0;k++){
                        pane[k][j]=pane[k+1][j];
                        pane[k+1][j]=0;
                    }
                }
            }
        }
        if(move)
            random();//产生随机数
    }
    void low(){ //向下
        int i,j,three;
        boolean move=false;
        for(j=0;j<4;j++){//下移动
            three=3;
            for(i=3;i>=0;i--){
                if(pane[i][j]>0){
                    if(i!=three)
                        move=true;
                    int t=pane[i][j];
                    pane[i][j]=0;
                    pane[i+three-i][j]=t;
                    three--;
                }
            }
        }
        for(j=0;j<4;j++){//合并数
            for(i=3;i>0;i--){
                if(pane[i][j]==pane[i-1][j]&&pane[i][j]!=0){
                    move=true;
                    pane[i][j]=pane[i][j]*2;
                    pane[i-1][j]=0;
                    int k=i-1;
                    for(;k-1>=0&&pane[k-1][j]>0;k--){
                        pane[k][j]=pane[k-1][j];
                        pane[k-1][j]=0;
                    }
                }
            }
        }
        if(move)
            random();
    }
    void left(){//向左
        int i,j,three;
        boolean move=false;
        for(i=0;i<4;i++){//左移动
            three=0;
            for(j=0;j<4;j++){
                if(pane[i][j]>0){
                    if(j!=three)
                        move=true;
                    int t=pane[i][j];
                    pane[i][j]=0;
                    pane[i][three]=t;
                    three++;
                }
            }
        }
        for(i=0;i<4;i++){//合并数
            for(j=0;j<3;j++){
                if(pane[i][j]==pane[i][j+1]&&pane[i][j]!=0){
                    move=true;
                    pane[i][j]=pane[i][j]*2;
                    pane[i][j+1]=0;
                    int k=j+1;
                    for(;k+1<=3&&pane[i][k+1]>0;k++){
                        pane[i][k]=pane[i][k+1];
                        pane[i][k+1]=0;
                    }
                }
            }
        }
        if(move)
            random();

    }
    void right(){//右移
        int i,j,three;
        boolean move=false;
        for(i=0;i<4;i++){
            three=3;
            for(j=3;j>=0;j--){//右移动
                if(pane[i][j]>0){
                    if(j!=three)
                        move=true;
                    int t=pane[i][j];
                    pane[i][j]=0;
                    pane[i][three]=t;
                    three--;
                }
            }
        }
        for(i=0;i<4;i++){//合并数
            for(j=3;j>0;j--){
                if(pane[i][j]==pane[i][j-1]&&pane[i][j]!=0){
                    move=true;
                    pane[i][j]=pane[i][j]*2;
                    pane[i][j-1]=0;
                    int k=j-1;
                    for(;k-1>=0&&pane[i][k-1]>0;k--){
                        pane[i][k]=pane[i][k-1];
                        pane[i][k-1]=0;
                    }
                }
            }
        }
        if(move)
            random();
    }
    void random(){//产生随机数
        Random random = new Random();
        int m=random.nextInt(4);//产生一个0到4(不包括4的随机数)
        int n=random.nextInt(4);
        for(;pane[m][n]!=0;){
            m=random.nextInt(4);//产生一个0到4(不包括4的随机数)
            n=random.nextInt(4);
        }
        if(random.nextBoolean())
            pane[m][n]=2;
        else
            pane[m][n]=4;
    }

}

色块代码

package game;

import javax.swing.*;
import java.awt.*;
public class Block extends JLabel
{
  private int value;
  public Block()
  {
    value = 0;//初始化值为0
    setFont(new Font("font", Font.PLAIN, 40));//设定字体
    setBackground(Color.gray);//设定初始颜色为灰色
  } 

  public int getValue()//获取值
  {
    return value;
  } 

  public void setValue(int value)
  {
    this.value = value;
    String text = String.valueOf(value);
    if (value != 0)
      setText(text);
    else
      setText("");//如果值为0则不显示
    setOpaque(true);
    setColor();
  } 

  public void setColor() //根据值的不同设定不同的背景颜色、label字体
  {
    switch (value)
      {
    case 0:
      setBackground(Color.gray);
      break;
    case 2:
      setBackground(new Color(238, 228, 218));
      break;
    case 4:
      setBackground(new Color(238, 224, 198));
      break;
    case 8:
      setBackground(new Color(243, 177, 116));
      break;
    case 16:
      setBackground(new Color(243, 177, 116));
      break;
    case 32:
      setBackground(new Color(248, 149, 90));
      break;
    case 64:
      setBackground(new Color(249, 94, 50));
      break;
    case 128:
      setBackground(new Color(239, 207, 108));
      break;
    case 256:
      setBackground(new Color(239, 207, 99));
      break;
    case 512:
      setBackground(new Color(239, 203, 82));
      break;
    case 1024:
      setBackground(new Color(239, 199, 57));
      break;
    case 2048:
      setBackground(new Color(239, 195, 41));
      break;
    case 4096:
      setBackground(new Color(255, 60, 57));
      break;
      }
  }
}

时间: 2024-10-14 18:55:57

gui界面2048小游戏的相关文章

Swift实战之2048小游戏

上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完善,就这么整理一下过程中一些值得记录的点吧. 用的Swift版本是2.0,原书中的Swift版本会低一些,所以实践起来有些地方语法并不一样. 一.开始页面   在程序的第一张页面(Main.storyboard)上,只放了一个“开始游戏”按钮,点击按钮,弹出一个提示对话框,确认后,进入游戏页面. 1

用控制台写类窗体2048小游戏

原文地址:用控制台写类窗体2048小游戏作者:余文 2048是一个很简单的小游戏,这是我自己实现的一个版本. 这个版本有两个特色 这是一个高仿窗体程序的控制台程序. 通过使用指针将四个方向的移动简化成了一个方向的移动. 当初刚出来2048小游戏的时候,玩的不亦乐乎.之后根据游戏规则自己花了一下午时间用控制台写了一个玩,没有参考源码. 当时只实现了游戏的移动逻辑和胜负判定逻辑,界面很简单,但已经可以玩玩了. 这是当初刚写完发空间说说得瑟的时候. 今年5月有段时候比较闲,对程序做了较大更新. 实时显

【2048小游戏】——CSS/原生js爬坑之纯CSS模态对话框&amp;游戏结束

引言:2048小游戏的结束界面,使用纯CSS制作模态对话框,一般做模态对话框都会使用BootStrap自带的模态对话框组件方便使用,但在制作要运行在移动端的小项目时,就不能使用BootStrap,因为文件太大,下载耗时,耗费流量. 一.模态对话框的组成 2个Div,一个铺满整屛,一个显示内容 坑:如何让Div铺满整屛?解决:2个办法 宽  高 100%    →    position:absolute:  →   top=0;left=0; 四个方向  margin-top/left/righ

Qt 制作2048小游戏

相信大家都玩过2048把,下面是我用qt写得2048小游戏. 2048.pro HEADERS += Widget.h SOURCES += Widget.cpp main.cpp QT += widgets gui RESOURCES += ico.qrc RC_ICONS = 2048.ico widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QKeyEvent> #include &

JQuery实现2048小游戏

最近用Jqery写了一个2048小游戏,由于是第一次写小游戏,所以就选了一个基础的没什么难度游戏.具体实现如下: 首先在开发时将整个游戏分成两层(自认为),底层是游戏的数据结构以及对数据的操作,上层是显示出来的用户界面.底层选择使用一个4x4的二维数组,整个游戏的数据操作都围绕着这个二维数组进行. [一]游戏基础界面 1 <div id="game"> 2 <div id="header"> 3 <h1>1024</h1&g

[Qt 5.6.2] 利用Qt实现一个难度可变的2048小游戏

利用Qt实现一个难度随时可调的2048小游戏 一.游戏简介 1.规则创新 胜利条件:达成2048 难度变化:玩家可以通过调整难度条来控制随机池(2.4.8.16)中各个数出现的概率,同时也会改变分数的加成比例 移动触发:每次移动后会从随机池中按照概率随机选取一个数,将其随机放置在一个空余位置上 分数计算:总分=基础分+加成分,基础分+=合并的数值,加成分+=随机生成的数值*加成比例 2.游戏效果 二.设计思路 先将该项目分为游戏入口.主窗口设计与游戏逻辑三个主要模块,再在这三个模块的基础上继续细

.NET手撸2048小游戏

.NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEngine,从空白窗口开始,演示如何"手撸"2048小游戏,并在编码过程中感受C#的魅力和.NET编程的快乐. 说明:FlysEngine是封装于Direct2D,重复本文示例,只需在.NET Core 3.0下安装NuGet包FlysEngine.Desktop即可. 并不一定非要做一层封装

C# 开发2048小游戏

这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的童鞋完成了. 更改建议: a.当数字超过四位数时,显示的时候有部分被它的容器TextBox遮挡了,能不能把显示的数值变小点?答案是可以的.代码里有一段通过矩阵数据填充TextBox值的操作,可以在填充时,判断下数值长度,然后修改TextBox的文字大小. b.玩游戏的时候,使用方向键移动时,焦点可能

2048小游戏(C语言版)

1 #include <climits> 2 #include <cstdio> 3 #include <cstring> 4 #include <stack> 5 #include <string> 6 #include <map> 7 #include <vector> 8 #include <cmath> 9 10 11 /* 12 玩法说明:编译运行后,输入一个整数n,表示自己想玩的游戏中是n*n的表格