📄 greedsnake.java
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import sun.audio.*;
import java.io.*;
public class GreedSnake extends WindowAdapter implements KeyListener,ActionListener{
MenuBar mb1;
Menu mf1,me1,mh1,md1;
Menu my1,my2,my3,my4;
Menu mo1;
CheckboxMenuItem cbmi1;
Dialog d;
JFrame mainFrame;
JPanel centerpanel,northpanel;
Canvas paintCanvas1,paintCanvas2;
//TextArea text;
Label dia;
JLabel labelScore,labelScore2;//计分牌
SnakeModel snakeModel=null;// 蛇
SnakeModel2 snakeModel2=null;// 蛇
public static final int canvasWidth=300;
public static final int canvasHeight=400;
public static final int nodeWidth=10;
public static final int nodeHeight=10;
public GreedSnake()
{
//设置界面元素
mainFrame=new JFrame("GreedSnake");
mainFrame.setBackground(Color.lightGray);
centerpanel=new JPanel();
northpanel=new JPanel();
Container cp=mainFrame.getContentPane();
labelScore=new JLabel("Score:");
labelScore2=new JLabel("Score:");
cp.add(centerpanel,BorderLayout.CENTER);
northpanel.setLayout(new GridLayout(1,2,0,10));
cp.add(northpanel,BorderLayout.NORTH);
northpanel.add(labelScore);
northpanel.add(labelScore2);
paintCanvas1=new Canvas();
paintCanvas2=new Canvas();
paintCanvas1.setBackground(Color.WHITE);
paintCanvas2.setBackground(Color.WHITE);
paintCanvas1.setSize(canvasWidth+1,canvasHeight+1);
paintCanvas1.addKeyListener(this);
paintCanvas2.setSize(canvasWidth+1,canvasHeight+1);
paintCanvas2.addKeyListener(this);
centerpanel.setLayout(new GridLayout(1,2,10,0));
centerpanel.add(paintCanvas1);
centerpanel.add(paintCanvas2);
JPanel panelButtom=new JPanel();
panelButtom.setLayout(new BorderLayout());
JLabel labelHelp;// 帮助信息
labelHelp=new JLabel("PageUp, PageDown 增加(减少)速度;",JLabel.CENTER);
panelButtom.add(labelHelp,BorderLayout.NORTH);
labelHelp=new JLabel("ENTER or R or S 开始;",JLabel.CENTER);
panelButtom.add(labelHelp,BorderLayout.CENTER);
labelHelp=new JLabel("SPACE or P 停止",JLabel.CENTER);
panelButtom.add(labelHelp,BorderLayout.SOUTH);
//cp.add(panelButtom,BorderLayout.SOUTH);
d=new Dialog(mainFrame,"HELP",true);
d.add(panelButtom);
d.setSize(250,250);
d.setLocation(300,300);
d.addWindowListener(this);
showMenu();
mainFrame.addKeyListener(this);
mainFrame.pack();
mainFrame.setResizable(false);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);
begin();
}
//添加菜单
public void showMenu()
{
mb1=new MenuBar();
mainFrame.setMenuBar(mb1);
Font font1=new Font("",Font.ITALIC,14);
Font font2=new Font("",Font.ITALIC+Font.BOLD,14);
Font font3=new Font("",Font.ITALIC+Font.BOLD,14);
mo1=new Menu("选项");
my1=new Menu("背景音乐");
my1.add(new MenuItem("静音模式"));
my1.addSeparator();
my2=new Menu("播放乐曲");
my3=new Menu("选择速度");
mo1.setFont(font1);
//mo1.setForeground(Color.blue);
my1.setFont(font2);
//me1.setForeground(Color.blue);
my3.setFont(font3);
mb1.add(mo1);
mb1.add(my1);
mb1.add(my3);
my1.add(my2);
mo1.add(new MenuItem("开始"));
mo1.addSeparator();
mo1.add(new MenuItem("暂停"));
mo1.addSeparator();
mo1.add(new MenuItem("退出"));
mo1.addSeparator();
mo1.add(new MenuItem("帮助"));
my2.add(new MenuItem("风雨无阻"));
my3.add(new MenuItem("加速"));
my3.addSeparator();
my3.add(new MenuItem("减速"));
mo1.addActionListener(this);
my1.addActionListener(this);
my2.addActionListener(this);
my3.addActionListener(this);
}
boolean flag1,flag2;
public void paly()throws Exception{
InputStream in1=new FileInputStream("风雨无阻.mid");
AudioStream as1 = new AudioStream (in1);
if(flag1){
AudioPlayer.player.stop(as1);
in1.close();
flag1=false;
}
if(flag2)
{
AudioPlayer.player.start(as1);
flag2=false;
}
}
//添加菜单事件
public void actionPerformed (ActionEvent e)
{try{
if(e.getActionCommand()=="退出")
System.exit(0);
if(e.getActionCommand()=="帮助")
d.setVisible(true);
if(e.getActionCommand()=="开始")
{
snakeModel.running=false;
snakeModel2.running=false;
begin();
}
if(e.getActionCommand()=="暂停")
{
snakeModel.changePauseState();
snakeModel2.changePauseState();
}
if(e.getActionCommand()=="静音模式")
{
flag1=true;
paly();
}
if(e.getActionCommand()=="风雨无阻"){
flag2=true;
paly();
}
if(e.getActionCommand()=="加速")
{ if(snakeModel.running)
snakeModel.speedUp();
if(snakeModel2.running)
snakeModel2.speedUp();
}
if(e.getActionCommand()=="减速"){
if(snakeModel.running)
snakeModel.speedDown();
if(snakeModel2.running)
snakeModel2.speedDown();
}
}catch(Exception f){}
}
//添加帮助菜单事件
public void windowClosing(WindowEvent e)
{
if(e.getSource()==d)
d.setVisible(false);
else
System.exit(0);
}
//----------------------------------------------------------------------
//keyPressed():按键检测
//----------------------------------------------------------------------
public void keyPressed(KeyEvent e)
{
int keyCode=e.getKeyCode();
if(snakeModel.running) switch(keyCode)
{
case KeyEvent.VK_UP:
snakeModel.changeDirection(SnakeModel.UP);
break;
case KeyEvent.VK_DOWN:
snakeModel.changeDirection(SnakeModel.DOWN);
break;
case KeyEvent.VK_LEFT:
snakeModel.changeDirection(SnakeModel.LEFT);
break;
case KeyEvent.VK_RIGHT:
snakeModel.changeDirection(SnakeModel.RIGHT);
break;
case KeyEvent.VK_ADD:
case KeyEvent.VK_PAGE_UP:
snakeModel.speedUp();// 加速
break;
case KeyEvent.VK_SUBTRACT:
case KeyEvent.VK_PAGE_DOWN:
snakeModel.speedDown();// 减速
break;
case KeyEvent.VK_SPACE:
case KeyEvent.VK_P:
snakeModel.changePauseState();// 暂停或继续
break;
default:
}
if(snakeModel2.running) switch(keyCode)
{
case KeyEvent.VK_I:
snakeModel2.changeDirection(SnakeModel2.UP);
break;
case KeyEvent.VK_K:
snakeModel2.changeDirection(SnakeModel2.DOWN);
break;
case KeyEvent.VK_J:
snakeModel2.changeDirection(SnakeModel2.LEFT);
break;
case KeyEvent.VK_L:
snakeModel2.changeDirection(SnakeModel2.RIGHT);
break;
case KeyEvent.VK_ADD:
case KeyEvent.VK_PAGE_UP:
snakeModel2.speedUp();// 加速
break;
case KeyEvent.VK_SUBTRACT:
case KeyEvent.VK_PAGE_DOWN:
snakeModel2.speedDown();// 减速
break;
case KeyEvent.VK_SPACE:
case KeyEvent.VK_P:
snakeModel2.changePauseState();// 暂停或继续
break;
default:
}
//重新开始
if(keyCode==KeyEvent.VK_R || keyCode==KeyEvent.VK_S
|| keyCode==KeyEvent.VK_ENTER)
{
snakeModel.running=false;
snakeModel2.running=false;
begin();
}
/*//第2条蛇
if(keyCode==KeyEvent.VK_R || keyCode==KeyEvent.VK_S
|| keyCode==KeyEvent.VK_ENTER)
{
snakeModel2.running=false;*/
//begin();
//}
}
public void keyReleased(KeyEvent e)
{
}
public void keyTyped(KeyEvent e)
{
}
//----------------------------------------------------------------------
//repaint():绘制游戏界面(包括蛇和食物)
//----------------------------------------------------------------------
void repaint1()
{
Graphics g=paintCanvas1.getGraphics();
//
Graphics s=paintCanvas2.getGraphics();
//draw background
g.setColor(new Color(159,187,232));
g.fillRect(0,0,canvasWidth,canvasHeight);
//
s.setColor(new Color(159,187,232));
s.fillRect(0,0,canvasWidth,canvasHeight);
//draw the snake
g.setColor(new Color(102,255,255));
LinkedList na=snakeModel.nodeArray;
Iterator it=na.iterator();
while(it.hasNext())
{
Node n=(Node)it.next();
drawNode(g,n);
}
//
s.setColor(new Color(102,255,255));
LinkedList na2=snakeModel2.nodeArray;
Iterator it2=na2.iterator();
while(it2.hasNext())
{
Node n2=(Node)it2.next();
drawNode(s,n2);
}
// draw the food
int x=(int)((Math.random()*10)%10);
switch(x)
{
case 0:
g.setColor(Color.RED);
break;
case 1:
g.setColor(Color.WHITE);
break;
case 2:
g.setColor(Color.GREEN);
break;
case 3:
g.setColor(Color.YELLOW);
break;
case 4:
g.setColor(new Color(255,128,64));
break;
case 5:
g.setColor(new Color(64,0,128));
break;
case 6:
g.setColor(new Color(0,0,255));
break;
case 7:
g.setColor(new Color(0,0,0));
break;
case 8:
g.setColor(new Color(64,128,128));
break;
case 9:
g.setColor(new Color(255,255,255));
break;
}
Node n=snakeModel.food;
drawNode(g,n);
updateScore();
//
int z=(int)((Math.random()*10)%10);
switch(z)
{
case 0:
s.setColor(Color.RED);
break;
case 1:
s.setColor(Color.WHITE);
break;
case 2:
s.setColor(Color.GREEN);
break;
case 3:
s.setColor(Color.YELLOW);
break;
case 4:
s.setColor(new Color(255,128,64));
break;
case 5:
s.setColor(new Color(64,0,128));
break;
case 6:
s.setColor(new Color(0,0,255));
break;
case 7:
s.setColor(new Color(0,0,0));
break;
case 8:
s.setColor(new Color(64,128,128));
break;
case 9:
s.setColor(new Color(255,255,255));
break;
}
Node n2=snakeModel2.food;
drawNode(s,n2);
updateScore();
}
void repaint2()
{
Graphics s=paintCanvas2.getGraphics();
//draw background
//
s.setColor(new Color(159,187,232));
s.fillRect(0,0,canvasWidth,canvasHeight);
//draw the snake
//
s.setColor(new Color(102,255,255));
LinkedList na2=snakeModel2.nodeArray;
Iterator it2=na2.iterator();
while(it2.hasNext())
{
Node n2=(Node)it2.next();
drawNode(s,n2);
}
// draw the food
//
int y=(int)((Math.random()*10)%10);
switch(y)
{
case 0:
s.setColor(Color.RED);
break;
case 1:
s.setColor(Color.WHITE);
break;
case 2:
s.setColor(Color.GREEN);
break;
case 3:
s.setColor(Color.YELLOW);
break;
case 4:
s.setColor(new Color(255,128,64));
break;
case 5:
s.setColor(new Color(64,0,128));
break;
case 6:
s.setColor(new Color(0,0,255));
break;
case 7:
s.setColor(new Color(0,0,0));
break;
case 8:
s.setColor(new Color(64,128,128));
break;
case 9:
s.setColor(new Color(255,255,255));
break;
}
Node n2=snakeModel2.food;
drawNode(s,n2);
updateScore();
}
//----------------------------------------------------------------------
//drawNode():绘画某一结点(蛇身或食物)
//----------------------------------------------------------------------
/*//////////////////////////////////////////////////////////////////////////////////////////////////
private void drawNode(Graphics g,Node n)
{
g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,nodeHeight-1);
}
//////////////////////////////////////////////////////////////////////////////////////////////////*/
private void drawNode(Graphics e,Node d)
{
e.fillRect(d.x*nodeWidth,d.y*nodeHeight,nodeWidth-1,nodeHeight-1);
}
//
//----------------------------------------------------------------------
//updateScore():改变计分牌
//----------------------------------------------------------------------
public void updateScore()
{
String s="Score: "+snakeModel.score;
String s2="Score: "+snakeModel2.score;
labelScore.setText(s);
labelScore2.setText(s2);
}
//----------------------------------------------------------------------
//begin():游戏开始,放置贪吃蛇
//----------------------------------------------------------------------
void begin()
{
if(snakeModel==null||!snakeModel.running)
{
snakeModel=new SnakeModel(this,canvasWidth/nodeWidth,
this.canvasHeight/nodeHeight);
(new Thread(snakeModel)).start();
}
if(snakeModel2==null||!snakeModel2.running)
{
snakeModel2=new SnakeModel2(this,canvasWidth/nodeWidth,
this.canvasHeight/nodeHeight);
(new Thread(snakeModel2)).start();
}
}
//----------------------------------------------------------------------
//main():主函数
//----------------------------------------------------------------------
public static void main(String args[])
{
GreedSnake snake=new GreedSnake();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -