贪吃蛇是一款较老的经典电子游戏。它最初是在 70 年代后期创建的。后来它被带到了PC上。在这个游戏中,玩家控制一条蛇。目标是尽可能多地吃苹果。蛇每吃一个苹果,它的身体就会变大。蛇必须避开墙壁和自己的身体。这个游戏有时被称为Nibbles。
蛇的每个关节的大小是 10 像素。蛇是用光标键控制的。最初,这条蛇有三个关节。如果游戏结束,棋盘中央会显示“游戏结束”消息。
包 com.zetcode;
导入 java.awt.Color;
导入 java.awt.Dimension;
导入java.awt.Font;
导入 java.awt.FontMetrics;
导入 java.awt.Graphics;
导入 java.awt.Image;
导入 java.awt.Toolkit;
导入 java.awt.event.ActionEvent;
导入 java.awt.event.ActionListener;
导入 java.awt.event.KeyAdapter;
导入 java.awt.event.KeyEvent;
导入 javax.swing.ImageIcon;
导入 javax.swing.JPanel;
导入 javax.swing.Timer;
公共类 Board 扩展 JPanel 实现 ActionListener {
私人最终int B_WIDTH = 300;
私人最终int B_HEIGHT = 300;
私人最终 int DOT_SIZE = 10;
私人最终 int ALL_DOTS = 900;
私人最终 int RAND_POS = 29;
私人最终 int 延迟 = 140;
私有最终 int x[] = new int[ALL_DOTS];
私有最终 int y[] = new int[ALL_DOTS];
私有 int 点;
私有 int apple_x;
私人 int apple_y;
私人布尔左方向=假;
私有布尔rightDirection = true;
私人布尔向上方向=假;
私人布尔下方向=假;
私人布尔 inGame = true;
私人定时器定时器;
私人形象球;
私人形象苹果;
私有图像头;
公共板(){
初始化板();
}
私人无效初始化板(){
addKeyListener(new TAdapter());
设置背景(颜色。黑色);
可聚焦(真);
setPreferredSize(新维度(B_WIDTH, B_HEIGHT));
加载图像();
初始化游戏();
}
私人无效加载图像(){
ImageIcon iid = new ImageIcon("src/resources/dot.png");
球 = iid.getImage();
ImageIcon iia = new ImageIcon("src/resources/apple.png");
苹果 = iia.getImage();
ImageIcon iih = new ImageIcon("src/resources/head.png");
头 = iih.getImage();
}
私人无效初始化游戏(){
点 = 3;
for (int z = 0; z < 点; z++) {
x[z] = 50 - z * 10;
y[z] = 50;
}
定位苹果();
计时器 = 新计时器(延迟,此);
计时器.start();
}
@覆盖
公共无效paintComponent(图形g){
super.paintComponent(g);
绘图(g);
}
私人无效doDrawing(图形g){
如果(游戏中){
g.drawImage(苹果,apple_x,apple_y,这个);
for (int z = 0; z < 点; z++) {
如果(z == 0){
g.drawImage(头, x[z], y[z], 这个);
} 别的 {
g.drawImage(球, x[z], y[z], this);
}
}
Toolkit.getDefaultToolkit().sync();
} 别的 {
游戏结束(g);
}
}
私人无效gameOver(图形g){
String msg = "游戏结束";
小字体 = new Font("Helvetica", Font.BOLD, 14);
FontMetrics 度量 = getFontMetrics(small);
g.setColor(Color.white);
g.setFont(小);
g.drawString(msg, (B_WIDTH - metr.stringWidth(msg)) / 2, B_HEIGHT / 2);
}
私人无效检查苹果(){
if ((x[0] == apple_x) && (y[0] == apple_y)) {
点++;
定位苹果();
}
}
私人无效移动(){
for (int z = 点; z > 0; z--) {
x[z] = x[(z - 1)];
y[z] = y[(z - 1)];
}
如果(左方向){
x[0] -= DOT_SIZE;
}
如果(右方向){
x[0] += DOT_SIZE;
}
如果(向上方向){
y[0] -= DOT_SIZE;
}
如果(向下方向){
y[0] += DOT_SIZE;
}
}
私人无效检查碰撞(){
for (int z = 点; z > 0; z--) {
if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z])) {
游戏内=假;
}
}
如果(y[0] >= B_HEIGHT){
游戏内=假;
}
如果 (y[0] < 0) {
游戏内=假;
}
如果 (x[0] >= B_WIDTH) {
游戏内=假;
}
如果 (x[0] < 0) {
游戏内=假;
}
如果(!游戏中){
计时器.stop();
}
}
私人无效locateApple(){
int r = (int) (Math.random() * RAND_POS);
apple_x = ((r * DOT_SIZE));
r = (int) (Math.random() * RAND_POS);
apple_y = ((r * DOT_SIZE));
}
@覆盖
公共无效actionPerformed(ActionEvent e){
如果(游戏中){
检查苹果();
检查碰撞();
移动();
}
重绘();
}
私有类 TAdapter 扩展 KeyAdapter {
@覆盖
公共无效keyPressed(KeyEvent e){
int key = e.getKeyCode();
if ((key == KeyEvent.VK_LEFT) && (!rightDirection)) {
左方向=真;
向上方向 = 假;
向下方向 = 假;
}
if ((key == KeyEvent.VK_RIGHT) && (!leftDirection)) {
正确方向=真;
向上方向 = 假;
向下方向 = 假;
}
if ((key == KeyEvent.VK_UP) && (!downDirection)) {
向上方向=真;
正确的方向=假;
左方向=假;
}
if ((key == KeyEvent.VK_DOWN) && (!upDirection)) {
向下方向 = 真;
正确的方向=假;
左方向=假;
}
}
}
}
首先,我们将定义游戏中使用的常量。
私人最终int B_WIDTH = 300;
私人最终int B_HEIGHT = 300;
私人最终 int DOT_SIZE = 10;
私人最终 int ALL_DOTS = 900;
私人最终 int RAND_POS = 29;
私人最终 int 延迟 = 140;
B_WIDTH和B_HEIGHT常量决定了板子的大小 。DOT_SIZE是苹果的大小和蛇的圆点。该ALL_DOTS常数定义了板上可能的最大点数 (900 = (300*300)/(10*10))。该RAND_POS 常数用于计算苹果的随机位置。DELAY常数决定了游戏的速度 。
私有最终 int x[] = new int[ALL_DOTS];
私有最终 int y[] = new int[ALL_DOTS];
这两个数组存储蛇所有关节的 x 和 y 坐标。
私人无效加载图像(){
ImageIcon iid = new ImageIcon("src/resources/dot.png");
球 = iid.getImage();
ImageIcon iia = new ImageIcon("src/resources/apple.png");
苹果 = iia.getImage();
ImageIcon iih = new ImageIcon("src/resources/head.png");
头 = iih.getImage();
}
在该loadImages()方法中,我们获取游戏的图像。该类ImageIcon用于显示 PNG 图像。
私人无效初始化游戏(){
点 = 3;
for (int z = 0; z < 点; z++) {
x[z] = 50 - z * 10;
y[z] = 50;
}
定位苹果();
计时器 = 新计时器(延迟,此);
计时器.start();
}
在initGame()我们创建蛇的方法中,在板上随机定位一个苹果,然后启动计时器。
私人无效检查苹果(){
if ((x[0] == apple_x) && (y[0] == apple_y)) {
点++;
定位苹果();
}
}
如果苹果撞到头部,我们增加蛇的关节数。我们调用locateApple()随机定位新苹果对象的方法。
在move()方法中我们有游戏的关键算法。要理解它,看看蛇是如何移动的。我们控制了蛇的头。我们可以用光标键改变它的方向。其余关节沿链条向上移动一个位置。第二个关节移动到第一个关节的位置,第三个关节移动到第二个关节的位置,依此类推。
for (int z = 点; z > 0; z--) {
x[z] = x[(z - 1)];
y[z] = y[(z - 1)];
}
此代码将关节沿链向上移动。
如果(左方向){
x[0] -= DOT_SIZE;
}
这条线将头部向左移动。
在该checkCollision()方法中,我们确定蛇是撞到自己还是撞到了一堵墙。
for (int z = 点; z > 0; z--) {
if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z])) {
游戏内=假;
}
}
如果蛇用头撞到它的一个关节,游戏就结束了。
如果(y[0] >= B_HEIGHT){
游戏内=假;
}
如果蛇击中棋盘底部,则游戏结束。
包 com.zetcode;
导入 java.awt.EventQueue;
导入 javax.swing.JFrame;
公共类蛇扩展 JFrame {
公共蛇(){
初始化界面();
}
私人无效initUI(){
添加(新板());
可调整大小(假);
盒();
setTitle("蛇");
setLocationRelativeTo(null);
设置默认关闭操作(JFrame.EXIT_ON_CLOSE);
}
公共静态无效主要(字符串[]参数){
EventQueue.invokeLater(() -> {
JFrame ex = new Snake();
ex.setVisible(true);
});
}
}
这是主要编程。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习