java實現小遊戲貪吃蛇
阿新 • • 發佈:2021-01-20
介面類:
public class JFarmDemo {
/**
* mJFrame第一次顯示的窗體,遊戲開始前選擇遊戲難度的窗體
* jFrame 點選開始按鈕後顯示的窗體,遊戲正在執行的窗體
*
*/
private static JFrame mJFrame, jFrame;
private static JLabel mJLabel, mJLabel1;
private static JPanel mJPanel, mJPanel2;
private static JButton mJButton, mJButton2;
private static JSpinner mJSpinner;
private static String[] strings;
private static int number = 20;
public JFarmDemo() {
init_J();
mJFrame.setBounds(500, 200, 300, 450);
mJFrame.setBackground(Color.BLUE);
mJFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
mJFrame.setLayout(new BorderLayout(10, 10));
mJPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));
mJPanel.add(mJButton);
mJPanel.add(mJLabel1);
SpinnerModel model = new SpinnerListModel(strings);
mJSpinner = new JSpinner(model) ;
mJSpinner.setSize(50, 50);
mJPanel.add(mJSpinner);
mJPanel.add(mJButton2);
ImageIcon mIcon = new ImageIcon("image/snakeback.png");
mJLabel = new JLabel(mIcon);
mJPanel2.add(mJLabel);
mJFrame.add(mJPanel, BorderLayout.SOUTH);
mJFrame.add(mJPanel2, BorderLayout.CENTER);
mJFrame.setResizable(false);
mJFrame.setVisible(true);
Listen();
}
private void init_J() {
mJFrame = new JFrame("貪吃蛇");
jFrame = new JFrame("遊戲介面");
mJPanel = new JPanel();
mJPanel2 = new JPanel();
mJButton = new JButton("開始");
mJLabel1 = new JLabel("選擇難度");
mJButton2 = new JButton("退出");
strings = new String[]{"簡單", "一般", "困難"};
}
private void Listen() {
mJButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
mJFrame.setVisible(false);
jFrame.getContentPane().setBackground(Color.CYAN);
Snake snake = new Snake(number, 300, 440);
snake.setBackground(Color.BLUE);
jFrame.add(snake);
jFrame.setBounds(500, 200, 320, 480);
jFrame.setResizable(false);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
});
mJSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent changeEvent) {
switch (mJSpinner.getValue().toString()) {
case "簡單":
number = 20;
break;
case "一般":
number = 15;
break;
case "困難":
number = 10;
break;
default:
break;
}
}
});
mJButton2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
mJFrame.dispose();
}
});
}
}
蛇頭座標:
public class Head {
public int x;
public int y;
}
蛇動作:
public class Snake extends JComponent implements KeyListener {
private static List<Head> headList = new ArrayList<>();
private static int mSecretion;
private static boolean isRuning = true;
private static boolean iseating = true;
private static boolean isChange = false;
private static int a, b, space ;
private static int weight, high;
public Snake(final int number, int weight, int high) {
Snake.weight = weight;
Snake.high = high;
space = number;
this.setFocusable(true); // 獲取焦點
this.addKeyListener(this); // 監聽鍵盤事件
headList.add(new Head());
a = 4;
b = 5;
new Thread(new Runnable() {
@Override
public void run() {
while (isRuning) {
try {
Thread.sleep(100);
repaint();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
@Override
protected void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
for (int i = 1; i <= weight / space; i++) {
graphics.drawLine(i * space, 0, i * space, high);
}
for (int i = 1; i <= high / space; i++) {
graphics.drawLine(0, i * space, weight, i * space);
}
graphics.setColor(Color.BLUE);
if (isChange) {
isChange = false;
a = new Random().nextInt(14) + 1;
b = new Random().nextInt(21) + 1;
}
graphics.fillRect(a * space, b * space, space, space);
graphics.setColor(Color.BLACK);
for (int i = 0; i < headList.size(); i++) {
if (i==0){
graphics.setColor(Color.RED);
}else {
graphics.setColor(Color.BLACK);
}
graphics.fillRect(headList.get(i).x, headList.get(i).y, space, space);
}
snakeMove(headList, mSecretion);
if (iseating) {
headList.remove(headList.size() - 1);
}
iseating = true;
}
public void snakeMove(List<Head> heads, int mSnakedirection) {
Head mOldHead = heads.get(0);
Head mNewheads = new Head();
switch (mSnakedirection) {
//上
case 1:
mNewheads.x = mOldHead.x;
mNewheads.y = mOldHead.y - space;
break;
//下
case 2:
mNewheads.x = mOldHead.x;
mNewheads.y = mOldHead.y + space;
break;
//左
case 3:
mNewheads.x = mOldHead.x + space;
mNewheads.y = mOldHead.y;
break;
//右
case 4:
mNewheads.x = mOldHead.x - space;
mNewheads.y = mOldHead.y;
break;
}
Crossing(mNewheads.x, mNewheads.y);
EatMyself(heads);
EatFood(mNewheads.x, mNewheads.y);
Sanme(heads);
heads.add(0, mNewheads);
}
/**
* 越界
*
* @param x
* @param y
*/
private void Crossing(int x, int y) {
if ((x < 0 || x > 280) || (y < 0 || y > 420)) {
isRuning = false;
}
}
/**
* 碰到自己
*/
private void EatMyself(List<Head> heads) {
for (int i = 1; i < heads.size(); i++) {
if (heads.get(0).x == heads.get(i).x && heads.get(0).y == heads.get(i).y) {
isRuning = false;
}
}
}
/**
* 吃到食物
*/
private void EatFood(int x, int y) {
if (x == a * space && y == b * space) {
iseating = false;
isChange = true;
}
}
/**
* 避免食物與蛇體重合
*/
private void Sanme(List<Head> heads) {
for (int i = 0; i < heads.size(); i++) {
if (a == heads.get(i).x && b == heads.get(i).y) {
a = new Random().nextInt(14) + 1;
b = new Random().nextInt(21) + 1;
}
}
}
@Override
public void keyTyped(KeyEvent keyEvent) {
}
@Override
public void keyPressed(KeyEvent keyEvent) {
int keyCode = keyEvent.getKeyCode();
// System.out.print("鍵盤值:" + keyCode + "\n");
//上
if ((keyCode == 87 || keyCode == 38) && mSecretion != 2) {
mSecretion = 1;
}
//下
else if ((keyCode == 83 || keyCode == 40) && mSecretion != 1) {
mSecretion = 2;
}//左
else if ((keyCode == 68 || keyCode == 39 )&& mSecretion != 4) {
mSecretion = 3;
}//右
else if ((keyCode == 65 || keyCode == 37 )&& mSecretion != 3) {
mSecretion = 4;
}
}
@Override
public void keyReleased(KeyEvent keyEvent) {
}
}
啟動類:
public class StartUp {
public static void main(String[] strings) {
JFarmDemo mJFarmDemo = new JFarmDemo();
}
}