代码java(新手要敲好Java代码有什么技巧)

2025-07-03 03:00:02 0

代码java(新手要敲好Java代码有什么技巧)

本篇文章给大家谈谈代码java,以及新手要敲好Java代码有什么技巧对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

本文目录

新手要敲好Java代码有什么技巧

对于Java新手来说,很棘手的一个问题,就是如何才能够敲好代码?很多Java新手在刚开始接触Java编程的知识的时候,理论才刚上手,就希望自己能够立马在计算机上敲简单的代码,尝试过的朋友都知道,这有点急于求成了,是个很难办到的问题。

Java新手如何才能够敲好代码?作为一个Java新手,你经常思考这个问题吗?今天就跟北大青鸟小编一起来好好的想想对策。首先,一定要明确,Java代码不是你想敲写,就可以敲写的出来的,一定是在掌握一定的Java理论知识之后,才可以开启的,所以想要敲好Java代码,一定要重视Java理论知识的学习。

想必很多朋友都知道,Java新手要敲好Java代码,除了苦练,没有什么更加的技巧。但是苦练也是有技巧的,比如你已经熟练的一类Java代码,你再继续敲也很难有大的突破,但是你不熟练的Java代码,则会成为你的软肋,所以敲Java代码一定是得有方法的,而不是胡乱的敲写,没有任何想法的练习。

对于Java新手来说,代码不敲不行,当代码敲到一定的境界之后,很多Java知识你自然而然的就懂了,所以每天的学习时间一定要多敲代码,但是Java理论知识也不要落下。所以,对于Java新手来说,南邵IT培训认为要敲好Java代码,的确不是一件容易的事情。

高手帮忙解释一下JAVA 贪食蛇游戏中蛇的代码

public
class
Snake
implements
Data//蛇类实现了data接口
{
public
Snake()
{
array.add(new
Point(10,
10));//
array.add(new
Point(10,
11));//
array.add(new
Point(10,
12));//
array.add(new
Point(10,
13));//
array.add(new
Point(10,
14));//这五句话是构造一个蛇,这条蛇由五个坐标点连成
currentFlag
=UPFLAG
;//当前的运动方向设为向上
lifeFlag
=
true;//当前蛇的生命设为活着
}
public
void
move()//蛇的运动函数
{
tair
=
(Point)array.get(array.size()
-
1);//得到蛇的尾巴
int
len
=
array.size()
-
2;
for(int
i
=
len;
i
》=
0;
i--)//这个for循环把蛇的每一个点都坐标偏移即运动了
{
Point
leftPoint
=
(Point)array.get(i);
Point
rightPoint
=
(Point)array.get(i
+
1);
rightPoint.x
=
leftPoint.x;
rightPoint.y
=
leftPoint.y;//每一个右边的点等于其左边的点,像蛇那样的一缩一张的运动
}
}
public
void
moveHeadLeft()//把蛇的头部转向左边
{
if(currentFlag
==
RIGHTFLAG
||
currentFlag
==
LEFTFLAG)//如果运动方向设为向左或向右则不执行
{
return;
}
move();
Point
point
=
(Point)(array.get(0));
//得到蛇头部
point.x
=
point.x
-
1;//蛇头部横坐标减一,纵坐标不变
point.y
=
point.y;
if(point.x

LEFT)//如果蛇头部不能再左,就不执行
{
lifeFlag
=
false;
}
currentFlag
=
LEFTFLAG;//将蛇运动方向改为左
}

什么是Java代码的编译与反编译

Java代码的编译与反编译

2017-02-21Hollis数盟

一、什么是编译

1、利用编译程序从源语言编写的源程序产生目标程序的过程。

2、用编译程序产生目标程序的动作。编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。

二、什么是反编译

计算机软件反向工程(Reverseengineering)也称为计算机软件还原工程,是指通过对他人软件的目标程序(可执行程序)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,某些特定情况下可能推导出源代码。反编译作为自己开发软件时的参考,或者直接用于自己的软件产品中。

三、Java类的编译与反编译

我们在最初学习Java的时候,会接触到两个命令:javac和java,那个时候我们就知道,javac是用来编译Java类的,就是将我们写好的helloworld.java文件编译成helloworld.class文件。

class文件打破了C或者C++等语言所遵循的传统,使用这些传统语言写的程序通常首先被编译,然后被连接成单独的、专门支持特定硬件平台和操作系统的二进制文件。通常情况下,一个平台上的二进制可执行文件不能在其他平台上工作。而Javaclass文件是可以运行在任何支持Java虚拟机的硬件平台和操作系统上的二进制文件。

那么反编译呢,就是通过helloworld.class文件得到java文件(或者说是程序员能看懂的Java文件)

四、什么时候会用到反编译

1、我们只有一个类的class文件,但是我们又看不懂Java的class文件,那么我们可以把它反编译成我们可以看得懂的文件。

2、学习Java过程中,JDK的每个版本都会加入越来越多的语法糖,有些时候我们想知道Java一些实现细节,我们可以借助反编译。

五、反编译工具

1、javap

2、Jad:官网(墙裂推荐)

客户端:

可以在官网下载可执行文件,找到对应的操作系统的对应版本,然后进行安装使用。

因为我使用的是linux操作系统,所以我下载的是Linux版本的工具,这个工具下载好之后会有一个执行文件,只要在执行文件所在目录执行./jadhelloworld.class就会在当前目录下生成helloworld.jad文件,该文件里就是我们很熟悉的Java代码

Eclipse插件:

下载地址在官网下载插件的jar包,然后将jar包放到eclipse的plugins目录下‘在打开Eclipse,Eclipse-》Window-》Preferences-》Java,此时你会发现会比原来多了一个JadClipse的选项,单击,在Pathtodecompiler中输入你刚才放置jad.exe的位置,也可以制定临时文件的目录。当然在JadClipse下还有一些子选项,如Debug,Directives等,按照默认配置即可。基本配置完毕后,我们可以查看一下class文件的默认打开方式,Eclipse-》Window-》Preferences-》General-》Editors-》FileAssociations我们可以看到class文件的打开方式有两个,JadClipse和Eclipse自带的ClassFileViewer,而JadClipse是默认的。全部配置完成,下面我们可以查看源码了,选择需要查看的类,按F3即可查看源码

排序都有哪几种方法请列举用JAVA实现一个快速排序

【答案】:
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)
快速排序的伪代码。
/ /使用快速排序方法对a排序
从a中选择一个元素作为m i d d l e,该元素为支点
把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点
递归地使用快速排序方法对left 进行排序
递归地使用快速排序方法对right 进行排序
所得结果为l e f t + m i d d l e + r i g h t

求java快速排序的正确代码

一趟快速怕序的具体做法是:附设两个指针low和high,他们的初值分别为low和high,设枢轴记录的关键字为privotkey,则首先从high所指位置向前搜索找到第一个关键字小于pivotkey的记录和枢轴记录互相交换,然后从low所指向的位置起向后搜索,找到第一个关键字大于privotkey的记录和枢轴记录互相交换,重复这两步直至low==high位置.
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class 快速排序_1 {
public static void main(String args) throws InterruptedException {
int test = {15,23,56,7,13,52,20,7};
new 快速排序_1().qSort(test, 0, test.length-1);
for(int k:test) System.out.println(k);
}
public void qSort(int array,int low,int high){
if(low
int privot=partition(array,low,high);
qSort(array,low,privot-1);
qSort(array,privot+1,high);
}
}
public int partition(int array,int low,int high){
/**
* 选择 low位置 作为曲轴(支点)
*/
int pivot=array;
int temp=0;
/**
* 如果 low
*/
while(low
/**
* 先从 high端 开始判断
*/
while(low=pivot) high--;
/**
* 进行 置换操作
*/
if(low
array;
low++;
}
/**
* 从 low 端判断
*/
while(low
/**
* 进行 置换操作
*/
if(low
array;
high--;
}
}
array=pivot;
return low;
}
}

Java程序员编写代码的技巧

java程序员编写代码的技巧有哪些呢?Java程序员必须努力编写完美的代码,因此,为了编写干净的代码,必须知道如何编写才是真正的好方法,下面北京昌平java软件开发为大家总结了一些帮助编写代码的小方法。

1、编写之前进行思考

首先花10分钟,20分钟甚至30分钟的时间来思考你需要什么,以及哪些设计模式适合你将要编码的内容。这个时候北京昌平IT培训认为你会很高兴你花费的这些时间,当你必须改变或添加一些代码时,你不会担心花费的几分钟,而是会花更多的时间去琢磨。

2、代码进行注释

没有什么比两个月后检查你的代码并不记得它被用来做什么更糟的了。重要的都注释一下,如果是自己非常了解的内容,昌平北大青鸟建议这些可以选择不进行注释。

3、不要复制粘贴代码

最后自己手写代码,复制粘贴代码会出现代码块重复的情况,并且不利于代码的解读。

4、学会测试代码

测试、测试、测试你的代码。不要等到你完成了程序才测试它,否则当你发现一个巨大的错误时,你会后悔之前的决定。因为昌平计算机培训学校发现如果你没有进行每段代码测试,最后出现问题是很难找到的。

Java代码的优化方法有哪些

说到代码优化,每个人或多或少都掌握一到两种方法,但是这样的方法对提升代码运行效率效果不大,最重要是对代码的重视和了解,这样才能提升代码的运行效率。在进行代码优化的过程中,方法是非常重要的,多掌握几种方法,根据代码的不同情况选择适合的方法进行优化。下面电脑培训为大家介绍Java代码优化的几种方法。

1、使用指定类、方法的final修饰符

具有final修饰符的类不可派生。在Java核心API中,有许多最终应用程序的例子,例如java.lang.String,整个类都是final。为类指定final修饰符允许继承类,并且为方法指定final修饰符允许覆盖该方法。如果将类指定为final,IT培训认为该类的所有方法都是final。Java编译器将寻找内联所有最终方法的机会。内联对于提高Java操作的效率非常重要。这可以将性能平均提高50%。

2、重用对象

String对象的使用是非常重要的,StringBuilder/StringBuffer并不是字符串连接。由于Java虚拟机需要时间来生成对象,所以将来垃圾收集和处理这些对象可能需要一些时间。因此,生成太多对象将对程序的性能产生很大影响。

3、使用局部变量

调用方法时传递的参数以及在调用中创建的临时变量都保存在堆栈中,速度更快。其他变量(如静态变量和实例变量)在堆中创建并且速度较慢。此外,北京北大青鸟发现在堆栈中创建的变量,当方法完成运行时,内容消失,不需要进行额外的垃圾收集。

4、及时关闭流

在Java编程过程中,在执行数据库连接和I/O流操作时要小心。使用后,北大青鸟昌平校区官网建议应及时关闭以释放资源。因为这些大型物体的操作会导致系统的大量开销,稍微粗心会导致严重的后果。

求贪吃蛇java程序代码(要能运行的,有完整注释的)

三个文件,楼主看好:
运行可以,但是并不能鼓吹是一个具有好的风格的代码,。
//文件一
package greedysnake_cx;
public class Node {
int x=0;
int y=0;

int nodewidth;
int nodeheight;

Node(int x,int y){
this.x=x;
this.y=y;
}
}
//文件二
package greedysnake_cx;
/**
* 实现一个greedysnake的模型,具有功能:
* 1)移动,moveOn()----从director参数中获取方向信息,如果方向定义的下一个点的逻辑值是true,检查是不是food,是则将food添加到
* 列表的头部,snake继续移动,不是则停止移动(撞到蛇尾巴了)
* 2)加速,speedUp()----将现成的停滞时间间隔interval按照一定的比率 speedRate进行扩大
* 3)减速,speedDown()----....
*
* 该类实现Runnable接口,
* */
//定义snake的模型
import java.util.*;
import javax.swing.*;
public class SnakeModel implements Runnable {

private GreedSnake gs;

//给每一个矩阵点确立一个boolean值
boolean matrix;
private int maxX;
private int maxY;
//设置一个节点的列表;
LinkedList nodeArray = new LinkedList();

Node food=null;
int direction=UP;

int score=0;

//定义方向
public final static int LEFT=1;
public final static int UP=2;
public final static int RIGHT=3;
public final static int DOWN=4;

private int interval=200; //停顿时间的间隔

boolean pause=false; //定义暂停

private double speedRate=0.5; //定义速度的变更幅度
//constructor
public SnakeModel(GreedSnake gs,int maxx,int maxy){
this.gs=gs;
this.maxX=maxx;
this.maxY=maxy;
//this.matrix=null;
////////////////////////////////////////////////////////////////////
//init matrix;
matrix=new boolean; //***********************不初始化是不行滴
for(int i=0;i《maxX;i++){
matrix;//将矩阵的每一行定义成列的集合
Arrays.fill(matrix数组里面的元素全部定义成false
//至此,矩阵里面所有的点的boolean值都是flase
//for(int j=0;j《maxY;j++){
//matrix=false;
//}
}
////////////////////////////////////////////////////////////////////
//init nodeArray
int initlength=10;
for(int i=0;i《initlength;i++){
//确保snake出现在屏幕的中央 assure that the greedy snake appears in the center of the model
//snake的长度由maxX来确定
int x=maxX/2+i;
int y=maxY/2;
nodeArray.addFirst(new Node(x,y));
matrix=true;
}
//////////////////////////////////////////////////////////////////////
//创建食物
food=createFood();
System.out.println("some test!");
matrix=true;
}//end constructor

//snake动起
public boolean moveOn(){
Node head=(Node)nodeArray.getFirst();
int x=head.x;
int y=head.y;

switch(direction){
case LEFT:
x--;break;
case UP:
y--;break;
case RIGHT:
x++;break;
case DOWN:
y++;break;
default:
}
if((x 》= 0 && x 《 maxX) && (y 》= 0 && y 《 maxY)){
if(matrix){//当蛇头转至一个bool值为true的点时
if(x==food.x&&y==food.y){//该点是食物
nodeArray.addFirst(food);
//吃掉补上
food=createFood();
matrix=true;
score+=10;
return true;
}
else //该点不是食物,(蛇尾巴)
return false;
}
else{
nodeArray.addFirst(new Node(x,y));
matrix=true;
Node nn=(Node)nodeArray.removeLast();//移除并且返回列表中的最后一个元素
matrix=false;
return true;
}
}
return false;
}//end moveOn
public void run() {
boolean running=true;

while(running){
try{
Thread.sleep(interval);
}
catch(InterruptedException e){
e.printStackTrace();
}
if(!pause){
if(moveOn()){
gs.repaint();
}
else{
JOptionPane.showMessageDialog(null, "sorry myboy,GAME OVER!", "message", JOptionPane.INFORMATION_MESSAGE);
running=false;
}
}
}
/*boolean running=true;
while(running){
try{
Thread.sleep(interval);
}
catch (InterruptedException e){
e.printStackTrace();
}
if(!pause){
if(moveOn()){
gs.repaint();
}
else{
JOptionPane.showMessageDialog(null,"i am sorry ,you failed!","message",JOptionPane.INFORMATION_MESSAGE);
break;
}
}
}//end while
running=false;//当且仅当失败退出的时候;
*/
}
//获取当前游戏得分
public int getScore(){
return this.score;
}

//加速
public void speedUp(){
interval*=speedRate;
}
//减速
public void speedDown(){
interval/=speedRate;
}
//设置暂停
public void chagePause(){
pause=!pause;
}
//设置方向
public void chageDirection(int newdirection){
if(direction % 2 != newdirection % 2){
direction=newdirection;
}
}
//生成食物
private Node createFood() {
/*
* 创建一个随机数的生成器,这个是java.util.Random类
* 与java.lang.Math类中的random()方法有不一样的地方,彼方法返回一个0-1之间的随机数
* */
Random random=new Random();
int foodx=random.nextInt(maxX);
int foody=random.nextInt(maxY);
Node food=new Node(foodx,foody);
return food;
}
}
//文件三
package greedysnake_cx;
/**
* 在repaint()方法中,绘画上下文对象是从canvas对象使用getContentPane()获取的!!
* */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class GreedSnake implements KeyListener{

Canvas canvas;
private JLabel jlabel;
private JPanel jpanel;
private JFrame jframe;

SnakeModel snakemodel;

private final static int canvaswidth=400;
private final static int canvasheight=300;
private final static int nodewidth=10;
private final static int nodeheight=10;
//construction
GreedSnake(){

jframe=new JFrame("The Greed Sanke!");
jframe.setLayout(new BorderLayout());
Container cp=jframe.getContentPane();
//在jframe面板中添加各种组件
jlabel=new JLabel("welcome");
jlabel.setText("Welcome my friend! Enjoy your self!");

cp.add(jlabel,BorderLayout.NORTH);

canvas=new Canvas();
canvas.setSize(canvaswidth,canvasheight);
canvas.addKeyListener(this); //给空白面板添加键盘时间监听器!
cp.add(canvas,BorderLayout.CENTER);

jpanel=new JPanel();
jpanel.setLayout(new BorderLayout());
JLabel label=new JLabel("Pass enter or ’r’ or ’s’ to start",JLabel.CENTER);
jpanel.add(label,BorderLayout.NORTH);
JLabel label2=new JLabel("Pass space to pause this game!",JLabel.CENTER);
jpanel.add(label2,BorderLayout.CENTER);
JLabel label3=new JLabel("Pass pageUp or pageDown to up or down the speed of the snake!",JLabel.CENTER);
jpanel.add(label3,BorderLayout.SOUTH);
cp.add(jpanel,BorderLayout.SOUTH);

//给顶层容器设置时间监听、可视化、关闭按钮的设定
jframe.addKeyListener(this);
jframe.pack();
jframe.setVisible(true);
jframe.setResizable(false);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

begin();

}//end construction
public void begin(){
//开启一个SnakeModel的进程,并且开始改进程
snakemodel=new SnakeModel(this,canvaswidth/nodewidth,canvasheight/nodeheight);
(new Thread(snakemodel)).start();
}

void repaint(){
int score=snakemodel.getScore();
jlabel.setText("您的得分是:"+score);
Graphics g=canvas.getGraphics();///pay attention!
g.setColor(Color.white);
g.fillRect(0, 0, canvaswidth, canvasheight);

g.setColor(Color.blue);
LinkedList list=snakemodel.nodeArray;
for(int i=0;i《list.size();i++){
Node nn=(Node)list.get(i);
paintingNode(g,nn);
}
//绘制food
g.setColor(Color.green);
Node foodnode=new Node(snakemodel.food.x,snakemodel.food.y);
paintingNode(g,foodnode);
}
public void paintingNode(Graphics gg,Node n){
/*
* 使用Graphics 的fillRect方法,填充一个矩形,
* 矩形的起点需要乘以一个NODE的长宽,以避免重叠
* */
gg.fillRect(n.x*nodewidth, n.y*nodeheight,nodewidth-1,nodeheight-1);
}
public void keyPressed(KeyEvent e) {//按下某一个键时,调用此方法
int keycode=e.getKeyCode();
/* if(keycode==KeyEvent.VK_ENTER||keycode==KeyEvent.VK_R){
begin();
}*/

switch(keycode){
case KeyEvent.VK_LEFT:
snakemodel.chageDirection(SnakeModel.LEFT);
break;
case KeyEvent.VK_UP:
snakemodel.chageDirection(SnakeModel.UP);
break;
case KeyEvent.VK_RIGHT:
snakemodel.chageDirection(SnakeModel.RIGHT);
break;
case KeyEvent.VK_DOWN:
snakemodel.chageDirection(SnakeModel.DOWN);
break;
case KeyEvent.VK_PAGE_DOWN:
snakemodel.speedDown();
break;
case KeyEvent.VK_PAGE_UP:
snakemodel.speedUp();
break;
case KeyEvent.VK_ENTER:
case KeyEvent.VK_R:
begin();
break;
case KeyEvent.VK_SPACE:
case KeyEvent.VK_P:
snakemodel.chagePause();
default:
}//end switch
}//end keyPressed
public void keyReleased(KeyEvent e) {//释放某一个键时,调用此方法
}
public void keyTyped(KeyEvent e) {//键入某一个键时,调用此方法!
}
//main
public static void main(String args){
GreedSnake gs=new GreedSnake();
}
}

JAVA中有哪几种常用的排序方法

最主要的是冒泡排序、选择排序、插入排序以及快速排序
1、冒泡排序


冒泡排序是一个比较简单的排序方法。在待排序的数列基本有序的情况下排序速度较快。若要排序的数有n个,则需要n-1轮排序,第j轮排序中,从第一个数开始,相邻两数比较,若不符合所要求的顺序,则交换两者的位置;直到第n+1-j个数为止,第一个数与第二个数比较,第二个数与第三个数比较,......,第n-j个与第n+1-j个比较,共比较n-1次。此时第n+1-j个位置上的数已经按要求排好,所以不参加以后的比较和交换操作。

例如:第一轮排序:第一个数与第二个数进行比较,若不符合要求的顺序,则交换两者的位置,否则继续进行二个数与第三个数比较......。直到完成第n-1个数与第n个数的比较。此时第n个位置上的数已经按要求排好,它不参与以后的比较和交换操作;第二轮排序:第一个数与第二个数进行比较,......直到完成第n-2个数与第n-1个数的比较;......第n-1轮排序:第一个数与第二个数进行比较,若符合所要求的顺序,则结束冒泡法排序;若不符合要求的顺序,则交换两者的位置,然后结束冒泡法排序。


共n-1轮排序处理,第j轮进行n-j次比较和至多n-j次交换。


从以上排序过程可以看出,较大的数像气泡一样向上冒,而较小的数往下沉,故称冒泡法。


public void bubbleSort(int a)


{


int n = a.length;


for(int i=0;i《n-1;i++)


{


for(int j=0;j《n-i-1;j++)


{


if(a)


{


int temp = a;


a;


a = temp;


}


}


}


}


2、选择排序


选择法的原理是先将第一个数与后面的每一个数依次比较,不断将将小的赋给第一个数,从而找出最小的,然后第二个数与后面的每一个数依次比较,从而找出第二小的,然后第三个数与后面的每一个数依次比较,从而找出第三小的.....直到找到最后一个数。


public void sort(int x)


{


int n=x.length;


int k,t;


for(int i=0;i《n-1;i++)


{


k=i;


for(int j=i+1;j=n;j++)


{


if(x)k=j;


if(k!=i)


{


t=x;


x;


x=t;


}


}


}


}
3、插入排序


插入排序的原理是对数组中的第i个元素,认为它前面的i-1个已经排序好,然后将它插入到前面的i-1个元素中。插入排序对少量元素的排序较为有效.


public void sort(int obj)


{


for(int j=1;j《obj.length;j++)


{


int key=obj;


int i=j-1;


while(i》=0&&obj》key)


{


obj;


i--;


}


obj=key;


}


}


4、快速排序


快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此大道整个数据变成有序序列。


public void quickSort(int obj,int low,int high)


{


int i=low;


int j=high;


int keyValue=obj;


while(i《j)


{


int temp=0;


while(i《j&&obj》=keyValue)


{


j=j-1;


}


temp=obj;


obj;


obj=temp;


while(i《j&&obj《=keyValue)


{


i=i+1;


}


temp=obj;


obj;


obj=temp;


}


obj=keyValue;


if(low《i-1)


{


quickSort(obj,low,i-1);


}


if(high》i+1)


{


quickSort(obj,i+1,high);


}


}

用JAVA设计游戏:贪吃蛇游戏

用MVC方式实现的贪吃蛇游戏,共有4个类。运行GreedSnake运行即可。主要是观察者模式的使用,我已经添加了很多注释了。
1、
/*
* 程序名称:贪食蛇
* 原作者:BigF
* 修改者:algo
* 说明:我以前也用C写过这个程序,现在看到BigF用Java写的这个,发现虽然作者自称是Java的初学者,
* 但是明显编写程序的素养不错,程序结构写得很清晰,有些细微得地方也写得很简洁,一时兴起之
* 下,我认真解读了这个程序,发现数据和表现分开得很好,而我近日正在学习MVC设计模式,
* 因此尝试把程序得结构改了一下,用MVC模式来实现,对源程序得改动不多。
* 我同时也为程序增加了一些自己理解得注释,希望对大家阅读有帮助。
*/
package mvcTest;
/**
* @author WangYu
* @version 1.0
* Description:
* 《/pre》
* Create on :Date :2005-6-13 Time:15:57:16
* LastModified:
* History:
*/
public class GreedSnake {
public static void main(String args) {
SnakeModel model = new SnakeModel(20,30);
SnakeControl control = new SnakeControl(model);
SnakeView view = new SnakeView(model,control);
//添加一个观察者,让view成为model的观察者
model.addObserver(view);

(new Thread(model)).start();
}
}
-------------------------------------------------------------
2、
package mvcTest;
//SnakeControl.java
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
/**
* MVC中的Controler,负责接收用户的操作,并把用户操作通知Model
*/
public class SnakeControl implements KeyListener{
SnakeModel model;
public SnakeControl(SnakeModel model){
this.model = model;
}
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (model.running){ // 运行状态下,处理的按键
switch (keyCode) {
case KeyEvent.VK_UP:
model.changeDirection(SnakeModel.UP);
break;
case KeyEvent.VK_DOWN:
model.changeDirection(SnakeModel.DOWN);
break;
case KeyEvent.VK_LEFT:
model.changeDirection(SnakeModel.LEFT);
break;
case KeyEvent.VK_RIGHT:
model.changeDirection(SnakeModel.RIGHT);
break;
case KeyEvent.VK_ADD:
case KeyEvent.VK_PAGE_UP:
model.speedUp();
break;
case KeyEvent.VK_SUBTRACT:
case KeyEvent.VK_PAGE_DOWN:
model.speedDown();
break;
case KeyEvent.VK_SPACE:
case KeyEvent.VK_P:
model.changePauseState();
break;
default:
}
}
// 任何情况下处理的按键,按键导致重新启动游戏
if (keyCode == KeyEvent.VK_R ||
keyCode == KeyEvent.VK_S ||
keyCode == KeyEvent.VK_ENTER) {
model.reset();
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
}
-------------------------------------------------------------
3、
/*
*
*/
package mvcTest;
/**
* 游戏的Model类,负责所有游戏相关数据及运行
* @author WangYu
* @version 1.0
* Description:
* 《/pre》
* Create on :Date :2005-6-13 Time:15:58:33
* LastModified:
* History:
*/
//SnakeModel.java
import javax.swing.*;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Observable;
import java.util.Random;
/**
* 游戏的Model类,负责所有游戏相关数据及运行
*/
class SnakeModel extends Observable implements Runnable {
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( int maxX, int maxY) {
this.maxX = maxX;
this.maxY = maxY;
reset();
}
public void reset(){
direction = SnakeModel.UP; // 蛇运行的方向
timeInterval = 200; // 时间间隔,毫秒
paused = false; // 暂停标志
score = 0; // 得分
countMove = 0; // 吃到食物前移动的次数
// initial matirx, 全部清0
matrix = new boolean;
for (int i = 0; i 《 maxX; ++i) {
matrix;
Arrays.fill(matrix, false);
}
// initial the snake
// 初始化蛇体,如果横向位置超过20个,长度为10,否则为横向位置的一半
int initArrayLength = maxX 》 20 ? 10 : maxX / 2;
nodeArray.clear();
for (int i = 0; i 《 initArrayLength; ++i) {
int x = maxX / 2 + i;//maxX被初始化为20
int y = maxY / 2; //maxY被初始化为30
//nodeArray
//默认的运行方向向上,所以游戏一开始nodeArray就变为:
//
nodeArray.addLast(new Node(x, y));
matrix = true;
}
// 创建食物
food = createFood();
matrix = true;
}
public void changeDirection(int newDirection) {
// 改变的方向不能与原来方向同向或反向
if (direction % 2 != newDirection % 2) {
direction = newDirection;
}
}
/**
* 运行一次
* @return
*/
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) { // 如果新坐标的点上有东西(蛇体或者食物)
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 = true; // 设置食物所在位置
return true;
} else // 吃到蛇体自身,失败
return false;

} else { // 如果新坐标的点上没有东西(蛇体),移动蛇体
nodeArray.addFirst(new Node(x, y));
matrix = true;
n = (Node) nodeArray.removeLast();
matrix = false;
countMove++;
return true;
}
}
return false; // 触到边线,失败
}
public void run() {
running = true;
while (running) {
try {
Thread.sleep(timeInterval);
} catch (Exception e) {
break;
}
if (!paused) {
if (moveOn()) {
setChanged(); // Model通知View数据已经更新
notifyObservers();
} else {
JOptionPane.showMessageDialog(null,
"you failed",
"Game Over",
JOptionPane.INFORMATION_MESSAGE);
break;
}
}
}
running = false;
}
private Node createFood() {
int x = 0;
int y = 0;
// 随机获取一个有效区域内的与蛇体和食物不重叠的位置
do {
Random r = new Random();
x = r.nextInt(maxX);
y = r.nextInt(maxY);
} while (matrix);
return new Node(x, y);
}
public void speedUp() {
timeInterval *= speedChangeRate;
}
public void speedDown() {
timeInterval /= speedChangeRate;
}
public void changePauseState() {
paused = !paused;
}
public String toString() {
String result = "";
for (int i = 0; i 《 nodeArray.size(); ++i) {
Node n = (Node) nodeArray.get(i);
result += "";
}
return result;
}
}
class Node {
int x;
int y;
Node(int x, int y) {
this.x = x;
this.y = y;
}
}
------------------------------------------------------------
4、
package mvcTest;
//SnakeView.java
import javax.swing.*;
import java.awt.*;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Observable;
import java.util.Observer;
/**
* MVC模式中得Viewer,只负责对数据的显示,而不用理会游戏的控制逻辑
*/
public class SnakeView implements Observer {
SnakeControl control = null;
SnakeModel model = null;
JFrame mainFrame;
Canvas paintCanvas;
JLabel labelScore;
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 SnakeView(SnakeModel model, SnakeControl control) {
this.model = model;
this.control = control;
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(control);
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(control);
mainFrame.pack();
mainFrame.setResizable(false);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);
}
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 = model.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 = model.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: " + model.score;
labelScore.setText(s);
}
public void update(Observable o, Object arg) {
repaint();
}
}
-------------------------------------------------------------

关于本次代码java和新手要敲好Java代码有什么技巧的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

代码java(新手要敲好Java代码有什么技巧)

本文编辑:admin

更多文章:


phpinfo(如何创建和查看phpinfo,phpinfo空白问题解决方法)

phpinfo(如何创建和查看phpinfo,phpinfo空白问题解决方法)

本篇文章给大家谈谈phpinfo,以及如何创建和查看phpinfo,phpinfo空白问题解决方法对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本

2025年6月10日 05:30

scum单机(scm游戏怎样单机存档)

scum单机(scm游戏怎样单机存档)

这篇文章给大家聊聊关于scum单机,以及scm游戏怎样单机存档对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录scm游戏怎样单机存档单机方舟进化生存怎么弄上帝模式求一个能用的正版SCUM单机修改器,前期真的太难玩了SCUM高达

2026年7月11日 17:30

北京嵌入式培训班(七月份想去北京参加嵌入式培训,目前自己看了几个培训机构:千锋,凌阳,华清远见希望参加过培训的朋友)

北京嵌入式培训班(七月份想去北京参加嵌入式培训,目前自己看了几个培训机构:千锋,凌阳,华清远见希望参加过培训的朋友)

大家好,关于北京嵌入式培训班很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于七月份想去北京参加嵌入式培训,目前自己看了几个培训机构:千锋,凌阳,华清远见希望参加过培训的朋友的知识点,相信应该可以解决大家的一些困惑和问题,如果

2025年6月15日 20:30

sqrt函数用法 vba(excel表格中怎样用根号)

sqrt函数用法 vba(excel表格中怎样用根号)

今天给各位分享excel表格中怎样用根号的知识,其中也会对excel表格中怎样用根号进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录excel表格中怎样用根号Excel怎么使用平方根函数SQRTVB做简易计算器

2025年7月29日 19:30

php中级工程师厉害吗(如何理解php工程师)

php中级工程师厉害吗(如何理解php工程师)

大家好,如果您还对php中级工程师厉害吗不太了解,没有关系,今天就由本站为大家分享php中级工程师厉害吗的知识,包括如何理解php工程师的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录如何理解php工程师php工程

2026年7月27日 03:30

动画制作可以自学吗(自学动画制作可以吗)

动画制作可以自学吗(自学动画制作可以吗)

“动画制作可以自学吗”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看动画制作可以自学吗(自学动画制作可以吗)!本文目录自学动画制作可以吗如何自学动画制作动漫专业可以自学吗,难不难自学动漫设计与制作零基础怎么自学动画制作自学动

2025年5月30日 22:30

whoops的中文是什么(whoops正确读音是什么)

whoops的中文是什么(whoops正确读音是什么)

各位老铁们好,相信很多人对whoops的中文是什么都不是特别的了解,因此呢,今天就来为大家分享下关于whoops的中文是什么以及whoops正确读音是什么的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录whoop

2026年5月27日 00:00

学ug好还是solidworks好(solidworks与ug哪个更好学)

学ug好还是solidworks好(solidworks与ug哪个更好学)

本篇文章给大家谈谈学ug好还是solidworks好,以及solidworks与ug哪个更好学对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录solidworks与ug哪个更好学solidworks和ug哪个好用学习Solid

2026年4月23日 22:00

intellijidea如何升级(intellij idea 怎么让class自动更新到war)

intellijidea如何升级(intellij idea 怎么让class自动更新到war)

大家好,如果您还对intellijidea如何升级不太了解,没有关系,今天就由本站为大家分享intellijidea如何升级的知识,包括intellij idea 怎么让class自动更新到war的问题都会给大家分析到,还望可以解决大家的问

2026年3月23日 11:00

sweet英语是什么意思?switch不能作用在string上面

sweet英语是什么意思?switch不能作用在string上面

本篇文章给大家谈谈swit,以及sweet英语是什么意思对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录sweet英语是什么意思switch

2025年12月28日 17:00

数据库系统工具是什么(请问数据库系统软件有哪些,具体细节介绍一下)

数据库系统工具是什么(请问数据库系统软件有哪些,具体细节介绍一下)

这篇文章给大家聊聊关于数据库系统工具是什么,以及请问数据库系统软件有哪些,具体细节介绍一下对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录请问数据库系统软件有哪些,具体细节介绍一下数据库系统的软件主要包括什么数据库一般用什么软

2026年6月7日 14:45

编程语言与软件之间的关系(编程和软件到底是什么关系)

编程语言与软件之间的关系(编程和软件到底是什么关系)

大家好,如果您还对编程语言与软件之间的关系不太了解,没有关系,今天就由本站为大家分享编程语言与软件之间的关系的知识,包括编程和软件到底是什么关系的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录编程和软件到底是什么关

2026年1月15日 19:15

unity3d入门(unity3d该从何学起)

unity3d入门(unity3d该从何学起)

大家好,如果您还对unity3d入门不太了解,没有关系,今天就由本站为大家分享unity3d入门的知识,包括unity3d该从何学起的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录unity3d该从何学起Unity

2026年7月6日 14:00

protectedimage文件夹删除不了(文件夹删除不了怎么办)

protectedimage文件夹删除不了(文件夹删除不了怎么办)

本篇文章给大家谈谈protectedimage文件夹删除不了,以及文件夹删除不了怎么办对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录文件夹删除不了怎么办电脑文件夹怎么删除不了呢文件夹为什么删除不了桌面上image文件夹是个什

2026年5月12日 12:15

datagridview不可编辑(如何设置datagridview可编辑)

datagridview不可编辑(如何设置datagridview可编辑)

大家好,关于datagridview不可编辑很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于如何设置datagridview可编辑的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希

2026年7月27日 22:30

individual的所有格(名词是什么意思)

individual的所有格(名词是什么意思)

各位老铁们好,相信很多人对individual的所有格都不是特别的了解,因此呢,今天就来为大家分享下关于individual的所有格以及名词是什么意思的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录名词是什么意思

2026年5月15日 15:15

设计公司网站设计(专业企业网站设计如何进行)

设计公司网站设计(专业企业网站设计如何进行)

各位老铁们,大家好,今天由我来为大家分享设计公司网站设计,以及专业企业网站设计如何进行的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录专业企业网站设

2025年10月14日 09:45

powermill三轴主轴mtd文件(DXF文件直接转换为G代码,然后三轴雕刻机加工)

powermill三轴主轴mtd文件(DXF文件直接转换为G代码,然后三轴雕刻机加工)

大家好,关于powermill三轴主轴mtd文件很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于DXF文件直接转换为G代码,然后三轴雕刻机加工的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注

2026年7月5日 18:00

html文本区域怎么写(HTML文本区域区域带工具栏怎么做)

html文本区域怎么写(HTML文本区域区域带工具栏怎么做)

大家好,关于html文本区域怎么写很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于HTML文本区域区域带工具栏怎么做的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮

2026年2月6日 21:15

randomize在c语言(c语言怎样产生两个不同的随机数)

randomize在c语言(c语言怎样产生两个不同的随机数)

今天给各位分享c语言怎样产生两个不同的随机数的知识,其中也会对c语言怎样产生两个不同的随机数进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录c语言怎样产生两个不同的随机数C语言中的randomize()函数怎么

2025年11月8日 05:45

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索