package snake;
import javax.swing.JFrame;
public class snake {
public static void main(String[] args) {
JFrame fram = new JFrame();
fram.setTitle("贪吃蛇");//窗口左上角的标识
fram.setBounds(300, 200, 900, 720);//窗口大小
fram.setResizable(false);//窗口不能任意改变大小
fram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//用户单击窗口的关闭按钮时程序执行的操作
SnakePanel panel = new SnakePanel();
fram.add(panel);
fram.setVisible(true);//设置窗体可见,没有该语句,窗体将不可见,此语句必须有,否则没有界面就没有如何意义了
}
}
package snake;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.beans.ExceptionListener;
import java.util.Random;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
public class SnakePanel extends JPanel implements KeyListener, ActionListener {
//导入图片
ImageIcon up = new ImageIcon("up.png");
ImageIcon down = new ImageIcon("down.png");
ImageIcon left = new ImageIcon("left.png");
ImageIcon right = new ImageIcon("right.png");
ImageIcon food = new ImageIcon("food.png");
ImageIcon body = new ImageIcon("body.png");
ImageIcon title = new ImageIcon("title.jpg");
//初始化
int len = 3;//蛇长
int score = 0;//分数
int[] snakex = new int[750];
int[] snakey = new int[750];//画布为750*750
Random x = new Random();
int foodx = x.nextInt(34)*25+25;
int foody = x.nextInt(24)*25+75;
String fangxiang = "R";
boolean isStart = false;
boolean isFail = false;
boolean isVoice = false;
Timer timer = new Timer(80, this);
public void setUp(){
isStart = false;
isFail = false;
isVoice = false;
score = 0;
len = 3;
fangxiang = "R";
snakex[0] = 100;
snakey[0] = 100;
snakex[1] = 75;
snakey[1] = 100;
snakex[2] = 50;
snakey[2] = 100;
}
public SnakePanel(){//构造器
this.setFocusable(true);
this.addKeyListener(this);
setUp();
}
public void paint(Graphics g){
super.paint(g);
this.setBackground(Color.white);
title.paintIcon(this, g, 25, 11);
g.fillRect(25, 75, 850, 600);
//snake头
if(fangxiang.equals("R")){
right.paintIcon(this, g, snakex[0], snakey[0]);
}else if(fangxiang.equals("L")){
left.paintIcon(this, g, snakex[0], snakey[0]);
}else if(fangxiang.equals("U")){
up.paintIcon(this, g, snakex[0], snakey[0]);
}else if(fangxiang.equals("D")){
down.paintIcon(this, g, snakex[0], snakey[0]);
}
for(int i= 1 ; i<len; i++){
body.paintIcon(this, g, snakex[i], snakey[i]);
}
if(isStart == false){
g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.BOLD,30));
g.drawString("Press space to start/stop", 250, 300);
}
if(isFail == true){
g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.BOLD,30));
g.drawString("Game over,Press space to Restart", 250, 300);
}
food.paintIcon(this, g, foodx, foody);
g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.BOLD,15));
g.drawString("Score:"+score, 800, 30);
g.drawString("Length:"+len, 800, 50);
}
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_SPACE){
if(isFail){
setUp();
}else{
isStart = !isStart;
isVoice = !isVoice;
}
timer.start();
} else if(keyCode == KeyEvent.VK_UP && fangxiang != "D"){
fangxiang = "U";
} else if(keyCode == KeyEvent.VK_DOWN && fangxiang != "U"){
fangxiang = "D";
} else if(keyCode == KeyEvent.VK_LEFT && fangxiang != "R"){
fangxiang = "L";
} else if(keyCode == KeyEvent.VK_RIGHT && fangxiang != "L"){
fangxiang = "R";
}
}
public void actionPerformed(ActionEvent e) {
//1.再定一个闹钟
timer.start();
//2.移动数据
if(isStart && !isFail){
for(int i = len;i>0;i--){
snakex[i] = snakex[i-1];
snakey[i] = snakey[i-1];
}
//移动头部
if(fangxiang.equals("R")){
snakex[0] = snakex[0] + 25;
if(snakex[0]>850) snakex[0]=25;
}else if(fangxiang.equals("L")){
snakex[0] = snakex[0] - 25;
if(snakex[0]<25) snakex[0]=850;
}else if(fangxiang.equals("U")){
snakey[0] = snakey[0] - 25;
if(snakey[0]<75) snakey[0]=650;
}else if(fangxiang.equals("D")){
snakey[0] = snakey[0] + 25;
if(snakey[0]>650) snakey[0]=75;
}
if(snakex[0] == foodx && snakey[0] == foody){
len++;
score++;
foodx = x.nextInt(34)*25+25;
foody = x.nextInt(24)*25+75;
}
for(int i=1; i<len; i++ ){
if(snakex[0] == snakex[i] && snakey[0] == snakey[i]){
isFail = true;
}
}
}
//3.repaint()
repaint();
}
//背景音乐
public void playSound() {
if(isVoice == true){
new Thread(new Runnable() {
public void run() {
try {
Clip clip = AudioSystem.getClip();
clip.open(AudioSystem.getAudioInputStream(getClass().getResourceAsStream("/time.wav")));
clip.start();
}
catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
public void keyTyped(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
}