swing贪吃蛇

一、容器类

package com.entity;

import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JPanel;

public class MyJPanel extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
// 记录已有点坐标
private ArrayList<PointDect> arr = new ArrayList<PointDect>();
// 当前可吃点
private PointDect nowp = null;
private Random r = new Random();
// 初始化蛇头位置
public static int initx = 20, inity = 0;
// 初始化移动方向 0 1 2 3
private int driect = 2;

// 初始化3个组成蛇身
// 初始化一个可吃点
{
arr.add(new PointDect(initx, inity));
arr.add(new PointDect(initx - PointDect.WIDTH, inity));
arr.add(new PointDect(initx - 2 * PointDect.WIDTH, inity));
nowp = new PointDect(((r.nextInt(MyJFrame.JW - PointDect.WIDTH) + 9) / 10) * 10,
((r.nextInt(MyJFrame.JH - PointDect.HEIGHT) + 9) / 10) * 10);
}

public MyJPanel() {
}

// 添加点
public void addPoint() {
nowp = new PointDect(((r.nextInt(MyJFrame.JW - PointDect.WIDTH) + 9) / 10) * 10,
((r.nextInt(MyJFrame.JH - PointDect.HEIGHT) + 9) / 10) * 10);
}

// 判断蛇头和点相碰
public boolean judgePoint() {
if (arr.get(0).getX() == nowp.getX() && arr.get(0).getY() == nowp.getY()) {
arr.add(nowp);
nowp = null;
return true;
}
return false;
}

// 判断游戏是否结束
private boolean judgeGame() {
if ((arr.get(0).getX() >= MyJFrame.JW - PointDect.WIDTH || arr.get(0).getX() < 0)
|| (arr.get(0).getY() >= MyJFrame.JW - PointDect.HEIGHT || arr.get(0).getY() < 0)) {
return true;
} else {
for (int i = 1; i < arr.size(); i++) {
if ((arr.get(0).getX() == arr.get(i).getX() && arr.get(0).getY() == arr.get(i).getY())) {
return true;
}
}
}
return false;
}

// 移动蛇
public boolean snakeMove() {
int cx = 0;
int cy = 0;
int movex = 0, movey = 0;
switch (driect) {
case 0:
cx = -PointDect.M;
cy = 0;
break;
case 1:
cx = 0;
cy = -PointDect.M;
break;
case 2:
cx = PointDect.M;
cy = 0;
break;
case 3:
cx = 0;
cy = PointDect.M;
break;
}
movex = arr.get(0).getX() + cx;
movey = arr.get(0).getY() + cy;
arr.get(0).setX(movex);
arr.get(0).setY(movey);
boolean flag = judgeGame();
if (!flag) {
for (int i = arr.size() - 1; i > 0; i--) {
arr.get(i).setX(arr.get(i - 1).getX());
arr.get(i).setY(arr.get(i - 1).getY());
}
this.repaint();
}
return flag;
}

@Override
public void paint(Graphics g) {
super.paint(g);
for (int i = 0; i < arr.size(); i++) {
g.fillRect(arr.get(i).getX(), arr.get(i).getY(), PointDect.WIDTH, PointDect.HEIGHT);
}
if (nowp != null) {
g.fillRect(nowp.getX(), nowp.getY(), PointDect.WIDTH, PointDect.HEIGHT);
}
}

public int getDriect() {
return driect;
}

public void setDriect(int driect) {
this.driect = driect;
}
}

二、蛇组成类

package com.entity;

public class PointDect {
//蛇每个组成部分的宽高
public static final int WIDTH = 10, HEIGHT = 10;
//蛇每次的移动量
public static final int M=10;
//每个组成部分的x,y坐标
private int x;
private int y;

public PointDect() {
super();
}

public PointDect(int x, int y) {
super();
this.x = x;
this.y = y;
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

public int getY() {
return y;
}

public void setY(int y) {
this.y = y;
}
}

三、运行类

package com.entity;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class MyJFrame extends JFrame {
public static final int JW = 500, JH = 500;
/**
*
*/
private static final long serialVersionUID = 1L;
private static MyJPanel jp = null;

public MyJFrame() {
this.setTitle("贪吃蛇");
this.setSize(500, 500);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jp = new MyJPanel();
this.add(jp);
this.setVisible(true);
}

@SuppressWarnings("static-access")
public static void main(String[] args) throws InterruptedException {
MyJFrame my = new MyJFrame();
boolean flag=false;
my.addKeyListener(new KeyListener() {

@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyReleased(KeyEvent e) {
}

@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP&&jp.getDriect()!=3) {
jp.setDriect(1);
}
if (e.getKeyCode() == KeyEvent.VK_DOWN&&jp.getDriect()!=1) {
jp.setDriect(3);
}
if (e.getKeyCode() == KeyEvent.VK_LEFT&&jp.getDriect()!=2) {
jp.setDriect(0);
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT&&jp.getDriect()!=0) {
jp.setDriect(2);
}
}
});
while(true){
Thread.currentThread().sleep(100);
flag=jp.snakeMove();
if(flag){
break;
}
flag=jp.judgePoint();
if(flag){
jp.addPoint();
}
}
}
}

时间: 2024-08-28 05:36:07

swing贪吃蛇的相关文章

用Java开发贪吃蛇游戏

贪吃蛇游戏的设计步骤: Part 1: 设计游戏图纸 画出900*700的白色窗口 在窗口上添加画布 在画布上添加标题 在画布上添加黑色游戏区 Part 2: 放置静态的蛇:一个头.两个身体 加上开始提示:按空格键开始游戏 让蛇动起来:监听Timer事件,平移数据 实现游戏暂停 实现转向功能 Part 3: 添加食物 吃掉食物 添加死亡条件 实现“重新开始”功能 添加分数和长度 游戏图纸如下: 蛇及游戏框的素材如下:                              Snake主类: 1

Java小游戏贪吃蛇

package snake; import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Color;import java.awt.Container;import java.awt.Graphics;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.util.Arrays;import java.util.Itera

java 简单贪吃蛇

说了是简单版贪吃蛇... 就3个类+方向枚举变量(本来想写贪吃蛇斜着走的..想象我的蛇是矩形 斜着难看就没写) 上下左右键控制移动 空格暂停 SnackClient类 package com.xynu.snaker; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListene

[Java第一个游戏]JFrame文本框下贪吃蛇

刚刚接触java的文本框绘图的知识点,然后就可以按照老师的提醒做一些简单的游戏,对JFrame加深一下,下面就贪吃蛇给出一些源代码,其实正真的实现的代码并不多,只是稍微处理一下就可以明白,下面代码均有注释! 第一个类shake类 import java.awt.Color; import java.awt.Graphics; import java.util.Random; public class Snake { public int w;//半径 public int x , y;//球心坐

贪吃蛇(二维数组)

这是我思考了一天的游戏,错过了两节课,心痛啊,总用时2个星期,感动!!! import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JButton; import javax.sw

贪吃蛇的java代码分析(二)

代码剖析 贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的.下面我将依照我当时的思路,来逐步分析实现的整个过程. 让我们逐一分析.首先,整个游戏最基本的元素是地图.在java中用于绘图的类是swing和awt,在这里主要用到swing类.swing中用于窗口显示的类有JFrame及其子类.JFrame可以直接添加组件,但其本质是将组件添加到JFrame中的一个默认面板里,为了代码清晰,我会使用JPanel

java贪吃蛇

这个贪吃蛇有很多功能没有实现,比如说穿墙(本来可以实现,但是穿墙后,就会出现坐标混乱,吃不到食物了),还有碰到自己的身体死亡的情况也没有实现,现在我知道如何判断是否碰到身体,但是,我不知道,如何处理碰到身体后的情况.这些问题我想过段时间去解决. 1 import java.awt.Color; 2 import java.awt.event.KeyAdapter; 3 import java.awt.event.KeyEvent; 4 import java.util.LinkedList; 5

贪吃蛇 游戏

结队作业  结队人 郑丁鹏(负责 (二)流程图和(四)游戏测试 ) 我负责 (二)游戏需求分析 与(三)游戏代码 贪吃蛇游戏程序设计 一.基本内容描述 运用java技术开发出贪吃蛇游戏,这个程序是用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块.移动时必须从蛇头开始,也就是蛇尾不能改作蛇头.当游戏者按了方向键后,蛇头朝着指定的方向移动,一步移动一节身体.图形的实现是从蛇头的新位置开始画出蛇.用户可以用上下左右键控制蛇头的方向,用空格键暂停或继续,非常简单! 可以实现如下功能: 贪吃蛇游

贪吃蛇单机版

1 package greedySnaker; 2 3 import java.awt.Graphics; 4 import java.util.LinkedList; 5 6 /** 7 * 蛇类 8 * @author 俊霖 9 * 10 */ 11 public class Snake { 12 private Direction dir = Direction.LEFT; 13 private LinkedList<SnakeNode> list = new LinkedList<