package com.wuzihao.snake;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.Timer;
import java.util.TimerTask;
public class MainFrame extends JFrame {
private Snake snake;
private Timer timer;
private JPanel jPanel;
private Node food;
public MainFrame() throws HeadlessException {
initFrame();
initGamePanel();
//初始化蛇
initSnake();
//设置定时器,让蛇在定时时间内移动
initTimer();
//初始化食物
initFood();
//设置键盘监听时间
setKeyListener();
}
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 initFood() {
food=new Node();
food.random();
}
private void initTimer() {
this.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();
}
};
//每100毫秒,执行一次监听事件
timer.scheduleAtFixedRate(timerTask,0,100);
}
private void initSnake() {
this.snake = new Snake();
}
private void initGamePanel(){
jPanel = new JPanel(){
@Override
public void paint(Graphics g) {
//清空棋盘
g.clearRect(0,0,600,600);
//绘制横线
for (int i = 0; i <= 40; i++) {
g.drawLine(0,i*15,600,i*15);
}
//绘制竖线
for (int i = 0; i <= 40; i++) {
g.drawLine(i*15,0,i*15,600);
}
//绘制蛇
LinkedList<Node> body = snake.getBody();
for (Node node : body) {
g.fillRect(node.getX()*15,node.getY()*15,15,15);
}
//绘制食物
g.fillRect(food.getX()*15,food.getY()*15,15,15);
}
};
this.add(jPanel);
}
private void initFrame(){
this.setSize(615,610);
this.setLocation(250,10);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setBackground(new Color(245, 206, 206));
}
public static void main(String[] args) {
new MainFrame();
}
}
小码叔
- 粉丝: 5170
- 资源: 5328
最新资源
- 毕设和企业适用springboot人工智能客服系统类及文化旅游信息平台源码+论文+视频.zip
- 毕设和企业适用springboot企业协作平台类及数字货币管理平台源码+论文+视频.zip
- 毕设和企业适用springboot区域电商平台类及企业创新研发平台源码+论文+视频.zip
- 毕设和企业适用springboot区域电商平台类及企业供应链平台源码+论文+视频.zip
- 毕设和企业适用springboot区域电商平台类及企业级API管理平台源码+论文+视频.zip
- 毕设和企业适用springboot人工智能客服系统类及线上文件管理系统源码+论文+视频.zip
- 毕设和企业适用springboot人工智能客服系统类及虚拟银行平台源码+论文+视频.zip
- 毕设和企业适用springboot人工智能客服系统类及物流管理平台源码+论文+视频.zip
- 毕设和企业适用springboot区域电商平台类及汽车信息管理平台源码+论文+视频.zip
- 毕设和企业适用springboot区域电商平台类及区块链平台源码+论文+视频.zip
- 毕设和企业适用springboot区域电商平台类及全流程管理平台源码+论文+视频.zip
- 毕设和企业适用springboot人工智能客服系统类及智能城市数据管理平台源码+论文+视频.zip
- 毕设和企业适用springboot人工智能客服系统类及用户行为分析平台源码+论文+视频.zip
- 毕设和企业适用springboot人工智能客服系统类及智能配送系统源码+论文+视频.zip
- 毕设和企业适用springboot区域电商平台类及实时通信平台源码+论文+视频.zip
- 毕设和企业适用springboot区域电商平台类及全渠道电商平台源码+论文+视频.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈