用java做一个小游戏源代码_用java编写的小游戏源代码分析

用java编写的小游戏源代码分析

1/5/2008人气:12951

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.*;

public class GreedSnake implements KeyListener{

JFrame mainFrame;

Canvas paintCanvas;

JLabel labelScore;

SnakeModel snakeModel = null;

public static final int canvasWidth = 200;

public static final int canvasHeight = 300;

public static final int nodeWidth = 10;

public static final int nodeHeight = 10;

public GreedSnake() {

mainFrame = new JFrame("GreedSnake");

Container cp = mainFrame.getContentPane();

labelScore = new JLabel("Score:");

cp.add(labelScore, BorderLayout.NORTH);

paintCanvas = new Canvas();

paintCanvas.setSize(canvasWidth+1,canvasHeight+1);

paintCanvas.addKeyListener(this);

cp.add(paintCanvas, BorderLayout.CENTER);

JPanel panelButtom = new JPanel();

panelButtom.setLayout(new BorderLayout());

JLabel labelHelp;

labelHelp = new JLabel("PageUp, PageDown for speed;", JLabel.CENTER);

panelButtom.add(labelHelp, BorderLayout.NORTH);

labelHelp = new JLabel("ENTER or R or S for start;", JLabel.CENTER);

panelButtom.add(labelHelp, BorderLayout.CENTER);

labelHelp = new JLabel("SPACE or P for pause",JLabel.CENTER);

panelButtom.add(labelHelp, BorderLayout.SOUTH);

cp.add(panelButtom,BorderLayout.SOUTH);

mainFrame.addKeyListener(this);

mainFrame.pack();

mainFrame.setResizable(false);

mainFrame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);

mainFrame.setVisible(true);

begin();

}

public void keyPRessed(KeyEvent e){

int keyCode = e.getKeyCode();

if (snakeModel.running)

switch(keyCode){

case KeyEvent.VK_UP:

snakeModel.changeDirection(SnakeModel.UP);

break;

case KeyEvent.VK_DOWN:

snakeModel.changeDirection(SnakeModel.DOWN);

break;

case KeyEvent.VK_LEFT:

snakeModel.changeDirection(SnakeModel.LEFT);

break;

case KeyEvent.VK_RIGHT:

snakeModel.changeDirection(SnakeModel.RIGHT);

break;

case KeyEvent.VK_ADD:

case KeyEvent.VK_PAGE_UP:

snakeModel.speedUp();

break;

case KeyEvent.VK_SUBTRACT:

case KeyEvent.VK_PAGE_DOWN:

snakeModel.speedDown();

break;

case KeyEvent.VK_SPACE:

case KeyEvent.VK_P:

snakeModel.changePauseState();

break;

default:

}

if (keyCode == KeyEvent.VK_R

keyCode == KeyEvent.VK_S

keyCode == KeyEvent.VK_ENTER){

snakeModel.running = false;

begin();

}

}

public void keyReleased(KeyEvent e){

}

public void keyTyped(KeyEvent e){

}

void repaint(){

Graphics g = paintCanvas.getGraphics();

//draw background

g.setColor(Color.WHITE);

g.fillRect(0,0,canvasWidth,canvasHeight);

// draw the snake

g.setColor(Color.BLACK);

LinkedList na = snakeModel.nodeArray;

Iterator it = na.iterator();

while(it.hasNext()){

Node n = (Node)it.next();

drawNode(g,n);

}

// draw the food

g.setColor(Color.RED);

Node n = snakeModel.food;

drawNode(g,n);

updateScore();

}

private void drawNode(Graphics g, Node n){

g.fillRect(n.x*nodeWidth,

n.y*nodeHeight,

nodeWidth-1,

nodeHeight-1);

}

public void updateScore(){

String s = "Score: " + snakeModel.score;

labelScore.setText(s);

}

void begin(){

if (snakeModel == null !snakeModel.running){

snakeModel = new SnakeModel(this,

canvasWidth/nodeWidth,

canvasHeight/nodeHeight);

(new Thread(snakeModel)).start();

}

}

public static void main(String[] args){

GreedSnake gs = new GreedSnake();

}

}

///

// 文件2

///

import java.util.*;

import javax.swing.*;

class SnakeModel implements Runnable{

GreedSnake gs;

boolean[][] matrix;

LinkedList nodeArray = new LinkedList();

Node food;

int maxX;

int maxY;

int direction = 2;

boolean running = false;

int timeInterval = 200;

double speedChangeRate = 0.75;

boolean paused = false;

int score = 0;

int countMove = 0;

// UP and DOWN should be even

// RIGHT and LEFT should be odd

public static final int UP = 2;

public static final int DOWN = 4;

public static final int LEFT = 1;

public static final int RIGHT = 3;

public SnakeModel(GreedSnake gs, int maxX, int maxY){

this.gs = gs;

this.maxX = maxX;

this.maxY = maxY;

// initial matirx

matrix = new boolean[maxX][];

for(int i=0; i

matrix[i] = new boolean[maxY];

Arrays.fill(matrix[i],false);

}

// initial the snake

int initArrayLength = maxX > 20 ? 10 : maxX/2;

for(int i = 0; i < initArrayLength; ++i){

int x = maxX/2+i;

int y = maxY/2;

nodeArray.addLast(new Node(x, y));

matrix[x][y] = true;

}

food = createFood();

matrix[food.x][food.y] = true;

}

public void changeDirection(int newDirection){

if (direction % 2 != newDirection % 2){

direction = newDirection;

}

}

public boolean moveOn(){

Node n = (Node)nodeArray.getFirst();

int x = n.x;

int y = n.y;

switch(direction){

case UP:

y--;

break;

case DOWN:

y++;

break;

case LEFT:

x--;

break;

case RIGHT:

x++;

break;

}

if ((0 <= x && x < maxX) && (0 <= y && y < maxY)){

if (matrix[x][y]){

if(x == food.x && y == food.y){

nodeArray.addFirst(food);

int scoreGet = (10000 - 200 * countMove) / timeInterval;

score += scoreGet > 0? scoreGet : 10;

countMove = 0;

food = createFood();

matrix[food.x][food.y] = true;

return true;

}

else

return false;

}

else{

nodeArray.addFirst(new Node(x,y));

matrix[x][y] = true;

n = (Node)nodeArray.removeLast();

matrix[n.x][n.y] = false;

countMove++;

return true;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea右键项目没有git 【解决方法】

右键项目&#xff0c;没有git选项 解决方法&#xff1a; 进入settings,然后搜索version,按下图点击即可&#xff1a; over&#xff0c;解决&#xff1a;

java注解执行顺序_如何确保java中的注释执行顺序?

您可以使用Order注释确保自定义注释的顺序.例&#xff1a;第一个注释&#xff1a;Retention(RetentionPolicy.RUNTIME)Target(ElementType.METHOD)public interface CustomAnnotation {}AspectComponentOrder(value 1)public class CustomAnnotationInterceptor {Before("…

用java设计秒表_运用Java编写 秒表程序

import java.awt.*;import java.awt.event.*;import javax.swing.*;public class SecondJFrame extends JFrame implements ActionListener,FocusListener{ //响应单击、焦点事件private JTextField text;private JB…

GIT commit问题 No errors and 30 warnings found. Would you like to review them?

GIT commit问题 No errors and 30 warnings found. Would you like to review them?

java spring 条件注解_【Spring】Spring高级话题-条件注解-@Condition

进行本示例的演示&#xff0c;需要先配置好Maven和Spring哦、见:【Spring】基于IntelliJ IDEA搭建Maven分析通过profile&#xff0c;我们可以获得不同的profile&#xff0c;我们可以获得不同的Bean。Spring4提供了一个更通用的基于条件的Bean的创建&#xff0c;即使用Condition…

META-INF目录是干啥用的?

平时写的web项目打包成jar文件之后会发现里面不知道为啥多出了一个叫做META-INF的目录&#xff0c;点开之后发现里面还出现了一个manifest.mf文件。出于好奇我在网上找了找这个目录的用途&#xff0c;结果还是没有找到一个比较通俗的解释&#xff0c;我这种菜鸟对那种比较正规的…

解决springBoot 的templates中html引入css文件失败

我的情况是网页打开没有css效果 文件结构&#xff1a; 解决办法1&#xff1a;修改路径&#xff08;springBoot已经默认静态资源在static文件夹&#xff09;只需href“css/你的.css” 解决办法2&#xff1a;增加配置文件 解决办法3&#xff1a;使用 templates语法引入

java并发 cpu高_java高并发核心要点|系列5|CPU内存伪共享

上节提到的&#xff1a;伪共享&#xff0c;今天我们来说说。那什么是伪共享呢&#xff1f;这得从CPU的缓存结构说起。以下如图&#xff0c;CPU一般来说是有三级缓存&#xff0c;1 级&#xff0c;2级&#xff0c;3级&#xff0c;越上面的&#xff0c;越靠近CPU的&#xff0c;速度…

关于request.getRequestDispatcher()的两个方法

一、getRequestDispatcher() getRequestDispatcher()包含两个重要方法&#xff0c;分别是请求转发和请求包含。一个请求跨多个Servlet时&#xff0c;需要使用请求转发和请求包含。 首先需要获得一个RequestDispatcher 对象&#xff1a;RequestDispatcher rd request.getReque…

mysql 行级锁 索引_mysql 行级锁 索引唯一值

做项目时由于业务逻辑的需要&#xff0c;必须对数据表的一行或多行加入行锁&#xff0c;举个最简单的例子&#xff0c;图书借阅系统。假设 id1 的这本书库存为 1 &#xff0c;但是有 2 个人同时来借这本书&#xff0c;此处的逻辑为Select restnum from book where id 1 ;-- 如果…

springboot拦截了静态资源css,js,jpg,png等

SpringBoot中自己写的拦截器&#xff0c;居然把静态资源也拦截了&#xff0c;导致了页面加载失败 /****/ Configuration public class SpringMvcWebConfigSupport implements WebMvcConfigurer {/*** 默认访问的是首页** param registry*/Overridepublic void addViewControlle…

java simplejson_JSON.simple首页、文档和下载 - JSON/BSON开发包 - OSCHINA - 中文开源技术交流社区...

JSON.simple是一个简单的Java类库&#xff0c;用于解析和生成JSON文本。不依赖于其它类库&#xff0c;性能高。示例代码&#xff1a;System.out.println("decode");String s"[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\&quo…

POST请求转换为其他请求失效 input type=“hidden“ name=“_method“ value=“put“无效

在使用Springboot进行RESTFUL风格开发时需要将表单数据以其他请求提交。 直接在表单中添加 <input type"hidden" name"_method" value"put"/>再次提交时&#xff0c;依然是使用 POST 方法。 原因是在 Spring Boot 的 META-INF/spring-con…

java 多态实现的jvm调用过程_多态:JVM是如何进行方法调用的

在我们平时的工作学习中写java代码时&#xff0c;如果我们在同一个类中定义了两个方法名和参数类型都相同的方法时&#xff0c;编译器会直接报错给我们。还有在代码运行的时候&#xff0c;如果子类定义了一个与父类完全相同的方法的时候&#xff0c;父类的方法就会被覆盖&#…

request.getContextPath()取不到值

request.getContextPath()得到项目的名字 如果项目为根目录,则得到一个"",即空的字条串, 如果项目为abc, <%request.getContextPath()% >/ 将得到abc/

java 0l是多少_Java 构造器 - osc_0ltyoebk的个人空间 - OSCHINA - 中文开源技术交流社区...

Java 基础构造器构造器:构造对象.1.构造方法的名字必须和类名字保持一致.2.构造方法没有返回类型.(不是没有返回值!!!!!!!!!!!!!)3.构造方法可以定义参数,也可以不定义,参数默认的是无参构造.4.构造方法也遵守访问修饰符的限制,5.构造方法也支持方法的重载.6.会先执行方法.什么…

编写一个java打印心程序_java – ?同时打印心脏符号

很抱歉问一个愚蠢的问题,我们正在尝试将心脏符号从数据库打印到Java XML文件.但同样的印刷品是“&#xff1f;”不知道我错过了哪里.尝试过char unicode.作为一种练习,我在main方法中尝试使用它.请查找示例java类.public static void main(String[] args) {String t "\u2…

java文件的上传

java使用apache commons-fileupload组件实现文件上传&#xff08;控制文件上传的类型、文件上传的大小&#xff09; 1.导入jar包&#xff08;需要两个&#xff0c;idea中导入依赖&#xff0c;只需要导入common-fileupload&#xff0c;io会自动导入) common-fileupload.jar com…

java 皮鞋_java反射

一、反射的概述反射机制允许java程序加载一个运行时才得知其名称的类&#xff0c;获悉其完整API信息&#xff0c;包括其修饰符、超类、实现的接口&#xff0c;也包括属性和方法的所有信息&#xff1b;二、反射的作用能够分析类能力的程序成为反射(reflective)。反射的功能极其强…

Docker启动MySql后连接报1251处理方法

问题描述&#xff1a; docker成功启动mysql容器后使用navicat连接报1251 - Client does not support authentication protocol requested byserver;consider upgrading MySQL client 处理方法&#xff1a; 首先进入MySQL容器内 docker exec -it mysql bash登录MySQL mysql -…