📄 greedysnake.java
字号:
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
class Snakenode{//蛇节点
int x;
int y;
Snakenode(int x,int y)
{
this.x=x;
this.y=y;
}
}
class key implements KeyListener{//【【【【【【【【【【【【【【【【接口】】】】】】】】】】】】】】】】】
public static final int right=1;//简单宏方向定义
public static final int left=3;
public static final int up=2;
public static final int down=4;
static int position=1;
static boolean gamestate=true; //控制蛇的动不动
public int getPosition()
{
return position;
}
public boolean getgame()
{
return gamestate;//true or false
}
public void keyPressed(KeyEvent e)
{
int k=e.getKeyCode();//int getKeyCode() 返回此 AWTKeyStroke 的数字键代码。
switch(k)
{
case KeyEvent.VK_UP:
case KeyEvent.VK_E:
if(position!=down) position=up;break;
case KeyEvent.VK_LEFT:
case KeyEvent.VK_S:
if(position!=right) position=left;break;
case KeyEvent.VK_DOWN:
case KeyEvent.VK_D:
if(position!=up) position=down;break;
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_F:
if(position!=left) position=right;break;
case KeyEvent.VK_ENTER:
gamestate=!gamestate;
}
}
public void keyReleased(KeyEvent e){}//本程序没用到
public void keyTyped(KeyEvent e){}//本程序没用到
}
public class CrazySnake //Main Class
{
static canvas can=new canvas();//创建一个画布对象
public static void main(String args[])
{
try
{
JFrame jFrame=new JFrame("疯狂贪吃蛇");//总容器 JFrame
JLabel lab=new JLabel
(
"<html>" +
"<body>" +
"<font size=4 Color=RED>方向键控制蛇的运动方向"+
"或e,s,d,f键控制运动方向,<br>在程序" +
"运行中按\"ENTER\"可控制暂停/运行状态<br>" +
"运动的步长为1,2,4,8</font></body>" +
"</html>"
);
control thread1=new control();
can.setBackground(Color.WHITE);
can.setSize(100,100);
jFrame.getContentPane().setLayout(new BorderLayout());;
jFrame.setSize(520,601);
jFrame.add(can,"Center");
jFrame.add(lab,"South");
jFrame.addKeyListener(new key());//
can.addKeyListener(new key());
jFrame.setResizable(false);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
jFrame.pack();
thread1.start();//线程开始
//【【【【【【i/o】】】】】】运用添加时间----------------------------------------------------------------
FileOutputStream fos=new FileOutputStream("c:\\TimeRecord.txt");
OutputStreamWriter osw=new OutputStreamWriter(fos);
BufferedWriter bw=new BufferedWriter(osw);
bw.write("上次使用时间:");
java.sql.Date date = new java.sql.Date(System.currentTimeMillis());
String dd =date.toString();
bw.write(dd);
bw.close();
//添加时间----------------------------------------------------------------------
} catch (Exception e) {
e.printStackTrace();// TODO Auto-generated catch block
}
}
}
class control extends Thread
{
LinkedList link=new LinkedList();
key position=new key();
canvas can=new canvas();
int nodex=0,nodey=0;
int foodx,foody;//食物
Snakenode snakenode1;
static int sumRet = 0;//进入的总次数标记,
public void run()//必须
{
link.addFirst(new Snakenode(nodex,nodey));
snakenode1 = create();
while(true){
can.draw(snakenode1,0);
try{
int [] sequeseSpeedArray = {1000,1000,1,1000,1,1,1,1000,1,1,1,1,1,1,1};//控制步长的。。。1,2,4,8 就是8421 便于记忆 !!
++sumRet;
int ret = sumRet%15;// sequeseSpeedArray中有十五个元素,十五个为周期循环
Thread.sleep(sequeseSpeedArray[ret]);
if(position.getgame() == true)
{
if(position.getPosition() == 1)//方向-right
{
nodex++;
}
else if(position.getPosition() == 2)//up
{
nodey--;
}
else if(position.getPosition() == 3)//left
{
nodex--;
}
else if(position.getPosition() == 4)//down
{
nodey++;
}
if(position.getgame()==true&&(nodey<0||nodey>=25||nodex<0||nodex>=25))
{
gameOver();
}
link.addFirst(new Snakenode(nodex,nodey));
if(snakenode1.x==nodex&&snakenode1.y==nodey)
{
snakenode1=create();
}
else
{
can.draw((Snakenode)link.getLast(), 2);
link.removeLast();
}
}
can.drawnode(link);
}
catch(InterruptedException e){}
catch(Exception e1)
{
System.out.print(e1+" ><有异常 ");
}
}
}
public void gameOver()
{
JOptionPane.showMessageDialog(null,"头撞歪了 >< ","警告",JOptionPane.INFORMATION_MESSAGE);
key.gamestate=false;
//key.position=1;//设置下次的初始位置
Iterator it=link.iterator();
while(it.hasNext())
{
Snakenode no1=(Snakenode)it.next();
(new canvas()).draw(no1,2);
}
link.clear();
nodex=0;nodey=0;
link.add(new Snakenode(0,0));
}
public static Snakenode create()//随机在画布中创建食物的方法
{
Random rand=new Random();
int x=rand.nextInt(25);
int y=rand.nextInt(25);
return new Snakenode(x,y);
}
}
class canvas extends Canvas{//窗体的组件之一
public void drawnode(LinkedList link)
{
Iterator it=link.iterator();
while(it.hasNext())
{
Snakenode tmpSnakeNode=(Snakenode)it.next();
draw(tmpSnakeNode,1);
}
}
public void draw(Snakenode node,int i){
Graphics g= CrazySnake.can.getGraphics();
if(i == 0)
{
g.setColor(Color.pink);
}
if(i == 1)
{
g.setColor(Color.green);
}
if(i == 2)
{
g.setColor(Color.white);//路线
}//还可添加其他颜色以备用if。。
g.fillRect(node.x*20+1, node.y*20+1, 18,18);//画出节点
}
public void paint(Graphics g)//画出线条
{
g.setColor(Color.black);
for(int i=0;i<=500;i=i+20)
{
g.drawLine(0,i,500,i);
g.drawLine(i,0,i,500);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -