贪吃蛇的游戏开发
实验内容:
1)实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,上下左右
控制“蛇”的移动,吃到“豆子”以后“蛇”的身体加长一点,得分增加,“蛇”碰到边界或,
蛇头与蛇身相撞,蛇死亡,游戏结束。为游戏设计初始欢迎界面,游戏界面,游戏
结束界面。
2)进行交互界面的设计,要有开始键、暂停键和停止退出的选项。对蛇吃到豆子进行分值计算,可以设置游戏速度,游戏音乐等拓展元素。
实验准备:
eclipse 下载地址
java jdk11.0.6下载地址
一、基本图形界面设计:
1、awt包的主要类,如事件类(event.KeyAdapter、event.KeyEvent)、Graphics类。
事件类主要提供了按键的绑定和监控的功能;
Graphics类最主要提供了一些基本几何图形的绘制方法;
2、util包Stack类和Random类
java.util是包含集合框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组、日期Date类、堆栈Stack类、向量Vector类等)。集合类、时间处理模式、日期时间工具等各类常用工具包。
Java实用工具类库中的类java.util.Random提供了产生各种类型随机数的方法。它可以产生int、long、float、double以及Goussian等类型的随机数。这也是它与java.lang.Math中的方法Random()最大的不同之处,后者只产生double型的随机数。
3、swing包的JFrame组件、JPanel组件、JOptionPane组件;
代码如下:
```java
import javax.swing.JFrame;
public class Snake {
public static void main(String[] args) {
JFrame frame=new JFrame();
frame.setBounds(10,10,900,720);//设置大小
frame.setResizable(false);//不可移动
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭按钮
frame.add(new MPanel());
frame.setVisible(true);
}
}
设置键盘监听器
this.addKeyListener(this);
设置按键反应
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_SPACE) {
if(isFailed) {
isFailed = false;
initSnake();
} else {
isStarted = !isStarted;
}
repaint();
}else if(keyCode == KeyEvent.VK_LEFT) {
fx = "L";
}else if(keyCode == KeyEvent.VK_RIGHT) {
fx = "R";
}else if(keyCode == KeyEvent.VK_UP) {
fx = "U";
}else if(keyCode == KeyEvent.VK_DOWN) {
fx = "D";
}
}
设置fail条件
public void actionPerformed(ActionEvent e) {
if(isStarted && !isFailed) {
for(int i=len-1; i>0; i--) {
snakex[i]=snakex[i-1];
snakey[i]=snakey[i-1];
}
if(fx == "R") {
snakex[0] = snakex[0] + 25;
if(snakex[0] > 850) isFailed = true;
}else if(fx == "L") {
snakex[0] = snakex[0] - 25;
if(snakex[0] < 25) isFailed = true;
}else if(fx == "U") {
snakey[0] = snakey[0] - 25;
if(snakey[0] < 75) isFailed = true;
}else if(fx == "D") {
snakey[0] = snakey[0] + 25;
if(snakey[0] > 670) isFailed = true;
}
Mpanel类代码如下:
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.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
public class MPanel extends JPanel implements KeyListener, ActionListener {
ImageIcon title = new ImageIcon("title.jpg");
ImageIcon body = new ImageIcon("body.png");
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");
int len = 3;//设置初始长度
int score = 0;
int[] snakex = new int[816];//边界
int[] snakey = new int[816];
String fx = "R"; //方向:R, L, U, D
boolean isStarted = false;
boolean isFailed = false;
Timer timer = new Timer(160 , this);//蛇运动的速度
int foodx;//食物初始位置
int foody;
Random rand = new Random();
public MPanel() {
initSnake();
this.setFocusable(true);
this.addKeyListener(this);
timer.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(Color.WHITE);
title.paintIcon(this, g, 25, 11);
g.fillRect(25, 75, 850, 600);
g.setColor(Color.WHITE);
g.drawString("Len " + len, 750, 35);
g.drawString("Score " + score, 750, 50);
if(fx == "R") {
right.paintIcon(this, g, snakex[0], snakey[0]);
}else if(fx == "L") {
left.paintIcon(this, g, snakex[0], snakey[0]);
}else if(fx == "D") {
down.paintIcon(this, g, snakex[0], snakey[0]);
}else if(fx == "U") {
up.paintIcon(this, g, snakex[0], snakey[0]);
}
for(int i=1; i< len; i++) {
body.paintIcon(this, g, snakex[i], snakey[i]);
}
food.paintIcon(this, g, foodx, foody);
if(isStarted == false) {
g.setColor(Color.WHITE);
g.setFont(new Font("微软雅黑", Font.BOLD, 40));
g.drawString("按空格键开始游戏", 270, 300);
}
if(isFailed) {
g.setColor(Color.RED);
g.setFont(new Font("宋体", Font.BOLD, 200));
g.drawString("死", 350, 450);
}
}
public void initSnake() {
//初始化蛇的位置
len = 3;
snakex[0] = 100;
snakey[0] = 100;
snakex[1] = 75;
snakey[1] = 100;
snakex[2] = 50;
snakey[2] = 100;
foodx = 25 + 25 * rand.nextInt(34);
foody = 75 + 25 * rand.nextInt(24);
fx = "R";
score = 0;
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_SPACE) {
if(isFailed) {
isFailed = false;
initSnake();
} else {
isStarted = !isStarted;
}
repaint();
}else if(keyCode == KeyEvent.VK_LEFT) {
fx = "L";
}else if(keyCode == KeyEvent.VK_RIGHT) {
fx = "R";
}else if(keyCode == KeyEvent.VK_UP) {
fx = "U";
}else if(keyCode == KeyEvent.VK_DOWN) {
fx = "D";
}
}
@Override
public void actionPerformed(ActionEvent e) {
if(isStarted && !isFailed) {
for(int i=len-1; i>0; i--) {
snakex[i]=snakex[i-1];
snakey[i]=snakey[i-1];
}
if(fx == "R") {
snakex[0] = snakex[0] + 25;
if(snakex[0] > 850) isFailed = true;//snakex[0] = 25;
}else if(fx == "L") {
snakex[0] = snakex[0] - 25;
if(snakex[0] < 25) isFailed = true;//snakex[0] = 850;
}else if(fx == "U") {
snakey[0] = snakey[0] - 25;
if(snakey[0] < 75) isFailed = true;//snakey[0] = 650;
}else if(fx == "D") {
snakey[0] = snakey[0] + 25;
if(snakey[0] > 670) isFailed = true;//snakey[0] = 75;
}
if(snakex[0] == foodx && snakey[0] == foody) {
len++;
score = score + 10;
foodx = 25 + 25 * rand.nextInt(34);
foody = 75 + 25 * rand.nextInt(24);
}
for(int i=1; i<len; i++) {
if(snakex[i]==snakex[0] && snakey[i]==snakey[0]) {
isFailed = true;
}
}
repaint();
}
timer.start();
}