java画羊_Java游戏-牧羊犬与绵羊

2023-12-02 18:20

本文主要是介绍java画羊_Java游戏-牧羊犬与绵羊,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是一款非常简单的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();

}

}

截图如下:

20091129_00633950977148750000.jpg

20091129_01633950977838437500.jpg

20091129_02633950977839218750.jpg

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

为LGame-Simple-0.2.5新增的几个小例子之一,在

LGame-Simple-0.2.5正式发布以前,先发点这些小东西凑文章数……

这篇关于java画羊_Java游戏-牧羊犬与绵羊的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/446331

相关文章

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二