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();

    

  }

}



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


目录
相关文章
|
1月前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
65 7
|
2月前
|
数据采集 人工智能 Java
Java产科专科电子病历系统源码
产科专科电子病历系统,全结构化设计,实现产科专科电子病历与院内HIS、LIS、PACS信息系统、区域妇幼信息平台的三级互联互通,系统由门诊系统、住院系统、数据统计模块三部分组成,它管理了孕妇从怀孕开始到生产结束42天一系列医院保健服务信息。
39 4
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
93 2
|
1天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
25天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
110 13
|
2月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
59 12
|
1月前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
2月前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
54 3
|
2月前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
125 4
|
1月前
|
人工智能 移动开发 安全
家政上门系统用户端、阿姨端源码,java家政管理平台源码
家政上门系统基于互联网技术,整合大数据分析、AI算法和现代通信技术,提供便捷高效的家政服务。涵盖保洁、月嫂、烹饪等多元化服务,支持多终端访问,具备智能匹配、在线支付、订单管理等功能,确保服务透明、安全,适用于家庭生活的各种需求场景,推动家政市场规范化发展。