Java 实现 1024 小游戏【附源码】

简介: Java 实现 1024 小游戏【附源码】

1 前言

🚀获取源码,文末公众号回复【1024】,即可。

⭐欢迎点赞留言

2 正文

2.1 展示

1.4MB GIF可以欣赏:https://tva2.sinaimg.cn/large/007F3CC8ly1h0r2x7v9i6g31190noe81.gif


2.2 项目结构

2.2 主要代码展示

package com.tudou;

import java.awt.event.KeyEvent;
import java.util.HashMap;

/*
 * 方块
 */
public class Block {
  public static HashMap<Integer, int[]> numberblocks = new HashMap<>();
  
  static {
    int[][] hexColors = {{184, 212, 235}, {158, 172, 238}, { 16, 200, 221}, {  7, 169, 239}, { 41, 124, 183}, 
               {150, 224,  52}, { 33, 225,  59}, {203, 121, 252}, { 10, 197, 158}, {  4,   2,  89},
               { 71,  97, 245}, { 67,  17, 237}, {209, 252, 060}, {247, 211,  84}, {216, 167, 133},
               {244, 128,  92}, {215,  65,  74}, {172,  70,  56}, {191,  20,  98}, {209,  14,   4}};
    int[] zeroColors = {219, 219, 219};
    Block.numberblocks.put(new Integer(0), zeroColors);
    for(int i=1; i <= hexColors.length; i++){
      Block.numberblocks.put(new Integer((int) Math.pow(2,i)), hexColors[i-1]);
    }
    
  }
  
  public static int[] getColor(Integer number){
    return Block.numberblocks.get(number);
  }
  
  public static Block random(int pos_x, int pos_y){
    //int count = Block.numberblocks.size();
    int count = 3;
    int power = (int) (Math.random()*100%count) + 1;
    int number = (int) Math.pow(2, power);
    Block block = new Block(number, pos_x, pos_y);
    return block;
  }
  
  
  public int number;
  public int pos_x;//lie
  public int pos_y;//hang
  
  public Block(int number, int pos_x, int pos_y) {
    // TODO Auto-generated constructor stub
    this.number = number;
    this.pos_x = pos_x;
    this.pos_y = pos_y;
  }
  
  public void setNumber(int number){
    this.number = number;
  }

  private void setPostion(int pos_x, int pos_y){
    this.pos_x = pos_x;
    this.pos_y = pos_y;
  }
  
  public void merge(){
    this.number += number;
  }
  
  public void move(int direction){
    switch (direction) {
      case KeyEvent.VK_W:
        this.setPostion(pos_x, pos_y-1);
        break;
        
      case KeyEvent.VK_S:
        this.setPostion(pos_x, pos_y+1);
        break;
        
      case KeyEvent.VK_A:
        this.setPostion(pos_x-1, pos_y);
        break;
        
      case KeyEvent.VK_D:
        this.setPostion(pos_x+1, pos_y);
        break;

      default:
        break;
    }
  }
  
  
}

2.4 按钮相关类

package com.tudou;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class Grassdurian extends JFrame{

  public int count_x; //水平方块个数
  public int count_y; //垂直方块个数
  public int size; //尺寸
  public int distance;//间距
  private Block[][] blocks; //方块
  private Block activitedBlock; //活动方块
  private int scope; //分数
  
  public Grassdurian(int count_x, int count_y, int size, int distance){
    init(count_x, count_y, size, distance);
  }
  
  public void init(int count_x, int count_y, int size, int distance){
    this.count_x = count_x;
    this.count_y = count_y;
    this.size = size;
    this.distance = distance;
    this.scope = 0;
    prepareGUI();
  }
  
  // 运行
  public void run(){
    //
    this.scope = 0;
    this.blocks = new Block[count_y][count_x];
    for(int line=0; line < count_x; line++){
      for(int row=0; row < count_y; row++){
        this.blocks[line][row] = Block.random(row, line);
        if(Math.random()*10 >= 5){
          System.out.println("设置为0");
          this.blocks[line][row].setNumber(0);
        }
      }
    }
    this.setActivitedBlock(blocks[count_y/2][count_x/2]);
    repaint();
    
  }
  
  // 准备GUI
  private void prepareGUI(){
    
    
    this.setTitle("1024");
    this.setSize((size+distance)*count_x, (size+distance)*count_y);
    this.setLayout(new GridLayout(count_y, count_x));
    
    // 窗口事件处理
    this.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent windowEvent){
          System.exit(0);
      }        
    }); 

    // 按键事件处理
    this.addKeyListener(new KeyAdapter() {
      public void keyPressed(KeyEvent e){
        int keyCode = e.getKeyCode();
        //空格
        if(keyCode == KeyEvent.VK_SPACE){
          run();
        }else{
          move(keyCode);
          repaint();
          setTitle("1024 总分数"+scope);
          
        }
      }
    });
    
    // 鼠标事件处理
    this.addMouseListener(new MouseAdapter() {
      @Override
      public void mouseClicked(MouseEvent e) {
        super.mouseClicked(e);
        setActivitedBlockByPostion(e.getX(), e.getY());
      }
    });
    
    this.setVisible(true);
          
  }
  
  
  @Override
  public void paint(Graphics g){
    drawCanvas(g);
  }
  
  // 通过位置设置活动方块
  public void setActivitedBlockByPostion(int pos_x, int pos_y){
    int x = pos_x/size;
    int y = pos_y/size;
    Block block = blocks[y][x];
    setActivitedBlock(block);
    repaint();
  }
  
  // 设置活动方块
  public void setActivitedBlock(Block block){
    this.activitedBlock = block;
  }
  
  // 绘制画布
  public void drawCanvas(Graphics g)
  {
    // 清屏
    g.setColor(new Color(255, 255, 255));
    g.fillRect(0, 0, (size+distance)*count_x, (size+distance)*count_y);
    
    for(int line=0; line < count_y; line++){
      for(int row=0; row < count_x; row++){
        Block block = this.blocks[line][row];
        int[] colors = Block.getColor(block.number);
        String number = String.valueOf(block.number);
        int numberLength = number.length();
        int fontSize = size/numberLength;
        int x = block.pos_x*(size+distance);
        int y = block.pos_y*(size+distance);
        int width = size-distance;
        int height = size-distance;
        
        
        // 绘制矩形
        g.setColor(new Color(colors[0], colors[1], colors[2]));
        g.fillRect(x, y, width, height);
        
        // 绘制数字
        g.setFont(new Font("黑体",Font.PLAIN, fontSize));
        g.setColor(new Color(31, 31, 31));
        g.drawString(number, x+(width/4), y+(height/numberLength)); 
      } 
    }
    
    // 绘制活动方块
    int x = activitedBlock.pos_x*(size+distance);
    int y = activitedBlock.pos_y*(size+distance);
    int width = size-distance;
    int height = size-distance;
    Graphics2D graphics2d = (Graphics2D)g;
    graphics2d.setColor(Color.RED);
    graphics2d.setStroke(new BasicStroke(distance/2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
    graphics2d.drawRect(x, y, width, height);
  }
  
  
  // 方块矩阵移动
  public void move(int direction){
    System.out.println("方块矩阵移动");
    
    int row = activitedBlock.pos_x;//lie
    int line = activitedBlock.pos_y;//hang
    System.out.println("当前活动块的位置"+activitedBlock.pos_y+":"+activitedBlock.pos_x);
    
    switch (direction) {
      case KeyEvent.VK_W:
        row = count_x;
        for(int r=0; r < row; r++){
          for(int l=0; l < line; l++){
            Block top = blocks[l][r];
            System.out.println(top.pos_y+":"+top.pos_x+"="+top.number);
            Block botton = blocks[l+1][r];

            if(top.number == botton.number){
              this.scope += top.number;
              top.merge();
              
              System.out.println("匹配"+top.pos_y+":"+ top.pos_x+"-"+botton.pos_y+":"+botton.pos_x);
              System.out.println("合并后移动剩下的块");
//              
              for(int iline=l+1; iline < count_y-1; iline++){
                blocks[iline][r] = blocks[iline+1][r];
                blocks[iline][r].move(KeyEvent.VK_W);
                System.out.println("移动"+blocks[iline][r].pos_y+"行"+blocks[iline][r].pos_x+"列="+blocks[iline][r].number);
              }
              
              System.out.println("生成"+(count_y-1)+"行"+r+"列=");
              blocks[count_y-1][r] = Block.random(r, count_y-1);
              
              break;
            }
          }   
        }
        break;
      
      case KeyEvent.VK_S:
        
        row = count_x;
        for(int r=0; r < row; r++){
          for(int l=count_y-1; l > line; l--){
            Block botton = blocks[l][r];
            System.out.println(botton.pos_y+":"+botton.pos_x+"="+botton.number);
            Block top = blocks[l-1][r];

            if(top.number == botton.number){
              this.scope += botton.number;
              botton.merge();
              
              System.out.println("匹配"+botton.pos_y+":"+ botton.pos_x+"-"+top.pos_y+":"+top.pos_x+"="+botton.number);
              System.out.println("合并后移动剩下的块");
              
//              
              for(int iline=l-1; iline > 0; iline--){
                blocks[iline][r] = blocks[iline-1][r];
                blocks[iline][r].move(KeyEvent.VK_S);
                System.out.println("上一行移动到"+blocks[iline][r].pos_y+"行"+blocks[iline][r].pos_x+"列="+blocks[iline][r].number);
              }
              
              System.out.println("生成"+(0)+"行"+r+"列=");
              blocks[0][r] = Block.random(r, 0);
              break;
            }
              
          }   
        }
        break;
      
      case KeyEvent.VK_A:
        line = count_y;
        for(int l=0; l < line; l++){
          for(int r=0; r < row; r++){
            Block left = blocks[l][r];
            System.out.println(left.pos_y+":"+left.pos_x+"="+left.number);
            Block right = blocks[l][r+1];

            if(left.number == right.number){
              this.scope += left.number;
              left.merge();
              
      
              System.out.println("匹配"+left.pos_y+":"+ left.pos_x+"-"+right.pos_y+":"+right.pos_x+"="+right.number);
              System.out.println("合并后移动剩下的块");
              
//              
              for(int irow=r+1; irow < count_x-1; irow++){
                blocks[l][irow] = blocks[l][irow+1];
                blocks[l][irow].move(KeyEvent.VK_A);
                System.out.println("上一行移动到"+blocks[l][irow].pos_y+"行"+blocks[l][irow].pos_x+"列="+blocks[l][irow].number);
              }
              
              System.out.println("生成"+(l)+"行"+4+"列=");
              blocks[l][4] = Block.random(4, l);
              break;
            }
              
          }   
        }
        break;
      
      case KeyEvent.VK_D:
        line = count_y;
        for(int l=0; l < line; l++){
          for(int r=count_x-1; r > row; r--){
            Block right = blocks[l][r];
            System.out.println(right.pos_y+":"+right.pos_x+"="+right.number);
            Block left = blocks[l][r-1];

            if(left.number == right.number){
              this.scope += right.number;
              right.merge();
              
      
              System.out.println("匹配"+left.pos_y+":"+ left.pos_x+"-"+right.pos_y+":"+right.pos_x+"="+right.number);
              System.out.println("合并后移动剩下的块");
              
              for(int irow=r-1; irow > 0; irow--){
                blocks[l][irow] = blocks[l][irow-1];
                blocks[l][irow].move(KeyEvent.VK_D);
                System.out.println("上一行移动到"+blocks[l][irow].pos_y+"行"+blocks[l][irow].pos_x+"列="+blocks[l][irow].number);
              }
              
              System.out.println("生成"+(l)+"行"+0+"列=");
              blocks[l][0] = Block.random(0, l);
              break;
            }
              
          }   
        }
        break;

      default:
        break;
    }
    
  }
  
  
}

2.5 启动类

packapackage com.tudou;

public class Test {

  public static void main(String[] args) {
    
    Grassdurian grassdurian = new Grassdurian(5, 5, 100, 10);
    grassdurian.run();

    

  }

}



不会还有人没 点赞 + 关注 + 收藏 吧!


目录
相关文章
|
8月前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
525 7
|
8月前
|
消息中间件 算法 安全
JUC并发—1.Java集合包底层源码剖析
本文主要对JDK中的集合包源码进行了剖析。
|
8月前
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
287 5
|
3月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
3月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
7月前
|
JavaScript Java 关系型数据库
家政系统源码,java版本
这是一款基于SpringBoot后端框架、MySQL数据库及Uniapp移动端开发的家政预约上门服务系统。
223 6
家政系统源码,java版本
|
7月前
|
供应链 JavaScript 前端开发
Java基于SaaS模式多租户ERP系统源码
ERP,全称 Enterprise Resource Planning 即企业资源计划。是一种集成化的管理软件系统,它通过信息技术手段,将企业的各个业务流程和资源管理进行整合,以提高企业的运营效率和管理水平,它是一种先进的企业管理理念和信息化管理系统。 适用于小微企业的 SaaS模式多租户ERP管理系统, 采用最新的技术栈开发, 让企业简单上云。专注于小微企业的应用需求,如企业基本的进销存、询价,报价, 采购、销售、MRP生产制造、品质管理、仓库库存管理、财务应收付款, OA办公单据、CRM等。
424 23
|
6月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
326 3
|
8月前
|
Java
【源码】【Java并发】【ConcurrentHashMap】适合中学体质的ConcurrentHashMap
本文深入解析了ConcurrentHashMap的实现原理,涵盖JDK 7与JDK 8的区别、静态代码块、构造方法、put/get/remove核心方法等。JDK 8通过Node数组+链表/红黑树结构优化并发性能,采用CAS和synchronized实现高效锁机制。文章还详细讲解了hash计算、表初始化、扩容协助及计数更新等关键环节,帮助读者全面掌握ConcurrentHashMap的工作机制。
198 6
【源码】【Java并发】【ConcurrentHashMap】适合中学体质的ConcurrentHashMap
|
8月前
|
Java
【源码】【Java并发】【LinkedBlockingQueue】适合中学体质的LinkedBlockingQueue入门
前言 有了前文对简单实用的学习 【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门 聪明的你,一定会想知道更多。哈哈哈哈哈,下面主播就...
179 6
【源码】【Java并发】【LinkedBlockingQueue】适合中学体质的LinkedBlockingQueue入门