import javax.swing.*; |
import java.awt.*; |
import java.awt.event.*; |
import java.io.*; |
import java.net.*; |
import java.applet.*; |
public class SnakeMap extends JPanel implements Runnable{ |
ImageIcon eatIcon = new ImageIcon( "food.png" ); |
ImageIcon heidong = new ImageIcon( "heidong.png" ); |
SnakeMap sm; |
Snake snake = new Snake(); |
public SnakeMap(){ |
sm = this ; |
//构造组件 |
JLabel jlTitle = new JLabel(); |
jlTitle = new JLabel( new ImageIcon( "title.jpg" ),JLabel.CENTER); |
JLabel jlLgio = new JLabel(); |
jlLgio = new JLabel( new ImageIcon( "lgio.png" ),JLabel.CENTER); |
JLabel jlMap = new JLabel(); |
jlMap = new JLabel( new ImageIcon( "map5.jpg" ),JLabel.CENTER); |
JButton newGame = new JButton( "开始" ); |
newGame.setBackground( new Color( 168 , 132 , 98 )); |
newGame.setForeground( new Color( 128 , 64 , 0 )); |
newGame.setFont( new Font( "华文行楷" , 1 , 30 )); |
JButton stopGame = new JButton( "退出" ); |
stopGame.setBackground( new Color( 168 , 132 , 98 )); |
stopGame.setForeground( new Color( 128 , 64 , 0 )); |
stopGame.setFont( new Font( "华文行楷" , 1 , 30 )); |
JLabel jlScore = new JLabel( "分数:" ); |
jlScore.setForeground( new Color( 128 , 64 , 0 )); |
jlScore.setFont( new Font( "华文行楷" , 1 , 22 )); |
//JLabel jlHard = new JLabel("难度"); |
//jlHard.setForeground(new Color(128,64,0)); |
//jlHard.setFont(new Font("华文行楷",1,22 )); |
//JSlider slider = new JSlider(5,20); |
//slider.setBackground(new Color(168,132,98)); |
//slider.setSnapToTicks(true); |
//slider.setPaintTicks(false); |
//slider.setMajorTickSpacing(0); |
//slider.setMinorTickSpacing(0); |
//设定布局 |
setLayout( null ); |
|
//添加组件 |
add(jlTitle); |
jlTitle.setBounds( 0 , 0 , 800 , 70 ); |
add(newGame); |
newGame.setBounds( 40 , 120 , 120 , 40 ); |
add(jlScore); |
jlScore.setBounds( 30 , 210 , 100 , 80 ); |
//add(jlHard); |
//jlHard.setBounds(30,220,70,40); |
add(stopGame); |
stopGame.setBounds( 40 , 320 , 120 , 40 ); |
add(jlLgio); |
jlLgio.setBounds( 15 , 370 , 180 , 230 ); |
add(jlMap); |
jlMap.setBounds( 210 , 80 , 580 , 480 ); |
//add(slider); |
//slider.setBounds(100,230,100,20); |
|
//设置窗体颜色 |
this .setBackground( new Color( 168 , 132 , 98 )); |
//设置监听器 |
newGame.addActionListener( new ActionListener(){ |
public void actionPerformed(ActionEvent e){ |
//newGame.setEnabled(false); |
if (snake.start == false && snake.failed == true ){ |
music(); |
snake.setup(); |
snake.start = true ; |
requestFocus( true ); |
} |
if (snake.start == true ){ |
requestFocus( true ); |
} |
if (snake.start == false && snake.failed == false ){ |
snake.setup(); |
snake.start = true ; |
snake.failed = true ; |
requestFocus( true ); |
} |
} |
}); |
stopGame.addActionListener( new ActionListener(){ |
public void actionPerformed(ActionEvent e){ |
System.exit( 0 ); |
} |
}); |
//添加键盘监听 |
addKeyListener( new KeyAdapter(){ |
public void keyPressed(KeyEvent e){ |
if (snake.start && snake.failed){ |
if (e.getKeyCode() == KeyEvent.VK_UP && snake.j != 20 && snake.isMove == false ){ |
snake.j = - 20 ; |
snake.i = 0 ; |
snake.isMove = true ; |
} |
if (e.getKeyCode() == KeyEvent.VK_DOWN && snake.j != - 20 && snake.isMove == false ){ |
snake.j = 20 ; |
snake.i = 0 ; |
snake.isMove = true ; |
} |
if (e.getKeyCode() ==KeyEvent.VK_LEFT && snake.i != 20 && snake.isMove == false ){ |
snake.i = - 20 ; |
snake.j = 0 ; |
snake.isMove = true ; |
} |
if (e.getKeyCode() == KeyEvent.VK_RIGHT && snake.i != - 20 && snake.isMove == false ){ |
snake.i = 20 ; |
snake.j = 0 ; |
snake.isMove = true ; |
} |
if (e.getKeyCode() == KeyEvent.VK_SPACE && snake.pause == true ) |
snake.pause = false ; |
else if (e.getKeyCode() == KeyEvent.VK_SPACE && snake.pause == false ){ |
snake.pause = true ; |
Thread thread2 = new Thread(sm); |
thread2.start(); |
requestFocus( true ); |
} |
} |
} |
}); |
Thread thread= new Thread(sm); |
thread.start(); |
} |
public void run(){ |
while (snake.pause){ |
snake.move(); |
repaint(); |
try { |
Thread.sleep( 400 - 50 *snake.speed); |
} catch (Exception e){} |
} |
} |
|
/*if(snakex[0] == 370 && snakey[0] == 400){ |
snakex[0] = 610; |
snakey[0] = 280; |
} |
else if(snakex[0] == 610 && snakey[0] == 280){ |
snakex[0] = 370; |
snakey[0] = 400; |
}*/ |
|
public void music(){ |
try { |
File f = new File( "faded.wav" ); |
URI uri = f.toURI(); |
URL url = uri.toURL(); |
AudioClip aau = Applet.newAudioClip(url); |
aau.loop(); |
} catch (Exception e){ |
e.printStackTrace(); |
} |
} |
//调用paint方法 |
public void paint(Graphics g){ |
super .paint(g); |
//画出地图 左上角(210,80) 右下角(790,560) |
g.drawRect( 200 , 70 , 600 , 500 ); |
g.drawRect( 210 , 80 , 580 , 480 ); |
g.fillRect( 200 , 70 , 600 , 10 ); |
g.fillRect( 200 , 70 , 10 , 500 ); |
g.fillRect( 200 , 560 , 600 , 10 ); |
g.fillRect( 790 , 70 , 10 , 500 ); |
//画出蛇、食物 |
if (snake.start && snake.failed){ |
eatIcon.paintIcon( this , g , snake.food.eatx , snake.food.eaty); |
heidong.paintIcon( this , g , 370 , 400 ); |
heidong.paintIcon( this , g , 610 , 280 ); |
g.setColor( new Color( 255 , 0 , 0 )); |
g.fillOval(snake.snakex[ 0 ] , snake.snakey[ 0 ] , 20 , 20 ); |
Graphics2D g1 = (Graphics2D) g; |
g1.setPaint( new GradientPaint( 168 , 132 ,Color.CYAN, 185 , 210 ,Color.MAGENTA, true )); |
for ( int m = 1 ; m < snake.len ; m ++){ |
g.fillOval(snake.snakex[m] , snake.snakey[m] , 20 , 20 ); |
} |
g.setColor( new Color( 128 , 64 , 0 )); |
g.setFont( new Font( "华文行楷" ,Font.BOLD, 30 )); |
g.drawString( "" +snake.score, 100 , 260 ); |
} |
if (!snake.failed){ |
g.setColor( new Color( 128 , 64 , 0 )); |
g.setFont( new Font( "华文行楷" ,Font.BOLD, 30 )); |
g.drawString( "" +snake.score, 100 , 200 ); |
g.setColor( new Color( 168 , 132 , 98 )); |
g.setFont( new Font( "arial" ,Font.BOLD, 30 )); |
g.drawString( "Game Over ! Press start to restart" , 200 , 300 ); |
} |
} |
} |