java回顾之贪吃蛇代码review

2016/08/03 10:47
阅读数 112

JAVA可以算是我的程序之路的启蒙语言,虽然在学校课堂上真心没学过JAVA,之所以这么说其实课堂上学的除了我知道能叫得上名字的课名如C、C++之外,内容都已经还给老师了。


要说为什么要选择JAVA,那就是因为我买不起苹果。


其实还是安卓的开源吸引了我。到目前为止,目测这波不亏。



JAVA语言作为目前使用量最大的语言,毫无疑问未来前景依旧风光。


为什么这么说呢,当然一个很重要的原因是因为我学了。


其实主要是目前已有的大部分大型web项目都离不开JAVA的身影,当然还有我可爱的google安卓系统(虽然目前被迫只能使用JAVA的openapi),其实我感兴趣的还有物联网的应用部分。

这里我想说一下我学习JAVA的整个过程,这里只说基础部分,当然我也不是什么高手所以这篇文章针对的群体应该是初学者。


最开始我也会搜索各种学习方法,入了很多坑,但是幸好我最后选了个正确的学习视频。不得不说,好老师为什么叫好老师总是有原因的。链接如下:

斯坦福:编程方法学

好的老师会带动你的兴趣,差的老师可以磨灭你的兴趣,而兴趣决定你能否深入,高下立现。


这里我分享一个贪吃蛇的代码(初学时写的,当然也有参考),相信可以让大家对学习JAVA有更好的兴趣,并且懂代码的大家都可以交流。

运行结果图示:


首先是总frame类:

package tanchi;


import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;


public class Tanchishe extends Frame {
public final static int GAME_WIDTH = 400;
public final static int GAME_HEIGHT = 520;
Image offScreenImage = null;
She she = new She(160, 80, She.Direction.R, this);
ArrayList<Shiwu> shiwu = new ArrayList<Shiwu>();


public void paint(Graphics g) {
if (shiwu.size() <= 1) {
shiwu.add(new Shiwu());
}
she.draw(g);
for (int i = 0; i < 1; i++) {
shiwu.get(i).draw(g);
}
}


public void update(Graphics g) {
if (offScreenImage == null) {
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
}
Graphics Goffscreen = offScreenImage.getGraphics();
Color c = Goffscreen.getColor();
Goffscreen.setColor(Color.green);
Goffscreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
Goffscreen.setColor(c);
paint(Goffscreen);
g.drawImage(offScreenImage, 0, 0, null);
}


public void launchFrame() {
this.setLocation(200, 100);
this.setSize(GAME_WIDTH, GAME_HEIGHT);
this.setTitle("贪吃蛇");
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setBackground(Color.green);
this.addKeyListener(new KeyMonitor());
setVisible(true);
PaintThread it = new PaintThread();
Thread rd = new Thread(it);
rd.start();
if (shiwu.size() <= 1) {
shiwu.add(new Shiwu());
}
}


public static void main(String[] args) {
Tanchishe tw = new Tanchishe();
tw.launchFrame();
}


public class PaintThread implements Runnable {
public void run() {
while (true) {
repaint();
try {
Thread.sleep(380);
} catch (InterruptedException e) {
System.out.println("Wrong");
}
}
}
}


private class KeyMonitor extends KeyAdapter {
public void keyPressed(KeyEvent e) {
she.keyPressed(e);
}


public void keyReleased(KeyEvent e) {
she.keyReleased(e);
}
}
}

其次是蛇的类:

package tanchi;


import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;


public class She {
public final static int X_SPEED=20;
public final static int Y_SPEED=20;
public final static int TANK_W=20;
public final static int TANK_H=20;
public int x,y;
public boolean bU=false,bD=false,bR=false,bL=false;
int len=5;
int score=0;
enum Direction{
L,R,D,U
}
private Direction dir=Direction.R;
Tanchishe tcs;
int[][] wz=new int[len][2];
public She(int x,int y){
this.x=x;
this.y=y;
int m=x-20*len;
for(int i=0;i<len;i++){
wz[i][0]=m+20*i;
wz[i][1]=y;
}
}
public She(int x,int y,Direction dir,Tanchishe tcs){
this(x,y);
this.dir=dir;
this.tcs=tcs;
}
public void draw(Graphics g){
Color c=g.getColor();
for(int i=0;i<len;i++){
g.setColor(Color.blue);
g.fillRect(wz[i][0],wz[i][1],TANK_W,TANK_H);
g.setColor(Color.black);
g.drawRect(wz[i][0],wz[i][1],TANK_W,TANK_H);
}
    g.drawString("得分:"+score+"分",10,50);
g.setColor(c);
move();
}
public void keyPressed(KeyEvent e){
int key=e.getKeyCode(); 
switch(key){
case KeyEvent.VK_LEFT:
bL=true;break;
case KeyEvent.VK_RIGHT:
bR=true;break;
case KeyEvent.VK_UP:
bU=true;break;
case KeyEvent.VK_DOWN:
bD=true;break;
}
locateDirection();
}
public void keyReleased(KeyEvent e){
int key=e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL=false;break;
case KeyEvent.VK_RIGHT:
bR=false;break;
case KeyEvent.VK_UP:
bU=false;break;
case KeyEvent.VK_DOWN:
bD=false;break;
}
locateDirection();
}
void locateDirection(){
if(bL&&!bR&&!bU&&!bD){
dir=Direction.L;
}else if(!bL&&bR&&!bU&&!bD){
dir=Direction.R;
}else if(!bL&&!bR&&bU&&!bD){
dir=Direction.U;
}else if(!bL&&!bR&&!bU&&bD){
dir=Direction.D;
}
}
void move(){
if((tcs.shiwu.get(0).x)>=wz[len-1][0]&&(tcs.shiwu.get(0).x)<=(wz[len-1][0]+10)&&(tcs.shiwu.get(0).y)>=wz[len-1][1]&&(tcs.shiwu.get(0).y)<=(wz[len-1][1]+10)){
tcs.shiwu.remove(tcs.shiwu.get(0));
bianhua();
}
switch(dir){
case L:
if(wz[len-1][0]<=wz[len-2][0]){
for(int i=0;i<len-1;i++){
wz[i][0]=wz[i+1][0];
wz[i][1]=wz[i+1][1];
}
wz[len-1][0]-=X_SPEED;
if(wz[len-1][0]<0){
wz[len-1][0]=400;
bianjie();
}
}break;
case R:
if(wz[len-1][0]>=wz[len-2][0]){
for(int i=0;i<len-1;i++){
wz[i][0]=wz[i+1][0];
wz[i][1]=wz[i+1][1];
}
wz[len-1][0]+=X_SPEED;
if(wz[len-1][0]>400){
wz[len-1][0]=0;
bianjie();
}
}
break;
case D:
if(wz[len-1][1]>=wz[len-2][1]){
for(int i=0;i<len-1;i++){
wz[i][0]=wz[i+1][0];
wz[i][1]=wz[i+1][1];
}
wz[len-1][1]+=Y_SPEED;
if(wz[len-1][1]>520){
wz[len-1][1]=20;
bianjie();
}
}break;
case U:
if(wz[len-1][1]<=wz[len-2][1]){
for(int i=0;i<len-1;i++){
wz[i][0]=wz[i+1][0];
wz[i][1]=wz[i+1][1];
}
wz[len-1][1]-=Y_SPEED;
if(wz[len-1][1]<20){
wz[len-1][1]=520;
bianjie();
}
}break;
}
}
void bianhua(){
switch(dir){
case L:
jiachang();
wz[len-1][0]=wz[len-2][0]-20;
wz[len-1][1]=wz[len-2][1];
break;
case R:
jiachang();
wz[len-1][0]=wz[len-2][0]+20;
wz[len-1][1]=wz[len-2][1];
break;
case D:
jiachang();
wz[len-1][0]=wz[len-2][0];
wz[len-1][1]=wz[len-2][1]+20;
break;
case U:
jiachang();
wz[len-1][0]=wz[len-2][0];
wz[len-1][1]=wz[len-2][1]-20;
break;
}
}
void jiachang(){
len++;
score++;
int[][] wzc=new int[len-1][2];
for(int i=0;i<len-1;i++){
wzc[i][0]=wz[i][0];
   wzc[i][1]=wz[i][1];
}
wz=new int[len][2];
for(int i=0;i<len-1;i++){
wz[i][0]=wzc[i][0];
wz[i][1]=wzc[i][1];
}
}
void bianjie(){
for(int i=0;i<len-1;i++){
wz[i][0]=wz[i+1][0];
   wz[i][1]=wz[i+1][1];
}
}
}
最后还有食物类:


package tanchi;


import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;


public class Shiwu {
public final static int TANK_W=20;
public final static int TANK_H=20;
double x,y;
public Shiwu(){
Random ran=new Random();
x=ran.nextInt(10)*20;
y=ran.nextInt(10)*20+20;
}
public void draw(Graphics g){
Color c=g.getColor();
g.setColor(Color.red);
g.fillRect((int)x,(int)y,TANK_W,TANK_H);
g.setColor(c);
}
}
以上三个文件就是当时写的贪吃蛇的所有代码,写的很简单,还有汉语拼音的方法,没有自身的碰撞检测和边界的碰撞检测,但是这样才能真正实现一会走成一个“2”字,一会走成一个“B”字。



Talk is cheap show me the code!

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部