java写贪吃蛇

代码下载

最近学习了Java的贪吃蛇的制作方法,重新回顾了一下Java的窗口知识,下面就讲一下它的流程吧:

一、首先创建并设置窗口的属性:



 然后设置窗口是显示出来的:



 二、窗口创建完成后就要在窗口加一个画布:



 并添加画布基本属性:



 在main方法中调用



 加入图片装饰

 

三、画布完成后就要设置蛇的初始化状态

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
/**
 * Created by Taoyongpan on 2017/3/23.
 */
public class SnakePanel extends JPanel implements KeyListener,ActionListener{

    ImageIcon body = new ImageIcon("img/body.png");
ImageIcon food = new ImageIcon("img/food.png");
ImageIcon title = new ImageIcon("img/title.jpg");
ImageIcon up = new ImageIcon("img/up.png");
ImageIcon down = new ImageIcon("img/down.png");
ImageIcon left = new ImageIcon("img/left.png");
ImageIcon right = new ImageIcon("img/right.png");
    int[] snakex = new int[750];
    int[] snakey = new int[750];
//随机产生食物
Random random = new Random();
    int foodx = random.nextInt(34)*25+25;
    int foody = random.nextInt(24)*25+75;
//贪吃蛇长度
int len = 3;
//得分
int score = 0;
//贪吃蛇速度
int speed = 0;
//贪吃蛇方向
String fangxiang = "R";//R向右,L向左,U向上,D向下
//默认游戏为不开始
boolean isStarted = false;
//判断游戏是否结束
boolean isFailed = false;
Timer timer = new Timer(100,this);
//重新构造
public SnakePanel(){
        //获得焦点
this.setFocusable(true);
//添加键盘监听
this.addKeyListener(this);
setup();
timer.start();
}

    public void paint(Graphics g){
        //调用paint方法
super.paint(g);
        this.setBackground(Color.WHITE);
title.paintIcon(this,g,25,11);
//画一个方框
g.fillRect(25,75,850,600);
//画蛇头
if(fangxiang.equals("R")){
            right.paintIcon(this,g,snakex[0],snakey[0]);
}else if(fangxiang.equals("L")){
            left.paintIcon(this,g,snakex[0],snakey[0]);
}else if(fangxiang.equals("U")){
            up.paintIcon(this,g,snakex[0],snakey[0]);
}else if(fangxiang.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/Stop",300,300);
}
        //设置失败时候的提示语句
if (isFailed){
            g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.BOLD,30));
g.drawString("Game over,Press Space to ReStart",300,300);
}
        //添加食物
food.paintIcon(this,g,foodx,foody);
g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.PLAIN,20));
g.drawString("Score:"+score,750,30);
g.drawString("Length:"+len,750,50);
}
    //初始化蛇
public void setup(){

        isFailed = false;
isStarted = false;
len = 3;
//默认方向为R
fangxiang = "R";
snakex[0] = 100;
snakey[0] = 100;
snakex[1] = 75;
snakey[1] = 100;
snakex[2] = 50;
snakey[2] = 100;
}

    //在源组件上按下一个键然后释放该键后被调用
@Override
public void keyTyped(KeyEvent e) {

    }
    //在源组件上按下一个键后被调用
@Override
public void keyReleased(KeyEvent e) {

    }

    // 在源组件上释放一个键后被调用
@Override
public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
//敲空格键
/**
         * VK_HOME         HomeVK_CONTROL                  控制键
VK_END            EndVK_SHIFT                       shiftVK_PGUP          page upVK_BACK_SPACE             退格键
VK_PGDN          page downVK_CAPS_LOCK              大小写锁定键
VK_UP              上箭头                        VK_NUM_LOCK                小键盘锁定键
VK_DOWN         下箭头                           VK_ENTER                      回车键
VK_LEFT           左箭头                         VK_UNDEFINED                未知键
VK_RIGHT          右箭头                         VK_F1--VK_F12                F1 -- F12
           VK_ESCAPE       EscVK_0 --VK_9                    0 --- 9
           VK_TAB             TabVK_A --VK_Z                    A----Z
         */
if(keyCode == KeyEvent.VK_SPACE){
            if (isFailed)
            {
                setup();
}else {
                isStarted = !isStarted;
}
            repaint();
}else if (keyCode == KeyEvent.VK_UP && fangxiang != "D"){
            fangxiang = "U";
}else if (keyCode == KeyEvent.VK_DOWN&& fangxiang != "U"){
            fangxiang = "D";
}else if (keyCode == KeyEvent.VK_LEFT&& fangxiang != "R"){
            fangxiang = "L";
}else if (keyCode == KeyEvent.VK_RIGHT&& fangxiang != "L"){
            fangxiang = "R";
}
    }

    //就像一个闹钟一样
/**
     * 这是一个事件监听器,可以处理类似单击鼠标时触发的事件
* ActionEvent就是一个事件类,传入的e就是该事件的对象
* @param e
*/
@Override
public void actionPerformed(ActionEvent e) {
        //再定义一个闹钟
timer.start();
//移动数据
if(isStarted&&!isFailed){
            //移动身体
for (int i = len ; i > 0 ; i--){
                snakex[i] = snakex[i-1];
snakey[i] = snakey[i-1];
}
            //移动头
if(fangxiang.equals("R")){
                snakex[0] = snakex[0] + 25;
                if (snakex[0] >850){
                    isFailed = true;
//snakex[0] = 25;
}
            }else if(fangxiang.equals("L")){
                snakex[0] = snakex[0] - 25;
                if (snakex[0] < 25){
                    //snakex[0] = 850;
isFailed = true;
}
            }else if(fangxiang.equals("U")){
                snakey[0] = snakey[0] - 25;
                if (snakey[0] <75 ){
                    //snakey[0] = 650;
isFailed = true;
}
            }else if(fangxiang.equals("D")){
                snakey[0] = snakey[0] + 25;
                if(snakey[0] > 650){
                    //snakey[0] = 75;
isFailed = true;
}
            }
            if(snakex[0] == foodx&&snakey[0] == foody){
                len++;
score++;
foodx = random.nextInt(34)*25+25;
foody = random.nextInt(24)*25+75;
}
            for (int i= 1;i<len;i++){
                if (snakex[0] == snakex[i] && snakey[0] == snakey[i]) {
                    isFailed = true;
}
            }
        }
        //repaint()
repaint();
}
}

好的,以下是一个简单的Java贪吃蛇游戏的代码示例: ```java import java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.ArrayList; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPanel; public class SnakeGame extends JPanel implements Runnable, KeyListener { private static final long serialVersionUID = 1L; private static final int WIDTH = 500; private static final int HEIGHT = 500; private Thread thread; private boolean running; private boolean right = true, left = false, up = false, down = false; private BodyPart b; private ArrayList<BodyPart> snake; private int xCoor = 10, yCoor = 10, size = 5; private int ticks = 0; private Point apple; private Random random; private int score; public SnakeGame() { setFocusable(true); addKeyListener(this); setPreferredSize(new Dimension(WIDTH, HEIGHT)); random = new Random(); snake = new ArrayList<BodyPart>(); start(); } public void start() { running = true; thread = new Thread(this); thread.start(); } public void stop() { running = false; try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } public void tick() { if (snake.size() == 0) { b = new BodyPart(xCoor, yCoor, 10); snake.add(b); } ticks++; if (ticks > 250000) { if (right) xCoor++; if (left) xCoor--; if (up) yCoor--; if (down) yCoor++; ticks = 0; b = new BodyPart(xCoor, yCoor, 10); snake.add(b); if (snake.size() > size) { snake.remove(0); } } if (apple != null) { if (xCoor == apple.x && yCoor == apple.y) { size++; score++; apple.setLocation(random.nextInt(49) * 10, random.nextInt(49) * 10); } } else { apple = new Point(random.nextInt(49) * 10, random.nextInt(49) * 10); } for (int i = 0; i < snake.size(); i++) { if (xCoor == snake.get(i).getxCoor() && yCoor == snake.get(i).getyCoor()) { if (i != snake.size() - 1) { stop(); } } } if (xCoor < 0 || xCoor > 49 || yCoor < 0 || yCoor > 49) { stop(); } } public void paint(Graphics g) { g.clearRect(0, 0, WIDTH, HEIGHT); g.setColor(Color.BLACK); g.fillRect(0, 0, WIDTH, HEIGHT); g.setColor(Color.WHITE); g.drawString("Score: " + score, 10, 20); for (int i = 0; i < snake.size(); i++) { snake.get(i).draw(g); } g.setColor(Color.RED); g.fillRect(apple.x, apple.y, 10, 10); g.setColor(Color.WHITE); g.drawRect(0, 0, WIDTH - 1, HEIGHT - 1); } public void run() { while (running) { tick(); repaint(); } } public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_RIGHT && !left) { right = true; up = false; down = false; } if (key == KeyEvent.VK_LEFT && !right) { left = true; up = false; down = false; } if (key == KeyEvent.VK_UP && !down) { up = true; left = false; right = false; } if (key == KeyEvent.VK_DOWN && !up) { down = true; left = false; right = false; } } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {} public static void main(String[] args) { JFrame frame = new JFrame(); SnakeGame snakeGame = new SnakeGame(); frame.add(snakeGame); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("Snake Game"); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } } class BodyPart { private int xCoor, yCoor, width, height; public BodyPart(int xCoor, int yCoor, int tileSize) { this.xCoor = xCoor; this.yCoor = yCoor; width = tileSize; height = tileSize; } public void tick() {} public void draw(Graphics g) { g.setColor(Color.GREEN); g.fillRect(xCoor * width, yCoor * height, width, height); } public int getxCoor() { return xCoor; } public void setxCoor(int xCoor) { this.xCoor = xCoor; } public int getyCoor() { return yCoor; } public void setyCoor(int yCoor) { this.yCoor = yCoor; } } ``` 这个代码中,我们用到了Java的Swing库来创建游戏窗口和绘制游戏界面。SnakeGame类继承了JPanel类,并实现了Runnable和KeyListener接口。在start()方法中,我们启动了一个新的线程来运行游戏逻辑。在tick()方法中,我们处理了蛇的移动、吃苹果、撞墙、碰到自己等情况,并更新游戏状态。在paint()方法中,我们绘制了游戏界面。在keyPressed()方法中,我们处理了用户的方向键输入,并更新蛇的移动方向。最后,在main()方法中,我们创建了一个JFrame对象,并将SnakeGame添加到其中,然后显示窗口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值