这是一款非常简单的Java游戏,以修正到半截的LGame-Simple-0.2.5开发(也就是LGame-Simple-0.2.5-test版)。

该游戏目前内置有关卡十一关(可配置),以绘制的牧羊犬与绵羊为主要角色,其中牧羊犬将根据玩家鼠标所在位置移动,而绵羊则始终远离牧羊犬,如何利用此一特性,驱赶指定数量绵羊到达指定羊圈中呢?这个,也就是本游戏的游戏目标了。

游戏源码如下:

package org.loon.test; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Transparency; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StreamTokenizer; import org.loon.framework.game.simple.GameScene; import org.loon.framework.game.simple.action.IAction; import org.loon.framework.game.simple.core.Deploy; import org.loon.framework.game.simple.core.LSystem; import org.loon.framework.game.simple.core.LTimer; import org.loon.framework.game.simple.core.LTimerContext; import org.loon.framework.game.simple.core.ResourceLoader; import org.loon.framework.game.simple.core.Screen; import org.loon.framework.game.simple.utils.GraphicsUtils; /** * Copyright 2008 - 2009 * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * * @project loonframework * @author chenpeng * @email:ceponline@yahoo.com.cn * @version 0.1 */ public class Main extends Screen { private boolean flag; // 背景色、狗的颜色、羊的颜色 final static private Color bg_c1 = new Color(60, 115, 18), bg_c2 = new Color(80, 135, 38), dog_c1 = new Color(162, 112, 6), dog_c2 = new Color(184, 156, 4), sheep_c1 = new Color(224, 222, 176), sheep_c2 = new Color(255, 255, 255); private int sheeps, dogs; private int[] sheep_f; private double dog_rate, sheep_rate; private double[] dog_px, dog_py, dog_vx, dog_vy; private double[] sheep_px, sheep_py, sheep_vx, sheep_vy; private int[] map_n, map_x, map_y, map_r, map_f; // 游戏等级、游戏时间、地图大小、关卡索引、动作桢数 private int level, gtime, maps, stage, frames; private int[] stage_dn, stage_dx, stage_dy, stage_sn, stage_sx, stage_sy, stage_cl; private int[][] stage_cn, stage_cx, stage_cy, stage_cr; private LTimer timer = new LTimer(500); // 制作一个监听类,用以判定当前关卡是否完成 private class ClickAction implements IAction { public void doAction(long timer) { if (flag) { if (level == -1) { resetLevel(); } else { int index = 0; for (int i = 0; i < maps; i++) { if (map_f[i] == 1) { index++; } } if (index == maps) { resetLevel(); } } } } } public Main() { this.level = -1; this.stage = 100; this.maps = 10; this.dogs = 10; this.sheeps = 100; this.dog_rate = 1.0D; this.sheep_rate = 1.0D; this.flag = true; this.sheep_f = new int[sheeps]; this.sheep_px = new double[sheeps]; this.sheep_py = new double[sheeps]; this.sheep_vx = new double[sheeps]; this.sheep_vy = new double[sheeps]; this.dog_px = new double[sheeps]; this.dog_py = new double[sheeps]; this.dog_vx = new double[sheeps]; this.dog_vy = new double[sheeps]; this.map_n = new int[maps]; this.map_x = new int[maps]; this.map_y = new int[maps]; this.map_r = new int[maps]; this.map_f = new int[maps]; this.stage_dn = new int[stage]; this.stage_dx = new int[stage]; this.stage_dy = new int[stage]; this.stage_sn = new int[stage]; this.stage_sx = new int[stage]; this.stage_sy = new int[stage]; this.stage_cl = new int[stage]; this.stage_cn = new int[stage][10]; this.stage_cx = new int[stage][10]; this.stage_cy = new int[stage][10]; this.stage_cr = new int[stage][10]; // 将过关判定匹配给鼠标右键点击事件 this.addMouseEvents(MouseEvent.BUTTON1, "MOUSE_CLICK", new ClickAction()); // 创建游戏背景 this.createGraphics(); // 初始化关卡数据 this.initialize(); } /** * 创建游戏背景 * */ private void createGraphics() { BufferedImage screen = GraphicsUtils.createImage(getWidth(), getHeight(), Transparency.BITMASK); Graphics2D g = screen.createGraphics(); g.setColor(bg_c1); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(bg_c2); g.fillRect(20, 20, getWidth() - 40, getHeight() - 40); g.dispose(); setBackground(screen); } /** * 加载初始数据 * */ private void initialize() { InputStream in = ResourceLoader .getResourceToInputStream("games/sheep.dat"); try { StreamTokenizer str = new StreamTokenizer(new InputStreamReader(in)); int read; while ((read = str.nextToken()) != -1) { if (read == -3) { if ("D".equals(str.sval)) { str.nextToken(); stage = (int) str.nval; str.nextToken(); stage_dn[stage] = (int) str.nval; str.nextToken(); stage_dx[stage] = (int) str.nval; str.nextToken(); stage_dy[stage] = (int) str.nval; } else if ("S".equals(str.sval)) { str.nextToken(); stage = (int) str.nval; str.nextToken(); stage_sn[stage] = (int) str.nval; str.nextToken(); stage_sx[stage] = (int) str.nval; str.nextToken(); stage_sy[stage] = (int) str.nval; } else if ("C".equals(str.sval)) { str.nextToken(); stage = (int) str.nval; str.nextToken(); int j = (int) str.nval; str.nextToken(); stage_cn[stage][j] = (int) str.nval; str.nextToken(); stage_cx[stage][j] = (int) str.nval; str.nextToken(); stage_cy[stage][j] = (int) str.nval; str.nextToken(); stage_cr[stage][j] = (int) str.nval; if (stage_cl[stage] < j) { stage_cl[stage] = j; } } } } } catch (Exception ex) { stage = 0; flag = false; } finally { try { in.close(); in = null; } catch (Exception e) { } } } /** * 绘制游戏画面 */ public void draw(Graphics2D g) { if (level == -1) { drawStart(g); return; } drawMap(g); drawDog(g); drawSheep(g); drawTitle(g); } /** * 更改游戏运行数据 */ public void alter(LTimerContext time) { frames++; if (timer.action(time.getTimeSinceLastUpdate())) { dog_rate = 0.2 * (double) frames; sheep_rate = 0.2 * (double) frames; frames = 0; gtime++; } } /** * 刷新游戏等级 * */ private void resetLevel() { level = level == -1 ? 0 : (level + 1) % (stage + 1); flag = false; gtime = 0; dogs = stage_dn[level]; for (int i = 0; i < dogs; i++) { dog_px[i] = stage_dx[level] + (int) (LSystem.random.nextDouble() * 30D); dog_py[i] = stage_dy[level] + (int) (LSystem.random.nextDouble() * 30D); dog_vx[i] = 0.0D; dog_vy[i] = 0.0D; } sheeps = stage_sn[level]; for (int j = 0; j < sheeps; j++) { sheep_px[j] = stage_sx[level] + (int) (LSystem.random.nextDouble() * 30D); sheep_py[j] = stage_sy[level] + (int) (LSystem.random.nextDouble() * 30D); sheep_vx[j] = 0.0D; sheep_vy[j] = 0.0D; sheep_f[j] = -1; } maps = stage_cl[level] + 1; for (int j = 0; j < maps; j++) { map_x[j] = stage_cx[level][j]; map_y[j] = stage_cy[level][j]; map_r[j] = stage_cr[level][j]; map_n[j] = stage_cn[level][j]; map_f[j] = 0; } } /** * 绘制游戏开始画面 * * @param g */ private void drawStart(Graphics2D g) { g.setColor(bg_c1); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(bg_c2); g.fillRect(20, 20, getWidth() - 40, getHeight() - 40); g.setColor(Color.white); g.drawString("点击屏幕开始游戏", 260, 200); } /** * 绘制游戏状态提示 * * @param g */ private void drawTitle(Graphics2D g) { g.setColor(Color.white); g.drawString("等级 : " + (level + 1), 25, getHeight() - 30); g.drawString("绵羊 : " + sheeps, 100, getHeight() - 30); g.drawString("猎犬 : " + dogs, 185, getHeight() - 30); g.drawString("时间 : " + gtime, 255, getHeight() - 30); } /** * 绘制游戏地图 * * @param g */ private void drawMap(Graphics2D g) { double mx, my, angle; for (int i = 0; i < maps; i++) { if (map_f[i] == 0) { int j = 0; for (int k = 0; k < sheeps; k++) { mx = sheep_px[k] - (double) map_x[i]; my = sheep_py[k] - (double) map_y[i]; angle = Math.sqrt(mx * mx + my * my); if (angle < (double) map_r[i]) { j++; } } if (j == map_n[i]) { map_f[i] = 1; for (int l = 0; l < sheeps; l++) { mx = sheep_px[l] - (double) map_x[i]; my = sheep_py[l] - (double) map_y[i]; angle = Math.sqrt(mx * mx + my * my); if (angle < (double) map_r[i]) { sheep_f[l] = i; } } } g.setColor(Color.green); g.drawOval(map_x[i] - map_r[i], map_y[i] - map_r[i], map_r[i] * 2, map_r[i] * 2); g.drawString("" + map_n[i], map_x[i] - 5, map_y[i] + 5); } else if (map_f[i] == 1) { flag = true; g.setColor(Color.red); g.drawOval(map_x[i] - map_r[i], map_y[i] - map_r[i], map_r[i] * 2, map_r[i] * 2); g.drawString("" + map_n[i], map_x[i] - 5, map_y[i] + 5); } } } /** * 绘制猎犬 * * @param g */ private void drawDog(Graphics2D g) { for (int i = 0; i < dogs; i++) { double dx = (double) getMouseX() - dog_px[i]; double dy = (double) getMouseY() - dog_py[i]; for (int j = 0; j < dogs; j++) { double mx = dog_px[j] - dog_px[i]; double my = dog_py[j] - dog_py[i]; double angle = Math.sqrt(mx * mx + my * my) + 1.0D; if (angle < 40D) { dx += -mx / angle; dy += -my / angle; dog_vx[j] += mx / angle; dog_vy[j] += my / angle; } else { dx += mx / angle; dy += my / angle; } } double offset = Math.sqrt(dx * dx + dy * dy) + 1.0D; dog_vx[i] /= 1.01D; dog_vy[i] /= 1.01D; dog_vx[i] += dx / offset; dog_vy[i] += dy / offset; dog_px[i] += dog_vx[i] / dog_rate; dog_py[i] += dog_vy[i] / dog_rate; if (dog_px[i] < 0.0D) { dog_vx[i] = 0.0D; } if (dog_py[i] < 0.0D) { dog_vy[i] = 0.0D; } if (dog_px[i] > (double) (getWidth() - 5)) { dog_vx[i] = 0.0D; } if (dog_py[i] > (double) (getHeight() - 5)) { dog_vy[i] = 0.0D; } offset = Math.sqrt(dog_vx[i] * dog_vx[i] + dog_vy[i] * dog_vy[i]) + 1.0D; double vx1 = dog_vx[i] / offset; double vy1 = dog_vy[i] / offset; int x = (int) dog_px[i] - 3; int y = (int) dog_py[i] - 3; int x1 = x + (int) (vx1 * 5D); int y1 = y + (int) (vy1 * 5D); g.setColor(Color.darkGray); g.fillOval(x, y + 3, 8, 8); g.setColor(dog_c2); g.fillOval(x, y, 5, 5); g.setColor(dog_c1); g.fillOval(x1, y1, 5, 5); } } /** * 绘制绵羊 * * @param g */ private void drawSheep(Graphics2D g) { double nx, ny, angle; for (int i = 0; i < sheeps; i++) { double mx = 0.0D; double my = 0.0D; if (sheep_f[i] >= 0) { mx = (double) map_x[sheep_f[i]] - sheep_px[i]; my = (double) map_y[sheep_f[i]] - sheep_py[i]; } for (int j = 0; j < sheeps; j++) { nx = sheep_px[j] - sheep_px[i]; ny = sheep_py[j] - sheep_py[i]; angle = Math.sqrt(nx * nx + ny * ny) + 1.0D; if (angle < 15D) { mx += -nx / angle; my += -ny / angle; sheep_vx[j] += nx / angle; sheep_vy[j] += ny / angle; } else { mx += nx / angle; my += ny / angle; } } if (sheep_f[i] == -1) { for (int k = 0; k < dogs; k++) { nx = sheep_px[i] - dog_px[k]; ny = sheep_py[i] - dog_py[k]; angle = Math.sqrt(nx * nx + ny * ny) + 1.0D; if (angle < 200D) { mx += (nx / angle) * (double) sheeps; my += (ny / angle) * (double) sheeps; } } } angle = Math.sqrt(mx * mx + my * my) + 1.0D; sheep_vx[i] /= 1.1000000000000001D; sheep_vy[i] /= 1.1000000000000001D; nx = mx / angle; ny = my / angle; sheep_vx[i] += nx; sheep_vy[i] += ny; sheep_px[i] += sheep_vx[i] / sheep_rate; sheep_py[i] += sheep_vy[i] / sheep_rate; if (sheep_px[i] < 20D) { sheep_px[i] = 20D; sheep_vx[i] = 0.0D; } if (sheep_py[i] < 20D) { sheep_py[i] = 20D; sheep_vy[i] = 0.0D; } if (sheep_px[i] > (double) (getWidth() - 20)) { sheep_px[i] = getWidth() - 20; sheep_vx[i] = 0.0D; } if (sheep_py[i] > (double) (getHeight() - 20)) { sheep_py[i] = getHeight() - 20; sheep_vy[i] = 0.0D; } angle = Math.sqrt(sheep_vx[i] * sheep_vx[i] + sheep_vy[i] * sheep_vy[i]) + 1.0D; nx = sheep_vx[i] / angle; ny = sheep_vy[i] / angle; int x = (int) sheep_px[i] - 3; int y = (int) sheep_py[i] - 3; int x1 = x + (int) (nx * 5D); int y1 = y + (int) (ny * 5D); g.setColor(Color.darkGray); g.fillOval(x, y + 3, 10, 10); g.setColor(sheep_c2); g.fillOval(x, y, 7, 7); g.setColor(sheep_c1); g.fillOval(x1, y1, 7, 7); } } public void leftClick(MouseEvent e) { } public void middleClick(MouseEvent e) { } public void onKey(KeyEvent e) { } public void onKeyUp(KeyEvent e) { } public void rightClick(MouseEvent e) { } public static void main(String[] args) { GameScene frame = new GameScene("牧羊犬与绵羊", 640, 400); Deploy deploy = frame.getDeploy(); deploy.setScreen(new Main()); deploy.setLogo(false); deploy.setShowFPS(true); deploy.setFPS(100); deploy.mainLoop(); frame.showFrame(); } }

截图如下:

下载地址:http://code.google.com/p/loon-simple/downloads/list (源码在jar中)

————————————————————

为LGame-Simple-0.2.5新增的几个小例子之一,在 LGame-Simple-0.2.5正式发布以前,先发点这些小东西凑文章数……

Java游戏-牧羊犬与绵羊相关推荐

  1. Java游戏服务器系列之Netty详解

    今天带大家来学习Java游戏服务器的相关知识,文中对Netty作了非常详细的介绍,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下 一.简介 Java的底层API逐渐复杂,而开发者面对的 ...

  2. java游戏移动_java - Java游戏 - 如何让敌人移动? - SO中文参考 - www.soinside.com

    Java游戏 - 如何让敌人移动? 问题描述 投票:1回答:2 我正在做一个射击游戏,并添加了许多带阵列的敌人,然后在地图上给他们一个随机位置,但我不知道如何让他们在到达他们的位置后移动.这是我的敌人 ...

  3. JAVA游戏编程之三----j2me 手机游戏入门开发--俄罗斯方块_5_使用LUA脚本写游戏

    该程序是基于07年底写的一个J2ME小游戏 俄罗斯方块,将全部逻辑绘制都放到LUA脚本里来做,J2ME方面仅作一个绘制库来使用! 建立J2ME程序这里就不说了, 详见我的BLOG http://blo ...

  4. Java游戏编程前篇 修改eclipse背景颜色

    最近准备开始研究java游戏设计了.(不是安卓的游戏设计,关于安卓的游戏设计,我打算学完java之后直接学cocos2dx,学习java的原因是因为在公司里接触到了eclipse,所以打算顺便将jav ...

  5. java游戏开发基础Swing之JRadioButton

    © 版权声明:本文为博主原创文章,转载请注明出处 1.按钮(JButton) Swing中的按钮是JButton,它是javax.swing.AbstractButton类的子类,Swing中的按钮可 ...

  6. Java游戏触屏处理,非触屏java游戏转换为触屏游戏工具使用方法

    用下面软件可以把非触屏java游戏改为触屏游戏,不会遮挡屏幕,提供了9个可自设触摸键,真是玩rpg类游戏的大福音啊!方法如下: 一.下载HandyPartner.JavaMagic_60b.和halo ...

  7. [转]Java游戏引擎

    JME(jMonkey Engine): JME是一个高性能的3D图形API,采用LWJGL作为底层支持.它的后续版本将支持JOGL.JME和Java 3D具有类似的场景结构,开发者必须以树状方式组织 ...

  8. 浅谈2011年上半年Java游戏领域动态

    浅谈2011年上半年Java游戏领域动态 时间过得真快,转瞬已是 2011 年 6 月,仿佛都能听到 2012 正率领天启四骑士向我们快速冲锋的马蹄声了.所以趁着世界还没毁灭,我就先来谈谈 2011 ...

  9. JAVA游戏引擎!FXGL 教程 总目录

    喜欢打游戏也喜欢编程,总想开发一款自己的游戏,圆自己儿时的一个梦. 我并非要编写一个游戏引擎,故而也用不到LWJGL这种层级的引擎,如果你也是一个和我一样单纯想做一款游戏的javaer,那你也可以和我 ...

最新文章

  1. 2018:数据科学20个最好的Python库
  2. 2017青岛计算机报名,【青岛市2017年第二批次计算机应用能力考试报名通知】- 环球网校...
  3. 【原创】有关Silverlight中“DataGrid中级联动态绑定父/子ComboBox ”的示例。
  4. android文件选择器_Android存储空间的最佳实践(上)
  5. Counting Bits
  6. sqlMapConfig.xml配置文件详解
  7. CSS 自由缩放 resize属性
  8. Python将csv格式转换为xlsx
  9. 2021-2025年中国伊维菌素原料药行业市场供需与战略研究报告
  10. 计算机用户改路径,如何更改win7 Users(用户文件夹)文件存放位置?
  11. 没有Path的Binding
  12. C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项...
  13. Python中MySQL查询结果返回类型
  14. mmap文件内存映射
  15. 51单片机中断程序大全
  16. C4D怎么快速建模桌布? c4d创建桌布的教程
  17. 莱维特LEWITT声卡驱动安装设置方法
  18. 一个被数字化的职场技术人
  19. 学习编程悟出8个字《精辟》!
  20. node 压缩图片_Tinypng - 比ps更厉害的免费图片压缩神器

热门文章

  1. 出现了,在混凝土养护行业,比干湿球湿度计还好用的仪器
  2. 我的大学专业是计算机英语作文,电脑-Computers-大学英语作文_1500字_英语作文
  3. python游戏开发实战:网络游戏Demo(客户端)
  4. 自媒体人必备:国内最专业的自媒体平台导航网站,有它就够了
  5. Java IO 遇到的错误
  6. 类似于喜马拉雅的php源码,源码分享:高仿喜马拉雅FM
  7. 立创EDA将工程中的元件存入元件库的方法
  8. 扣丁音乐(三)——UI框架的实现
  9. Rails中多重子表多条件查询
  10. 使用陈老师排课12.0(正式版)进行新高考(3+1+2)排课