写了一个最简单的欢迎拍砖 controlSnake.java package snake;import java.util.Timer; import java.util.TimerTask; public class controlSnake { Timer timer; public snakePanel spanel=null; public snakePath spath = new snakePath();
public void startSnake() { timer = new Timer(); timer.schedule(new runSnake(),0); } public void stopExtracting() {
} public controlSnake(snakePanel spanel){ this.spanel=spanel; } class runSnake extends TimerTask { public void run() { while(true){ int dir = spanel.direction; System.out.println("dir:"+dir); if(!spath.forward(dir)) { System.out.println("you lose!!"); break; } System.out.println("here"); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // //spanel.panel.invalidate(); spanel.panel.updateUI();
} timer.cancel(); //Terminate the timer thread } }}
snakePath.java package snake;import java.awt.Point; import java.util.LinkedList;public class snakePath { LinkedList<Point> snake = null; static int snakeSwimmed = 1; static int untouched = 2; static int fruit = 3; boolean hasfruit; //地图是800*400,每一个10*10,这些参数都写死在程序中了 int[][] data=new int[40][80]; public snakePath(){ for(int i=0;i<data.length;i++){ for(int j=0;j<data[i].length;j++){ data[i][j]=untouched; } } data[0][0]=snakeSwimmed; snake = new LinkedList<Point>(); snake.add(new Point(0,0));
generateFruit(); hasfruit = true; }
public void generateFruit(){ int xx,yy; while(true){ xx = (int)(Math.random()*80); yy = (int)(Math.random()*40); System.out.println(xx+" "+yy+" "+data[yy][xx]); if(data[yy][xx]==untouched) break; } data[yy][xx]=fruit; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub /* snakePath sna =new snakePath(); for(int i=0;i<10;i++) { sna.forward(); } */ } public boolean forward(int dir) { // TODO Auto-generated method stub Point tail = snake.getLast(); Point head = snake.getFirst(); Point newHead = newhead(head,dir); if(newHead.x<0||newHead.x>=80||newHead.y<0||newHead.y>=40) return false;//finish if(data[newHead.y][newHead.x]==fruit) { data[newHead.y][newHead.x]=snakeSwimmed; snake.addFirst(newHead); generateFruit(); hasfruit = true; } else{ System.out.println("no fruit"); data[tail.y][tail.x]=untouched; data[newHead.y][newHead.x]=snakeSwimmed; snake.removeLast(); snake.addFirst(newHead); }
return true; } private Point newhead(Point head, int dir) { // TODO Auto-generated method stub // 0:east // 1:south // 2:west // 3:north Point newPoint = null; switch(dir){ case 0: newPoint = new Point(head.x+1,head.y); break; case 1: newPoint = new Point(head.x,head.y+1); break; case 2: newPoint = new Point(head.x-1,head.y); break; case 3: newPoint = new Point(head.x,head.y-1); break; } return newPoint; }}
----------------------------------
估计差不多了 都6点了
我写了一个,严格按照mvc模式设计,数据部分的snake用Linkedlist比较简单有效
我觉得花时间写一个还是蛮有收获的,至少涉及到了一些线程,2d画图,键盘响应
等内容。不过公司考这种考试,我觉得对java初学者还是太难了。
controlSnake.java
package snake;import java.util.Timer;
import java.util.TimerTask;
public class controlSnake {
Timer timer;
public snakePanel spanel=null;
public snakePath spath = new snakePath();
public void startSnake()
{
timer = new Timer();
timer.schedule(new runSnake(),0);
}
public void stopExtracting()
{
}
public controlSnake(snakePanel spanel){
this.spanel=spanel;
}
class runSnake extends TimerTask {
public void run() {
while(true){
int dir = spanel.direction;
System.out.println("dir:"+dir);
if(!spath.forward(dir))
{
System.out.println("you lose!!");
break;
}
System.out.println("here");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//
//spanel.panel.invalidate();
spanel.panel.updateUI();
}
timer.cancel(); //Terminate the timer thread
}
}}
package snake;import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.JButton;
public class snakePanel extends JFrame {
public controlSnake controlsnake =null;
private static final long serialVersionUID = 1L;
public int direction;
//0:east
//1:south
//2:west
//3:north
private JPanel jContentPane = null; public snakeStage panel = null;
private JButton start = null;
private JButton go = null;
/**
* This method initializes start
*
* @return javax.swing.JButton
*/
private JButton getStart() {
if (start == null) {
start = new JButton();
start.setBounds(new Rectangle(16, 9, 122, 38));
start.setText("start");
start.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
//System.out.println("actionPerformed()"); // TODO Auto-generated Event stub actionPerformed()
//start.lostFocus(, arg1)
go.requestFocus(true);
controlsnake.startSnake();
}
});
}
return start;
} /**
* This method initializes go
*
* @return javax.swing.JButton
*/
private JButton getGo() {
if (go == null) {
go = new JButton();
go.setBounds(new Rectangle(155, 7, 117, 41));
go.setText("go");
go.addKeyListener(new java.awt.event.KeyListener() {
public void keyTyped(java.awt.event.KeyEvent e) {
System.out.println("keyTyped()"); // TODO Auto-generated Event stub keyTyped()
}
public void keyPressed(java.awt.event.KeyEvent e) {
System.out.println("keyPressed()");
if(e.getKeyChar()=='d')
direction = 0;
else if(e.getKeyChar()=='s')
direction =1;
else if(e.getKeyChar()=='a')
direction =2;
else if(e.getKeyChar()=='w')
direction =3;
}
public void keyReleased(java.awt.event.KeyEvent e) {
}
});
}
return go;
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable() {
public void run() {
snakePanel thisClass = new snakePanel();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setControlSnake(new controlSnake(thisClass));
thisClass.go.requestFocus();
thisClass.setVisible(true);
}
});
} /**
* This is the default constructor
*/
public snakePanel() {
super();
initialize();
}
public void setControlSnake(controlSnake con){
controlsnake = con;
panel.snakepath=controlsnake.spath;
direction = 0;
}
/**
* This method initializes this
*
* @return void
*/ private void initialize() {
this.setSize(978, 667);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
} /**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
panel = new snakeStage();
panel.setBounds(new Rectangle(14, 64, 800, 400));
panel.setText("");
jContentPane = new JPanel();
jContentPane.setLayout(null);
jContentPane.add(panel, null);
jContentPane.add(getStart(), null);
jContentPane.add(getGo(), null);
}
return jContentPane;
}} // @jve:decl-index=0:visual-constraint="10,10"
package snake;import java.awt.Point;
import java.util.LinkedList;public class snakePath {
LinkedList<Point> snake = null;
static int snakeSwimmed = 1;
static int untouched = 2;
static int fruit = 3;
boolean hasfruit;
//地图是800*400,每一个10*10,这些参数都写死在程序中了
int[][] data=new int[40][80];
public snakePath(){
for(int i=0;i<data.length;i++){
for(int j=0;j<data[i].length;j++){
data[i][j]=untouched;
}
}
data[0][0]=snakeSwimmed;
snake = new LinkedList<Point>();
snake.add(new Point(0,0));
generateFruit();
hasfruit = true;
}
public void generateFruit(){
int xx,yy;
while(true){
xx = (int)(Math.random()*80);
yy = (int)(Math.random()*40);
System.out.println(xx+" "+yy+" "+data[yy][xx]);
if(data[yy][xx]==untouched)
break;
}
data[yy][xx]=fruit;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
/* snakePath sna =new snakePath();
for(int i=0;i<10;i++)
{
sna.forward();
}
*/
}
public boolean forward(int dir) {
// TODO Auto-generated method stub
Point tail = snake.getLast();
Point head = snake.getFirst();
Point newHead = newhead(head,dir);
if(newHead.x<0||newHead.x>=80||newHead.y<0||newHead.y>=40)
return false;//finish
if(data[newHead.y][newHead.x]==fruit)
{
data[newHead.y][newHead.x]=snakeSwimmed;
snake.addFirst(newHead);
generateFruit();
hasfruit = true;
}
else{
System.out.println("no fruit");
data[tail.y][tail.x]=untouched;
data[newHead.y][newHead.x]=snakeSwimmed;
snake.removeLast();
snake.addFirst(newHead);
}
return true;
}
private Point newhead(Point head, int dir) {
// TODO Auto-generated method stub
// 0:east
// 1:south
// 2:west
// 3:north
Point newPoint = null;
switch(dir){
case 0:
newPoint = new Point(head.x+1,head.y);
break;
case 1:
newPoint = new Point(head.x,head.y+1);
break;
case 2:
newPoint = new Point(head.x-1,head.y);
break;
case 3:
newPoint = new Point(head.x,head.y-1);
break;
}
return newPoint;
}}