吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1694|回复: 19
收起左侧

[Java 原创] 在自学java的时候,自己写的贪吃蛇(bug很多)

[复制链接]
ZZZHW 发表于 2023-3-18 18:04
本帖最后由 苏紫方璇 于 2023-3-19 11:21 编辑

直接上源码  
新人发帖
格式有点不会


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;
                                //extends 继承                implements 实现接口    KeyListener是一个接口
public class MPanel extends JPanel        implements KeyListener,ActionListener{
        //加载标题图片
        ImageIcon title = new ImageIcon("title.jpg");
        //加载上,下,左,右的头部图片
        ImageIcon head_R = new ImageIcon("head-R.jpg");
        ImageIcon head_L = new ImageIcon("head-L.jpg");
        ImageIcon head_U = new ImageIcon("head-U.jpg");
        ImageIcon head_D = new ImageIcon("head-D.jpg");
        //加载身体图片
        ImageIcon body = new ImageIcon("body.jpg");        
        //定义一个初始化蛇的长度len 初始化为3
                ImageIcon food = new ImageIcon("food.jpg");        
                int len = 3;
                int Score = 0;
        //定义两个数组,snakex为蛇的行坐标  snakey为蛇的纵坐标
                int[] snakex = new int[750];
                int[] snakey = new int[750];
        //定义蛇的方向为 R,L,U,D
                String fx = "R";

        boolean isStarted = false;      //判断游戏是否开始
        boolean isAlive = true;      //判断蛇是否死亡
        Timer timer = new Timer(100,this);  //加上闹钟  蛇前进的速度
        //添加食物
        int foodx;
        int foody;
        Random ra = new Random();
        //构造方法        
        public MPanel() {
                initSnake();
                //将自己设置为监听器
                this.setFocusable(true);
                this.addKeyListener(this);
                timer.start();

        }
        //方法   利用了Graohics来创建了一块绿色的画布
        public void paintComponent(Graphics g) {
                super.paintComponent(g);
                this.setBackground(Color.GREEN);
                //标题图片的位置
                title.paintIcon(this, g, 25, 11);
                //标题上添加分数和长度
                g.drawString("len:"+len, 750, 35);
                g.drawString("Score"+Score, 750, 50);
                //在画布上设置游戏区
                g.fillRect(25, 75, 850, 600);
                //放入一个静态的蛇
                //控制蛇头的方向
                if(fx == "R") {
                        head_R.paintIcon(this, g, snakex[0], snakey[0]);
                }else if(fx == "L") {
                        head_L.paintIcon(this, g, snakex[0], snakey[0]);
                }else if(fx == "U") {
                        head_U.paintIcon(this, g, snakex[0], snakey[0]);
                }else if(fx == "D") {
                        head_D.paintIcon(this, g, snakex[0], snakey[0]);
                }

                food.paintIcon(this, g, foodx, foody);

                //蛇的身体会根据吃食物而增加
                for(int i = 1;i<len;i++) {
                        body.paintIcon(this,g,snakex[i],snakey[i]);

                        //放上开始提示
                if(isStarted == false) {
                        g.setColor(Color.WHITE);
                        g.setFont(new Font("arial",Font.BOLD,40));
                        g.drawString("Press Space to Start", 266, 350);
                        }
                        //放上结束提示
                if(!isAlive) {
                        g.setColor(Color.BLUE);
                        g.setFont(new Font("arial",Font.BOLD,40));
                        g.drawString("GAME OVER:Press Space to Start", 100, 350);
                        }
                }
        }
        //这个方法作为初始化 蛇刚刚开始的状态
        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*ra.nextInt(34);
                foody = 75 + 25*ra.nextInt(24);
                fx = "R";
                Score = 0;

        }
        @Override
        public void keyTyped(KeyEvent e) {               
        }
        @Override
        //当按下空格建时,isStarted这个变量为true  
        //repaint() 这个方法指重新绘出   重新在执行一遍
        public void keyPressed(KeyEvent e) {
                int keycode = e.getKeyCode();
                if(keycode == KeyEvent.VK_SPACE) {
                        if(!isAlive) {
                                isAlive = true;
                        }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 keyReleased(KeyEvent e) {

        }
        @Override
        public void actionPerformed(ActionEvent e) {
                if(isStarted && isAlive) {
                        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) {snakex[0] = 25;}
                        }else if(fx == "L") {
                                snakex[0] = snakex[0]-25;
                                if(snakex[0] < 25) {snakex[0] = 850;}
                        }else if(fx == "U") {
                                snakey[0] = snakey[0]-25;
                                if(snakey[0] < 75) {snakey[0] = 650;}
                        }else if(fx == "D") {
                                snakey[0] = snakey[0]+25;
                                if(snakey[0] > 650) {snakey[0] = 75;}
                        }
                        //吃掉食物
                        if(snakex[0] == foodx && snakey[0] == foody) {
                                len++;
                                Score+=10;
                                foodx = 25 + 25*ra.nextInt(34);
                                foody = 75 + 25*ra.nextInt(24);

                                switch(fx){
                                        case "D":
                                        case "U":

                                }
                        }
                        //死亡
                        for(int i = 1;i<len;i++) {
                                if(snakex[i] ==snakex[0] && snakey[i] ==snakey[0]) {
                                        isAlive = false;
                                        initSnake();
                                }
                        }

                                repaint();
                }

                timer.start();

}
}
Snipaste_2023-03-18_18-01-45.png

免费评分

参与人数 4吾爱币 +9 热心值 +2 收起 理由
xuanyue2003 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
JinxBoy + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Seven777777 + 1 我很赞同!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| ZZZHW 发表于 2023-3-20 14:27
linchaojian 发表于 2023-3-20 14:02
学了半年java居然不会运行

不好意思,补充一下启动类
[Java] 纯文本查看 复制代码
import javax.swing.JFrame;

public class Msnake {
	public static void main(String[] args) {
		//创建一个900*700的窗口
		JFrame frame = new JFrame();//创建对象
		frame.setBounds(20, 20, 915, 720);
		//使用JFrame中的setBounds   可以设置一个窗口的位置和大小  x,y,width,height
		frame.setResizable(false);
		//JFrame中的setResizable    可以设置此窗口是否可以由用户设置大小
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//是否可以关闭
		frame.add(new MPanel());
		//
		frame.setVisible(true);
		//是否显示该窗体
	}

}
苏紫方璇 发表于 2023-3-19 11:21
帮你改了一下
贴代码格式可以参考这个帖子
【公告】发帖代码插入以及添加链接教程(有福利)
https://www.52pojie.cn/thread-713042-1-1.html
(出处: 吾爱破解论坛)
youziyyds 发表于 2023-3-18 21:00
xc0102 发表于 2023-3-19 10:52
佬啊牛啊牛啊,现在就学了一些基本的框架,都不知道往哪边学习了
DIOSam 发表于 2023-3-19 12:32
太强了大佬
Suyifengchen 发表于 2023-3-19 16:57
很强,大佬
JXH285 发表于 2023-3-19 20:32
刚好在学习java,太强了
sima2008 发表于 2023-3-19 21:55
佬啊牛啊牛啊,现在就学了一些基本的框架,都不知道往哪边学习了。请大佬收下我的膝盖!
 楼主| ZZZHW 发表于 2023-3-20 09:33
苏紫方璇 发表于 2023-3-19 11:21
帮你改了一下
贴代码格式可以参考这个帖子
【公告】发帖代码插入以及添加链接教程(有福利)

感谢大佬  十分感谢
sakichan 发表于 2023-3-20 11:06
膜拜大佬,不错不错
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 16:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表