本文选自公众号:千问千知(qwqz1000),欢迎关注技术文章
Part 1:
设计游戏图纸
画出900*700的白色窗口
在窗口上添加画布
在画布上添加标题
在画布上添加黑色游戏区
Part 2:
放置静态的蛇:一个头、两个身体
加上开始提示:按空格键开始游戏
让蛇动起来:监听Timer事件,平移数据
实现游戏暂停
实现转向功能、
Part 3:
添加食物
吃掉食物
添加死亡条件
实现“重新开始”功能
添加分数和长度
游戏图纸如下:
蛇及游戏框的素材如下:
Snake主类:
package snake;
import javax.swing.JFrame;
import javax.swing.JPanel;
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);
SnakePanel panel = new SnakePanel(); //添加画布
frame.add(panel); // 刚添加时画布是空的看不到
frame.setVisible(true); // 允许显示游戏界面
}
}
SnakePanel类:
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.util.Random;
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[] snakex = new int [750];
int[] snakey = new int [750];
// 随机生成食物
Random rand = new Random();
int foodx = rand.nextInt(34)*25+25; //此处的数值根据自己设计的游戏界面的大小来确定
int foody = rand.nextInt(24)*25+75;
// 设置游戏的默认属性
int len = 3;
int score = 0;
String direction = "R"; // U上 D下 L左 R右
boolean isStarted = false; // 判断游戏是否开始
boolean isFailed = false; // 判断游戏是否结束
Timer timer = new Timer(100,this); // 每100毫秒调用一次ActionPerformed
public SnakePanel() { // 建造画布的构造函数
this.setFocusable(true); // 获取焦点
this.addKeyListener(this); // 监听键盘事件
setup();
timer.start();
}
public void paint(Graphics g) { // Graphics 画笔
this.setBackground(Color.BLACK); // 设置画布背景颜色
title.paintIcon(this, g, 25, 11);// 放置主题图片
g.fillRect(25, 75, 850, 650); // 用画笔设置游戏方框
// 画蛇头(注意判断蛇头的方向)
if (direction.equals("R"))
right.paintIcon(this, g, snakex[0], snakey[0]);
else if (direction.equals("L"))
left.paintIcon(this, g, snakex[0], snakey[0]);
else if (direction.equals("U"))
up.paintIcon(this, g, snakex[0], snakey[0]);
else if (direction.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 (!isStarted){
g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.BOLD, 30));
g.drawString("Press Space to start / pause", 200, 300);
}
// 判断如果游戏结束显示。。。
if (isFailed){
g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.BOLD, 30));
g.drawString("Game Over ! Press space to restart", 200, 300);
}
// 显示食物
food.paintIcon(this, g, foodx, foody);
// 设置分数和蛇的长度
g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.PLAIN,15));
g.drawString("Score : "+score, 650, 37);
g.drawString("Len :"+len, 650, 57);
}
public void setup() { // 游戏初始化
isStarted = false;
isFailed = false;
len = 3;
score = 0;
snakex[0] = 100; snakex[1] = 75; snakex[2] = 50;
snakey[0] = 100; snakey[1] = 100; snakey[2] = 100;
}
@Override
public void keyPressed(KeyEvent e) {
//实现键盘响应
int KeyCode = e.getKeyCode();
if (KeyCode == KeyEvent.VK_SPACE){ // 敲击空格现实/消除提示信息
if (isFailed){
// isStarted = false; // 可以将这两行放入setup中
// isFailed = false;
setup();
}else
isStarted = !isStarted;
} else if (KeyCode == KeyEvent.VK_UP && direction != "D")
direction = "U";
else if (KeyCode == KeyEvent.VK_DOWN && direction != "U" )
direction = "D";
else if (KeyCode == KeyEvent.VK_RIGHT && direction != "L")
direction = "R";
else if (KeyCode == KeyEvent.VK_LEFT && direction != "R")
direction = "L";
}
@Override
public void actionPerformed(ActionEvent e) {
// 1. 再定义一个闹钟
timer.start();
// 2. 移动数据
if (isStarted && !isFailed){
// 移动身体
for (int i = len; i>0; i--){
snakex[i] = snakex[i-1];
snakey[i] = snakey[i-1];
}
// 移动头
if (direction.equals("R")){
snakex[0] = snakex[0] + 25;
if(snakex[0] > 850) snakex[0] = 25;
}else if (direction.equals("L")){
snakex[0] = snakex[0] - 25;
if(snakex[0] < 25) snakex[0] = 850;
}else if (direction.equals("U")){
snakey[0] = snakey[0] - 25;
if (snakey[0] < 75) snakey[0] = 650;
}else if (direction.equals("D")){
snakey[0] = snakey[0] + 25;
if (snakey[0] > 650) snakey[0] = 75;
}
if (snakex[0] == foodx && snakey[0] == foody){ // 吃食物
len ++;
score ++;
foodx = rand.nextInt(34)*25+25;
foody = rand.nextInt(24)*25+75;
}
for (int i = 1; i < len; i ++){ // 如果蛇头碰到自己的身体游戏结束
if (snakex[0] == snakex[i] && snakey[0] == snakey[i]){
isFailed = true;
}
}
}
// 3. repaint()
repaint();
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
游戏效果如下:
以上就是贪吃蛇游戏的开发原理和代码,
感兴趣的童鞋可以实际操作一下。
相关文章推荐:五子棋代码及算法详解(web版)mp.weixin.qq.comJava如何编写飞机大战游戏mp.weixin.qq.com