本人纯纯java入门,目前所发文章大部分参考其他大佬文章或视频所写
-----文章少文字,纯代码--------
-----有问题欢迎私信--------------
import javax.swing.*;
import java.awt.*;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.TimerTask;
import java.util.Timer;
public class MainFrame extends JFrame {
//蛇
private Snake snake;
private JPanel jPanel;
private Timer timer;//定时器,在指定的时间调用蛇移动的方法
private Node food;//食物
public MainFrame() throws HeadlessException {
//初始化窗体参数
initFrame();
//初始化游戏棋盘
initGamePanel();
//食物
initFood();
//初始化蛇
initSnake();
//初始化定时器
initTimer();
//设置键盘监听
setKeyListener();
}
private void initFood(){
food=new Node();
food.random();
}
private void setKeyListener(){
addKeyListener(new KeyAdapter() {
//当键盘按下时,会自动调用此方法
@Override
public void keyPressed(KeyEvent e){
//键盘中的每一个键都有一个编号
switch (e.getKeyCode()){
case KeyEvent.VK_UP :
if(snake.getDirection()!=Direction.DOWN){
//修改蛇的运动方向
snake.setDirection(Direction.UP);
}
break;
case KeyEvent.VK_DOWN:
if(snake.getDirection()!=Direction.UP) {
snake.setDirection(Direction.DOWN);
}
break;
case KeyEvent.VK_LEFT:
if(snake.getDirection()!=Direction.RIGHT) {
snake.setDirection(Direction.LEFT);
}
break;
case KeyEvent.VK_RIGHT:
if(snake.getDirection()!=Direction.LEFT) {
snake.setDirection(Direction.RIGHT);
}
break;
}
}
});
}
//初始化定时器
private void initTimer(){
timer =new Timer();
//初始化定时任务
TimerTask timerTask=new TimerTask() {
@Override
public void run() {
snake.move();
//判断蛇头是否和食物重合
Node head=snake.getBody().getFirst();
if(head.getX()== food.getX()&&head.getY()==food.getY()){
snake.eat(food);
food.random();
}
//重绘游戏棋盘
jPanel.repaint();
}
};
//每100ms,执行一次定时任务
timer.scheduleAtFixedRate(timerTask,0,100);
}
public static void main(String[] args) {
//创建窗体对象,并显示
new MainFrame().setVisible(true);
}
private void initSnake() {
snake = new Snake();
}
private void initGamePanel() {
jPanel=new JPanel(){
//Graphics g 可以看成一支画笔(绘制一些基本的图形)
@Override
public void paint(Graphics g) {
//清空棋盘
g.clearRect(0,0,600,600);
//绘制40条横线
for (int i = 0; i <=40; i++) {
g.drawLine(0, i * 15, 600, i * 15);
g.setColor(Color.WHITE);
}
//绘制40条竖线
for (int i = 0; i <= 40; i++) {
g.drawLine(i * 15, 0, i * 15, 600);
g.setColor(Color.WHITE);
}
//绘制蛇
LinkedList<Node> body = snake.getBody();
for(Node node:body){
g.fillRect(node.getX()*15, node.getY()*15,15,15 );
g.setColor(Color.BLACK);
}
//绘制食物
g.fillRect(food.getX()*15, food.getY()*15,15,15 );
}
};
//把棋盘加入到窗体中
add(jPanel);
}
//初始化窗体参数
private void initFrame() {
//设置窗体宽高
setSize(618, 640);
//设置窗体的位置
setLocation(400, 400);
//设置关闭按钮的作用()退出程序
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗体大小可变
setResizable(false);
}
}
采用节点类绘制蛇
/*节点类:
每一条蛇是由若干个节点组成的,每一个节点有横坐标来确定位置
* */
public class Node {
private int x;
private int y;
public Node(){
}
public Node(int x,int y){
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;
}
//随机生成位置的方法
public void random(){
//创建一个random对象
Random r=new Random();
//随机生成横坐标
this.x=r.nextInt(40);
//随机生成纵坐标
this.y=r.nextInt(40);
}
}
采用枚举确定方向
/*枚举:就是几个固定的常量*/
public enum Direction {
UP,DOWN,LEFT,RIGHT
}
蛇类
/*Snake类表示蛇:
一条蛇有多个节点使用LinkedList集合存储Node节点,蛇出生时有9个节点
*/
public class Snake {
//body
private LinkedList<Node>body;
//蛇的运动方向,默认向左
private Direction direction=Direction.LEFT;
//蛇是否活着
private boolean isLiving=true;
public Snake (){
//初始化蛇
initSnake();
}
private void initSnake(){
//创建结合
body=new LinkedList<>();
//创建9个节点
body.add(new Node(10,20));
body.add(new Node(11,20));
body.add(new Node(12,20));
body.add(new Node(13,20));
body.add(new Node(14,20));
body.add(new Node(15,20));
body.add(new Node(16,20));
body.add(new Node(17,20));
body.add(new Node(18,20));
}
//蛇沿着头部方向运动
//控制蛇的移动:在蛇头的运动方向添加一个节点,然后把蛇尾的节点删除
public void move() {
if (isLiving) {
//获取蛇头
Node head = body.getFirst();
switch (direction) {
case UP:
body.addFirst(new Node(head.getX(), head.getY() - 1));
break;
case DOWN:
body.addFirst(new Node(head.getX(), head.getY() + 1));
break;
case LEFT:
body.addFirst(new Node(head.getX() - 1, head.getY()));
break;
case RIGHT:
body.addFirst(new Node(head.getX() + 1, head.getY()));
break;
}
//删除最后的节点
body.removeLast();
//判断蛇是否撞墙
head=body.getFirst();
if(head.getX()<0||head.getY()<0||head.getX()>=40||head.getY()>=40){
isLiving=false;
}
//判断蛇是否碰到自己的身体
for(int i=1;i<body.size();i++){
Node node=body.get(i);
if(head.getX()== node.getX()&&head.getY()== node.getY()){
isLiving=false;
}
}
}
else{
}
}
public LinkedList<Node> getBody() {
return body;
}
public void setBody(LinkedList<Node> body) {
this.body = body;
}
public Direction getDirection() {
return direction;
}
public void setDirection(Direction direction) {
this.direction = direction;
}
//蛇吃食物:沿着蛇的移动方向添加一个节点
public void eat(Node food) {
Node head = body.getFirst();
switch (direction) {
case UP:
body.addFirst(new Node(head.getX(), head.getY() - 1));
break;
case DOWN:
body.addFirst(new Node(head.getX(), head.getY() + 1));
break;
case LEFT:
body.addFirst(new Node(head.getX() - 1, head.getY()));
break;
case RIGHT:
body.addFirst(new Node(head.getX() + 1, head.getY()));
break;
}
}
}