先來看一下效果~這個是能穿牆的,界面神馬的就不美化惹~
直接上代碼:
package com.snake;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.Date;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class SnakeWindow extends JFrame {
//獲取屏幕分辨率
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
//數組,用來保存蛇,其中1表示此處有蛇身,0表示沒有
static int[][] snake = new int[31][31];
//是否開始
boolean isStarted = false;
//標記蛇此時移動的方向 (1:左 2:右 3:上 4:下)
int direction = 1;
//標記蛇頭位置
int headX, headY;
//標記蛇尾位置
int tailX, tailY;
//臨時位置
int[] tempX = new int[200];
int[] tempY = new int[200];
int size = 0;
//食物位置
static int foodX = 0;
static int foodY = 0;
//食物是否被喫
boolean isEated = true;
//分數
String score = "0";
//等級
String level = "1";
//蛇的移動速度
int speed = 100;
JButton start = new JButton("開始遊戲");
JButton end = new JButton("結束遊戲");
JButton about = new JButton("關於");
public SnakeWindow() {
this.setTitle("貪喫蛇");
this.setSize(450, 400);
this.setLocation((width - 450)/2, (height - 400)/2);
this.setResizable(false);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLayout(null);
Container c = this.getContentPane();
MyPanel jp = new MyPanel();
jp.setLayout(null);
jp.setSize(450, 400);
//JLabel sore = new JLabel();
start.setFont(new Font("宋體", 15, 15));
start.setMargin(new Insets(0, 0, 0, 0));
start.setBounds(345, 30, 80, 30);
end.setFont(new Font("宋體", 15, 15));
end.setMargin(new Insets(0, 0, 0, 0));
end.setBounds(345, 300, 80, 30);
about.setFont(new Font("宋體", 15, 15));
about.setMargin(new Insets(0, 0, 0, 0));
about.setBounds(345, 250, 80, 30);
jp.add(start);
jp.add(end);
jp.add(about);
c.add(jp);
new Thread(new ThreadUpadte()).start();
// SnakeWindow.run();
// this.repaint();
// start.requestFocus();
// end.requestFocus();
// this.requestFocus();
start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
SnakeWindow.this.requestFocus();
InitSnake();
isStarted = true;
start.setEnabled(false);
repaint();
}
});
about.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(isStarted != false) {
isStarted = false;
repaint();
JOptionPane.showMessageDialog(null, "本遊戲由耗子哥哥製作,歡迎來耗子哥哥寢室交流與學習。");
SnakeWindow.this.requestFocus();
isStarted = true;
}
else {
JOptionPane.showMessageDialog(null, "本遊戲由耗子哥哥製作,歡迎來耗子哥哥寢室交流與學習。");
}
}
});
end.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(EXIT_ON_CLOSE);
}
});
this.addKeyListener(new KeyListener(){
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int key = e.getKeyCode();
if(key == e.VK_UP ){
if(direction != 4 && direction != 3) {
try {
direction = 3;
Thread.sleep(speed);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
else if(key == e.VK_DOWN ){
if(direction != 3 && direction != 4) {
try {
direction = 4;
Thread.sleep(speed);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
else if(key == e.VK_LEFT ) {
if(direction != 2 && direction != 1) {
try {
direction = 1;
Thread.sleep(speed);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
else if(key == e.VK_RIGHT ) {
if(direction != 1 && direction != 2) {
try {
direction = 2;
Thread.sleep(speed);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
});
}
public class MyPanel extends JPanel {
public void paintComponent(Graphics scr) {
BufferedImage bi = new BufferedImage(450, 400, BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.createGraphics();
g.setColor(Color.black);
g.drawLine(30, 30, 330, 30);
g.drawLine(30, 330, 330, 330);
g.drawLine(30, 30, 30, 330);
g.drawLine(330, 30, 330, 330);
//時間
Date now = new Date(System.currentTimeMillis());
DateFormat d = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM); //顯示日期,時間(精確到分)
String str = d.format(now);
g.drawString(str, 330, 360);
g.setFont(new Font("黑體", 20, 20));
g.drawString("當前得分:", 345, 100);
g.setFont(new Font("黑體", 40, 40));
g.drawString(score, 355, 140);
g.setFont(new Font("黑體", 20, 20));
g.drawString("當前等級:", 345, 170);
g.setFont(new Font("黑體", 40, 40));
g.drawString("LV:"+level, 355, 210);
if(true) {
for(int i = 0; i < 30; i++) {
for(int j = 0; j < 30; j++) {
if(snake[i][j] == 1 || snake[i][j] == 2) {
int x = i * 10 + 30;
int y = j * 10 + 30;
//System.out.println(x +"---" + y);
g.setColor(Color.WHITE);
g.fillRect(x, y, 10, 10);
g.setColor(Color.BLACK);
g.drawRect(x, y, 10, 10);
}
}
}
}
scr.drawImage(bi, 0, 0, this);
}
}
public void InitSnake() {
for(int i = 0; i < 30; i++) {
for(int j = 0; j < 30; j++) {
if((i == 14 || i == 15 || i == 16 ||i == 17)&& j == 14) {
snake[i][j] = 1;
}
else {
snake[i][j] = 0;
}
}
}
direction = 1;
headX = 14;
headY = 14;
tailX = 17;
tailY = 14;
tempX[0] = 15;
tempY[0] = 14;
tempX[1] = 16;
tempY[1] = 14;
tempX[2] = 17;
tempY[2] = 14;
size = 2;
score = "0";
level = "1";
speed = 100;
isEated = true;
}
class ThreadUpadte implements Runnable {
public void run() {
// TODO Auto-generated method stub
while(true) {
// System.out.println("");
// boolean bl = isStarted;
try {
if(isStarted == true){
Thread.sleep(speed);
//System.out.println("111");
if(direction == 1) {
int t = headX - 1;
if(t < 0)
t = 29;
if(snake[t][headY] == 2) {
size++;
EatAndUp();
tempX[size] = tailX;
tempY[size] = tailY;
headX--;
if(headX < 0)
headX = 29;
isEated = true;
snake[headX][headY] = 1;
direction = 1;
score = add(score, "5");
up();
repaint();
}
else if(snake[t][headY] == 1 ) {
// System.out.println("t --- " + t);
// System.out.println("headY --- " + headY);
// System.out.println("tempX[0] --- " + tempX[0]);
JOptionPane.showMessageDialog(null, "蛇咬到了自己,掛了~遊戲結束!!!");
int i = JOptionPane.showConfirmDialog(null, "是否重新開始遊戲?");
if(i == 0) {
direction = 1;
InitSnake();
isEated = true;
}
else {
//System.exit(EXIT_ON_CLOSE);
isStarted = false;
Init();
start.setEnabled(true);
start.requestFocus();
}
}
else {
snake[tailX][tailY] = 0;
EatAndUp();
headX--;
if(headX < 0)
headX = 29;
snake[headX][headY] = 1;
direction = 1;
repaint();
}
}
if(direction == 2) {
//System.out.println("右");
int t = headX + 1;
if(t > 29)
t = 0;
if(snake[t][headY] == 2) {
size++;
EatAndUp();
tempX[size] = tailX;
tempY[size] = tailY;
headX++;
if(headX > 29)
headX = 0;
isEated = true;
direction = 2;
snake[headX][headY] = 1;
score = add(score, "5");
up();
repaint();
}
else if(snake[t][headY] == 1 ) {
// System.out.println("t --- " + t);
// System.out.println("headY --- " + headY);
// System.out.println("tempX[0] --- " + tempX[0]);
JOptionPane.showMessageDialog(null, "蛇咬到了自己,掛了~遊戲結束!!!");
int i = JOptionPane.showConfirmDialog(null, "是否重新開始遊戲?");
if(i == 0) {
direction = 1;
InitSnake();
isEated = true;
}
else {
//System.exit(EXIT_ON_CLOSE);
isStarted = false;
Init();
start.setEnabled(true);
start.requestFocus();
}
}
else {
snake[tailX][tailY] = 0;
EatAndUp();
headX++;
if(headX >29)
headX = 0;
direction = 2;
snake[headX][headY] = 1;
repaint();
}
}
if(direction == 3) {
int t = headY - 1;
if(t < 0)
t = 29;
if(snake[headX][t] == 2) {
size++;
EatAndUp();
tempX[size] = tailX;
tempY[size] = tailY;
headY--;
if(headY < 0)
headY = 29;
isEated = true;
snake[headX][headY] = 1;
score = add(score, "5");
up();
repaint();
}
else if(snake[headX][t] == 1 ) {
// System.out.println("t --- " + t);
// System.out.println("headX --- " + headX);
// System.out.println("tempY[0] --- " + tempY[0]);
JOptionPane.showMessageDialog(null, "蛇咬到了自己,掛了~遊戲結束!!!");
int i = JOptionPane.showConfirmDialog(null, "是否重新開始遊戲?");
if(i == 0) {
direction = 1;
InitSnake();
isEated = true;
}
else {
//System.exit(EXIT_ON_CLOSE);
isStarted = false;
Init();
start.setEnabled(true);
start.requestFocus();
}
}
else {
snake[tailX][tailY] = 0;
EatAndUp();
headY--;
if(headY < 0)
headY = 29;
snake[headX][headY] = 1;
direction = 3;
repaint();
}
}
if(direction == 4) {
//System.out.println("下");
int t = headY + 1;
if(t > 29)
t = 0;
if(snake[headX][t] == 2) {
size++;
EatAndUp();
tempX[size] = tailX;
tempY[size] = tailY;
headY++;
if(headY > 29)
headY = 0;
isEated = true;
snake[headX][headY] = 1;
direction = 4;
score = add(score, "5");
up();
repaint();
}
else if(snake[headX][t] == 1 ) {
// System.out.println("t --- " + t);
// System.out.println("headX --- " + headX);
// System.out.println("tempY[0] --- " + tempY[0]);
JOptionPane.showMessageDialog(null, "蛇咬到了自己,掛了~遊戲結束!!!");
int i = JOptionPane.showConfirmDialog(null, "是否重新開始遊戲?");
if(i == 0) {
direction = 1;
InitSnake();
isEated = true;
}
else {
//System.exit(EXIT_ON_CLOSE);
isStarted = false;
Init();
start.setEnabled(true);
start.requestFocus();
}
}
else {
snake[tailX][tailY] = 0;
EatAndUp();
headY++;
if(headY > 29)
headY = 0;
snake[headX][headY] = 1;
direction = 4;
repaint();
}
}
if(isEated && isStarted) {
// new GetFood();
Random random = new Random();
do {
foodX = random.nextInt(29);
foodY = random.nextInt(29);
// System.out.println(foodX + " " + foodY);
}while(snake[foodX][foodY] == 1);
snake[foodX][foodY] = 2;
isEated = false;
}
}
repaint();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public void EatAndUp(){
for(int i = size; i >= 1; i--) {
tempX[i] = tempX[i-1];
tempY[i] = tempY[i-1];
}
tempX[0] = headX;
tempY[0] = headY;
tailX = tempX[size];
tailY = tempY[size];
}
public void Init() {
for(int i = 0; i < 30; i++) {
for(int j = 0; j < 30; j++) {
snake[i][j] = 0;
}
}
score = "0";
level = "1";
speed = 100;
isEated = true;
}
public static String add(String s1, String s2) {
BigDecimal b1 = new BigDecimal(s1);
BigDecimal b2 = new BigDecimal(s2);
return b1.add(b2).toString();
}
public void up() {
if(score.compareTo("20") == 0) {
level = "2";
speed -= 10;
}
if(score.compareTo("30") == 0) {
level = "3";
speed -= 10;
}
if(score.compareTo("40") == 0) {
level = "4";
speed -= 10;
}
if(score.compareTo("50") == 0) {
level = "5";
speed -= 10;
}
if(score.compareTo("60") == 0) {
level = "6";
speed -= 10;
}
if(score.compareTo("70") == 0) {
level = "7";
speed -= 10;
}
if(score.compareTo("80") == 0) {
level = "8";
speed -= 10;
}
if(score.compareTo("90") == 0) {
level = "9";
speed -= 5;
}
if(score.compareTo("200") == 0) {
repaint();
JOptionPane.showMessageDialog(null, "恭喜你,通關了~");
int i = JOptionPane.showConfirmDialog(null, "是否重新開始遊戲?");
if(i == 0) {
direction = 1;
InitSnake();
isEated = true;
}
else {
//System.exit(EXIT_ON_CLOSE);
isStarted = false;
Init();
start.setEnabled(true);
start.requestFocus();
}
repaint();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new SnakeWindow();
}
}
初學者,可能代碼冗餘比較多~多見諒~還有一些什麼邏輯問題的,感覺好多好多,就那樣了。。。。我主要是通過一個二位數組來模擬的。。。嗯~以前模擬做多了,呃呵~