📄 snake.java
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Snake
{
public static void main(String[] args){
MainFrame mainframe=new MainFrame();
mainframe.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
class MainFrame extends JFrame implements ActionListener,KeyListener
{
JMenuBar menubar;
JMenu menu1, menu2;
JMenuItem menuitem1,menuitem2,menuitem3,menuitem4;
int ROWS=30,COLS=30;
int i=0,j=0;
JPanel[][] panel=new JPanel[ROWS][COLS];
final int UP=1,LEFT=2,DOWN=3,RIGHT=4;
SnakeBody snakebody;
SnakeThread snakethread;
private int speed = 60; //default speed
boolean END = false;
boolean pause = false;
boolean firstStart = true;
MainFrame(){
super("SNAKE");
setLayout(new GridLayout(ROWS,COLS));
menubar=new JMenuBar();
setJMenuBar(menubar);
menu1=new JMenu("MENU");
menuitem1=new JMenuItem("START");
menuitem2=new JMenuItem("EXIT");
menu1.add(menuitem1);
menu1.add(menuitem2);
menubar.add(menu1);
menu2=new JMenu("SET");
menuitem3=new JMenuItem("SLOW");
menuitem4=new JMenuItem("SPEED");
menu2.add(menuitem3);
menu2.add(menuitem4);
menubar.add(menu2);
menuitem1.addActionListener(this);
menuitem2.addActionListener(this);
menuitem3.addActionListener(this);
menuitem4.addActionListener(this);
for(i=0;i<ROWS;i++){
for(j=0;j<COLS;j++){
panel[i][j]=new JPanel();
panel[i][j].setBackground(Color.white);
add(panel[i][j]);
panel[i][j].addKeyListener(this);
}
}
addKeyListener(this);
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
javax.swing.SwingUtilities.updateComponentTreeUI(this);
}
catch(Exception ex){ }
pack();
setVisible(true);
setResizable(false);
}//end MainFrame constructor
public void setSpeed( int snakeSpeed ){
speed = snakeSpeed < 0 ? 60 : snakeSpeed ;
}//end method setSpeed
public int getSpeed(){
return speed;
}//end method getSpeed
public void actionPerformed(ActionEvent e){
if(e.getSource()==menuitem1){
if( firstStart == true ){
snakebody=new SnakeBody(); //class SnakeBody defined below
snakethread=new SnakeThread(); //class SnakeThread defined below
snakethread.start();
firstStart = false;
}
else
snakebody=new SnakeBody();
}//press "开始" menuitem
else if(e.getSource()==menuitem2){
System.exit(0);
}//press "退出" menuitem
else if(e.getSource()==menuitem3){
setSpeed(getSpeed()+30);
}//press "减速" menuitem
else if(e.getSource()==menuitem4){
setSpeed(getSpeed()-30);
}//press "加速" menuitem
}//end method actionPerformed
public void keyPressed(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_ESCAPE){
if(pause == false)
pause = true;
else
pause = false;
}//press Esc to pause
else if(e.getKeyCode() == KeyEvent.VK_RIGHT){
if(snakebody.direction!=LEFT)
snakebody.direction=RIGHT;
}
else if(e.getKeyCode() == KeyEvent.VK_LEFT){
if(snakebody.direction!=RIGHT)
snakebody.direction=LEFT;
}
else if(e.getKeyCode() == KeyEvent.VK_UP){
if(snakebody.direction!=DOWN)
snakebody.direction=UP;
}
else if(e.getKeyCode() == KeyEvent.VK_DOWN){
if(snakebody.direction!=UP)
snakebody.direction=DOWN;
}
}//end method keyPressed
public void keyTyped(KeyEvent e){ }
public void keyReleased(KeyEvent e){ }
class SnakeBody
{
private int length,direction=0;
private int[] rows,cols;
private int lastrow,lastcol;
private int x,y;
private int i;
private Container container = getContentPane();
SnakeBody(){
END=false;
length=3;
direction=UP;
rows=new int[ROWS*COLS];
cols=new int[ROWS*COLS];
for(i=0;i<length;i++){
rows[i]=ROWS/2+i;
cols[i]=COLS/2;
}
for(i=0;i<ROWS;i++){
for(j=0;j<COLS;j++)
panel[i][j].setBackground(Color.white);
}
for(i=0;i<length;i++)
panel[rows[i]][cols[i]].setBackground(Color.red);
x=(int)(Math.random()*ROWS);
y=(int)(Math.random()*COLS);
while(panel[x][y].getBackground().equals(Color.red)){
x=(int)(Math.random()*ROWS);
y=(int)(Math.random()*COLS);
}
panel[x][y].setBackground(Color.blue);
}//end SnakeBody constructor
public void move(){
lastrow=rows[length-1];
lastcol=cols[length-1];
panel[rows[length-1]][cols[length-1]].setBackground(Color.white);
for(i=length-1;i>0;i--){
rows[i]=rows[i-1];
cols[i]=cols[i-1];
}
for(i=1;i<length;i++)
panel[rows[i]][cols[i]].setBackground(Color.red);
if(direction==UP)
rows[0]-=1;
else if(direction==DOWN)
rows[0]+=1;
else if(direction==LEFT)
cols[0]-=1;
else if(direction==RIGHT)
cols[0]+=1;
if(rows[0]>=ROWS||rows[0]<0||cols[0]>=COLS||cols[0]<0){
END=true;
JOptionPane.showMessageDialog( container, "游戏结束,请重新开始!");
return;
}
if(panel[rows[0]][cols[0]].getBackground().equals(Color.red)){
END=true;
JOptionPane.showMessageDialog( container, "游戏结束,请重新开始!");
return;
}
if(panel[rows[0]][cols[0]].getBackground().equals(Color.blue)){
length++;
rows[length-1]=lastrow;
cols[length-1]=lastcol;
panel[rows[length-1]][cols[length-1]].setBackground(Color.red);
x=(int)(Math.random()*ROWS);
y=(int)(Math.random()*COLS);
while(panel[x][y].getBackground().equals(Color.red)){
x=(int)(Math.random()*ROWS);
y=(int)(Math.random()*COLS);
}
panel[x][y].setBackground(Color.blue);
}//end if equal blue
panel[rows[0]][cols[0]].setBackground(Color.red);
}//end method move
}//end class SnakeBody
class SnakeThread extends Thread{
public void run(){
while(true) {
try{
Thread.sleep(getSpeed());
if(pause == true || END)
snakethread.interrupt();
else
snakebody.move();
}
catch(InterruptedException ie){}
}//end while loop
}
}//end class SnakeThread
}//end class MainFrame
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -