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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定