Java仿太阁立志传5

简介:
没有标题写的那么大……真要用Java重写太阁五不说别的,光整理原图就够累死我的……

游戏截图:



 只是一个太阁五中加农业水平小游戏的再现……用本人loonframework-game包进行图形处理,算是一个对jar包的测试程序,完整程序下载地址,仅将使用到的类和图形打包:

[url]http://looframework.sourceforge.net/download/Tg.jar[/url]

源码如下:

TgIrrigationScript.java
package org.loon.framework.test.tg;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;

import javax.swing.JOptionPane;


import org.loon.framework.game.collection.SimpleArray;
import org.loon.framework.game.image.Bitmap;

/** *//**
 * <p>
 * Title: LoonFramework
 * </p>
 * <p>
 * Description:[太阁立志传小游戏Java模拟之水渠贯通]loonframework-game包由于标准类及接口未完成暂不开源(我懒……目前只完成大约45%而已|||三月没动……)
 * </p>
 * <p>
 * Copyright: Copyright (c) 2007
 * </p>
 * <p>
 * Company: LoonFramework
 * </p>
 * 
 * @author chenpeng
 * @email:[email]ceponline@yahoo.com.cn[/email]
 * @version 0.1
 */
public class TgIrrigationScript extends Panel implements KeyListener ...{

    /** *//**
     * 
     */
    private static final long serialVersionUID = 1L;

    // 生成缓存用背景Image
    Image _screen = new Bitmap(640, 480, 1).getImage();

    //获得画布
    Graphics _graphics = _screen.getGraphics();

    final private int _rs = 6;

    private int[][] _chess = null;

    private int[] _obj_block = null;
    // Bitmap为loonframework提供类,内部混合封装了Image和BufferedImage,提供了通用的处理方式
    // 背景图
    Bitmap _back_bitmap = null;

    // 出水图1
    Bitmap _water_start = null;

    // 出水图2
    Bitmap _water_start2 = null;

    // 左边框图
    Bitmap _left_box = null;

    // 左侧辅助框
    Bitmap[] _leftnew_sprites = null;

    // 砖块地图
    Bitmap[][] _character_sprites = null;

    // 光标
    Bitmap _cursor = null;

    
    Bitmap bitmap = null;

    /** *//**
     * 构造函数
     *
     */
    public TgIrrigationScript() ...{
        initialize();
    }

    /** *//**
     * 初始化
     *
     */
    public void initialize() ...{
        
        setBackground(Color.BLACK);
        setSize(640, 480);

        _leftnew_sprites = new Bitmap[4];

        _character_sprites = new Bitmap[_rs][_rs];

         _back_bitmap = new Bitmap("./image/pano.png");

         _water_start = new Bitmap("./image/water_start.png");

         _water_start2 = new Bitmap("./image/spr16.png");

         _left_box = new Bitmap("./image/left_box.png");

         _cursor = new Bitmap("./image/choose_box.png");

         bitmap = new Bitmap("./image/mud.png");
        // 出水图绘制坐标
        _water_start.setDrawXY(272, 2);
        // 左边框绘制坐标
        _left_box.setDrawXY(25, 20);
        _water_start2.setDrawXY(308, 45);
        //游标绘制坐标
        _cursor.setDrawXY(308, 91);
        for (int i = 0; i < _leftnew_sprites.length; i++) ...{
            _leftnew_sprites[i] = new Bitmap("./image/mud.png");
            _leftnew_sprites[i].setDrawXY(42, 204 - i * 56);
        }
        _leftnew_sprites[0].setDrawY(212);
        for (int i = 0; i <_rs; i++) ...{
            for (int j = 0; j < _rs; j++) ...{
                _character_sprites[i][j] = new Bitmap("./image/mud.png");
                _character_sprites[i][j].setDrawXY(i * 48 + 164, j * 48 + 91);
            }
        }

         _chess = new int[_rs][_rs];

         _obj_block = new int[4];
            // 左侧辅助栏读取图形
            for (int i = 0; i < 4; i++) ...{
                down();
            }
        // 设定监听
        setFocusable(true);
        addKeyListener(this);
    }

    public void update(Graphics g) ...{
        paint(g);
    }

    public void paint(Graphics g) ...{
    

        // 背景绘制
        _back_bitmap.draw(_graphics);
        // 出水图绘制
        _water_start.draw(_graphics);
        //
        _water_start2.draw(_graphics);
        // 左边框图绘制
        _left_box.draw(_graphics);
        // 左侧辅助框绘制
        for (int i = 0; i < _leftnew_sprites.length; i++) ...{
            _leftnew_sprites[i].draw(_graphics);
        }
        // 绘制砖块
        for (int i = 0; i < _character_sprites.length; i++) ...{
            for (int j = 0; j < _character_sprites[i].length; j++) ...{
                _character_sprites[i][j].draw(_graphics);
            }
        }
        // 绘制选中光标
        _cursor.draw(_graphics);
        g.drawImage(_screen, 0, 0, this);
    }

    

    public void down() ...{
        int steps = 0;
        _obj_block[0] = _obj_block[1];
        _leftnew_sprites[0].setBufferedImage(_leftnew_sprites[1]
                .getBufferedImage());
        _obj_block[1] = _obj_block[2];
        _leftnew_sprites[1].setBufferedImage(_leftnew_sprites[2]
                .getBufferedImage());
        _obj_block[2] = _obj_block[3];
        _leftnew_sprites[2].setBufferedImage(_leftnew_sprites[3]
                .getBufferedImage());
        if (steps < (_rs * _rs)) ...{
            // 位图
            int[] tmparr = new int[] ...{3,5,6,7,9,10,11,12,13,14,15};
            // 随即选取
            int tmpint = tmparr[new Random().nextInt(11)];

            _obj_block[3] = tmpint;

            _leftnew_sprites[3].setBufferedImage(new Bitmap("./image/spr"
                    + tmpint + ".png").getBufferedImage());
        } else ...{
            _obj_block[3] = 0;
            _leftnew_sprites[3].setBufferedImage(bitmap.getBufferedImage());
        }
        steps += 1;
    }

    /** *//**
     * 放下事件处理
     * @param x
     * @param y
     */
    public void putCase(int x, int y) ...{
        if (this._chess[x][y] == 0) ...{
            _character_sprites[x][y].setBufferedImage(_leftnew_sprites[0]
                    .getBufferedImage());
            _chess[x][y] = _obj_block[0];
            down();
            //_obj_block[0]为最后的渠道方块,所以为0时代表数据读完
            if (_obj_block[0] == 0) ...{
                endCase();
            }
        }
    }


    /** *//**
     * 判断选中图形能否贯通
     * @param x
     * @param y
     * @param dire
     * @return
     */
    public boolean crossInclude(int x, int y, int dire) ...{
        boolean flag = false;

        switch (dire) ...{
        case 1:
            flag = SimpleArray.include("3,5,7,9,11,13,15", _chess[x][y]);
            break;
        case 2:
            flag = SimpleArray.include("3,6,7,10,11,14,15", _chess[x][y]);
            break;
        case 3:
            flag = SimpleArray.include("5,6,7,12,13,14,15", _chess[x][y]);
            break;
        case 4:
            flag = SimpleArray.include("9,10,11,12,13,14,15", _chess[x][y]);
            break;
        }

        return flag;
    }

    public int tableToObject(int x, int y) ...{
        return (y * _rs) + x;
    }

    public int[] objectToTable(int pos) ...{
        int iy = pos / _rs;
        int ix = pos - (iy * _rs);
        return new int[] ...{ ix, iy };
    }



    public void keyPressed(KeyEvent e) ...{
        int keyCode = e.getKeyCode();

        switch (keyCode) ...{

        case KeyEvent.VK_LEFT:

            if (this._cursor.getDrawX() > 164) ...{
                _cursor.setDrawX(_cursor.getDrawX() - 48);
            }

            break;

        case KeyEvent.VK_RIGHT:

            if (this._cursor.getDrawX() < (_rs * 48 + 164 - 48)) ...{
                _cursor.setDrawX(_cursor.getDrawX() + 48);
            }
            break;

        case KeyEvent.VK_UP:

            if (this._cursor.getDrawY() > 91) ...{
                _cursor.setDrawY(_cursor.getDrawY() - 48);
            }

            break;

        case KeyEvent.VK_DOWN:
            if (this._cursor.getDrawY() < (_rs * 48 + 91 - 48)) ...{
                _cursor.setDrawY(_cursor.getDrawY() + 48);
            }

            break;

        case KeyEvent.VK_ENTER:
            
            putCase((_cursor.getDrawX() - 164) / 48,
                    (_cursor.getDrawY() - 91) / 48);
            
            break;
        case KeyEvent.VK_ESCAPE:
            endCase();
            break;

        }

        repaint();

    }

    public void keyReleased(KeyEvent e) ...{

    }

    public void keyTyped(KeyEvent e) ...{


    }

    public void endCase() ...{

        int allscore = 0;
        int allsum = _rs * _rs;
        //SimpleArray为loonframework-game提供集合类,以字符串方式操作字符数组
        SimpleArray sia1=new SimpleArray(0,35);
        SimpleArray sia2=new SimpleArray();
        _water_start2.setBufferedImage(new Bitmap("./image/wspr16.png")
                .getBufferedImage());
        if (crossInclude(3, 0, 1)) ...{
            sia2.pushAll(sia1.delete(tableToObject(3, 0)));
        }
        while ((sia2.all()!=null)) ...{
            int tmp = Integer.parseInt(sia2.pop());
            int[] result = objectToTable(tmp);
            int tx = result[0];
            int ty = result[1];
              if(crossInclude(tx,ty,1) && ty > 0)...{
                  if(crossInclude(tx,ty-1,3) && (sia1.include(tableToObject(tx,ty-1))))...{
                      sia2.pushAll(sia1.delete(tableToObject(tx,ty-1)));
                  }
              }
              if(crossInclude(tx,ty,2) && tx < _rs-1)...{
                  if(crossInclude(tx+1,ty,4) && (sia1.include(tableToObject(tx+1,ty))))...{
                      sia2.pushAll(sia1.delete(tableToObject(tx+1,ty))); 
                  }
                
              }
              if(crossInclude(tx,ty,3) && ty < _rs-1)...{
                  if(crossInclude(tx,ty+1,1) && sia1.include(tableToObject(tx,ty+1)))...{
                      sia2.pushAll(sia1.delete(tableToObject(tx,ty+1)));
                  }
              }
              if(crossInclude(tx,ty,4) && tx > 0 )...{
                  if(crossInclude(tx-1,ty,2) && sia1.include(tableToObject(tx-1,ty)))...{
                      sia2.pushAll(sia1.delete(tableToObject(tx-1,ty))); 
                  }
              }
        
            int tmpint = _chess[tx][ty];
            
            _character_sprites[tx][ty].setBufferedImage(new Bitmap(
                    "./image/wspr" + tmpint + ".png").getBufferedImage());
            allscore = allscore+1;

        }

        // 刷新
        repaint();
        int pscore = allscore * 100 / allsum;
        int rscore = pscore < 70 ? 1 : (pscore < 82 ? 2 : (pscore < 92 ? 3
                : (pscore < 100 ? 4 : 5)));
        String result = "";
        switch (rscore) ...{
        case 1:
            result = "完成率:"
                    + pscore
                    + "%  级别:[小白] 你在挑战小白的极致吗?!!!!";
            break;
        case 2:
            result = "完成率:" + pscore
                    + "%  级别:[庸才] 嗯,我想你对这个游戏的规则已经基本了解,剩下的可能只是积累经验了。";
            break;
        case 3:
            result = "完成率:"
                    + pscore
                    + "%  级别:[中智] 作为一个普通人,我觉得你在这个游戏来说做的已经不错了,但是你相信你或许是个天才么?记得不要只看着即将落下的那块,也要多考虑以后的情况哟^_^";
            break;
        case 4:
            result = "完成率:"
                    + pscore
                    + "%  级别:[上品] 你离开尽善尽美只有一步之遥,除了运气以外,你可能还需要掌握一个诀窍:为最后几块留下一个万能的空格。";
            break;
        case 5:
            result = "完成率:" + pscore + "%  级别:[天之骄子] 想当年我玩太阁,也就这样了……(^^)b";
            break;

        }
    
        //虽然做了Message类,但是为了演示打包方便所以不用……(其实是关联太杂不好单用|||)
        JOptionPane.showMessageDialog(this,result, "完成", JOptionPane.INFORMATION_MESSAGE); 
    }
    
    public static void main(String[] args) ...{
        java.awt.EventQueue.invokeLater(new Runnable() ...{
            public void run() ...{
                Frame frm = new Frame("Java模拟太阁立志传灌溉游戏");
                frm.add(new TgIrrigationScript());
                frm.setResizable(false);
                frm.setSize(640, 480);
                frm.addWindowListener(new WindowAdapter()...{
                    public void windowClosing(WindowEvent e)...{
                        System.exit(0);
                    }
                });
                frm.setLocationRelativeTo(null);
                frm.setVisible(true);
            }
        });
    }

}

本文转自 cping 51CTO博客,原文链接:http://blog.51cto.com/cping1982/130088




相关文章
FastTunnel - 免费好用的内网穿透工具搭建教程
astTunnel是用.net core开发的一款跨平台内网穿透工具,它可以实现将内网服务暴露到公网供自己或任何人访问。 与其他穿透工具不同的是:FastTunnel项目致力于打造一个易于扩展、易于维护的内网穿透框架,任何人都可以基于该框架二次开发,你可以直接通过nuget安装依赖进行开发,当然它也是开箱即用的工具。
FastTunnel - 免费好用的内网穿透工具搭建教程
|
6月前
|
机器学习/深度学习 自然语言处理 算法
ROLL:面向大规模语言模型的高效强化学习框架
本文主要介绍了一个名为 ROLL(Reinforcement Learning Optimization for Large-scale Learning) 的高效强化学习框架,专为大规模语言模型(LLM)的训练和优化而设计。文章从多个角度详细阐述了 ROLL 的设计理念、核心特性、技术架构、应用场景及实验效果。
ROLL:面向大规模语言模型的高效强化学习框架
|
10月前
|
人工智能 安全 网络虚拟化
指南:Grok官网是什么?国内如何使用grok 3 官网AI
Grok AI 是一款非常强大的人工智能助手,不仅能够在社交媒体管理、语音助手等方面为用户提供便利,还可以极大提升工作效率。
5647 5
|
10月前
|
自然语言处理 语音技术 开发者
吊打中文合成!这款开源语音神器效果炸裂,逼真到离谱!
Spark-TTS 是一个面向中文及多语言文本转语音(TTS)场景的开源项目,旨在帮助开发者快速、简便地生成自然流畅的语音合成结果。它拥有灵活的配置方式和良好的扩展性能,对于需要文本到语音功能的应用场景,如有声读物、播客制作、智能客服、语音助手等,都提供了高可用性和可定制化的方案。凭借对多语种、多音色的支持以及清晰自然的发音质量,Spark-TTS 获得了许多开发者的青睐。
1052 1
|
存储 JavaScript
vue项目中页面跳转传参的方法
vue项目中页面跳转传参的方法
|
JavaScript 算法 安全
出现错误,无法启动 Visual Studio Exit Code:9
出现错误,无法启动 Visual Studio Exit Code:9
518 2
出现错误,无法启动 Visual Studio Exit Code:9
|
IDE 开发工具 C++
AvaloniaUI项目离线开发全攻略:IDE安装、模板应用与NuGet私有化部署一站式解决
本文详细介绍了在离线环境中开发Avalonia UI项目的完整解决方案,包括Visual Studio 2022和JetBrains Rider的离线安装、Avalonia UI模板的配置、私有NuGet服务的部署与使用,以及NuGet包的制作和上传。通过这些步骤,您可以在网络受限或完全离线的环境中顺利进行Avalonia UI项目的开发。
AvaloniaUI项目离线开发全攻略:IDE安装、模板应用与NuGet私有化部署一站式解决
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
2941 2
|
Linux 网络架构
通过route , tracert , traceroute 查看本地路由配置及访问ip或域名时经过的路由信息
通过route , tracert , traceroute 查看本地路由配置及访问ip或域名时经过的路由信息
4702 2
|
Kubernetes Linux 开发者
【实战秘籍】从零开始:用.NET与Docker打造现代化容器化应用之旅
【8月更文挑战第28天】本文详细介绍如何使用 .NET 框架构建并部署 Docker 容器化应用程序,涵盖环境搭建、项目创建、Dockerfile 编写等关键步骤。首先安装必要软件,如 Visual Studio 2022 及 Docker Desktop。接着创建 .NET Core 控制台应用,并在项目根目录编写 Dockerfile 文件。使用 .NET 运行时基础镜像,复制二进制文件,指定入口点。运行命令构建镜像并测试容器。为实现通信,映射端口。最后,标签化镜像并推送到 Docker Hub,为生产环境部署做好准备。掌握这些步骤,即可轻松应对从小型项目到大规模应用的各种需求。
842 0