贪吃蛇
package com.Gui.snake;
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;
public class GamePanel extends JPanel implements KeyListener, ActionListener {
int length ;//长度
//小蛇每一节身体的坐标
int[] snakeX = new int[600];
int[] snakeY = new int[600];
//小蛇朝向
String direction = "R";//R右 L左 D下 U上
//是否开始
boolean isStart = false;
//移动计时器
Timer timer = new Timer(100,this);//100ms刷新一次
//随机数
Random random = new Random();
//食物的坐标
int foodX,foodY;
//是否失败
boolean isFale = false;
int score;//分数
public GamePanel(){
init();
this.setFocusable(true);
this.addKeyListener(this);
//食物随机出现
foodX = 25 + 25 * random.nextInt(33);
foodY = 75 + 25 * random.nextInt(25);
}
//初始化
public void init(){
length = 3;
snakeX[0] = 100;snakeY[0] = 100;
snakeX[1] = 75;snakeY[1] = 100;
snakeX[2] = 50;snakeY[2] = 100;
//初始化小蛇的朝向
direction = "R";
//计时器开始
timer.start();
}
//绘制面板,游戏中的所有东西,都由这个画笔来画
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);//清屏
this.setBackground(Color.BLACK);
Date.header.paintIcon(this,g,25,13);//绘制头部广告栏
g.fillRect(25,75,850,650);//绘制游戏区域
//根据方向判断画哪个小蛇头的朝向
if(direction.equals("R")){
Date.right.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if (direction.equals("L")){
Date.lift.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if (direction.equals("U")){
Date.up.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if (direction.equals("D")){
Date.down.paintIcon(this,g,snakeX[0],snakeY[0]);
}
//画身体
for (int i=1 ; i < length ; i++){
Date.body.paintIcon(this,g,snakeX[i],snakeY[i]);
}
//画食物
Date.food.paintIcon(this,g,foodX,foodY);
//长度,分数
g.setColor(Color.BLACK);
g.setFont(new Font("楷书",Font.BOLD,18));
g.drawString("长度:"+length,775,35);
g.drawString("分数:"+score,775,55);
//按下空格
if (isStart==false){
g.setColor(Color.WHITE);
g.setFont(new Font("楷书",Font.BOLD,40));
g.drawString("按下空格开始",300,300);
}
//失败后
if (isFale){
g.setColor(Color.RED);
g.setFont(new Font("楷书",Font.BOLD,40));
g.drawString("游戏结束,按空格重新开始",190,300);
score=0;
}
}
@Override
public void keyPressed(KeyEvent e) {
int keycode = e.getKeyCode();
//空格
if (keycode==KeyEvent.VK_SPACE){
//判断空格是停止还是重新开始
if (isFale){
isFale = false;
init();
}else {
isStart = !isStart;
}
repaint();//刷新
}
//根据键盘输入判断朝向
if (keycode==KeyEvent.VK_UP&&direction!="D"){
direction = "U";
}else if (keycode==KeyEvent.VK_DOWN&&direction!="U"){
direction = "D";
}else if (keycode==KeyEvent.VK_LEFT&&direction!="R"){
direction = "L";
}else if (keycode==KeyEvent.VK_RIGHT&&direction!="L"){
direction = "R";
}
}
@Override
public void actionPerformed(ActionEvent e) {
//小蛇身体的移动
if (isStart && isFale == false){
for (int i = length - 1 ; i > 0 ; i--){
snakeX[i] = snakeX[i-1];
snakeY[i] = snakeY[i-1];
}
//判断小蛇头部是否接触边界,如果接触从另一端边界出来
if (direction.equals("R")){
snakeX[0] = snakeX[0] + 25;if (snakeX[0] >= 875){ snakeX[0] = 25; }
}else if (direction.equals("L")){
snakeX[0] = snakeX[0] - 25;if (snakeX[0] <= 0){ snakeX[0] = 850; }
}else if (direction.equals("U")){
snakeY[0] = snakeY[0] - 25;if (snakeY[0] <= 50){ snakeY[0] = 700; }
}else if (direction.equals("D")){
snakeY[0] = snakeY[0] + 25;if (snakeY[0] >= 725){ snakeY[0] = 75; }
}
//吃到食物,长度,分数变化。食物重新随机生成
if (snakeX[0]==foodX&&snakeY[0]==foodY){
length++;
score++;
foodX = 25 + 25 * random.nextInt(33);
foodY = 75 + 25 * random.nextInt(25);
}
//失败判定
for (int i = 1;i<length;i++){
if (snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
isFale = true;
}
}
repaint();
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
浙公网安备 33010602011771号