java开发游戏 知乎_Java开发贪吃蛇游戏

本文选自公众号:千问千知(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.com6fa5441a207460d5da655292019a3c85.pngJava如何编写飞机大战游戏​mp.weixin.qq.com1fe8024d86a830de6c10006d925480b6.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值