package 贪吃蛇小游戏;
import java.awt.Color;
import javax.swing.*;
public class Snake主类 {
public static void main(String [] args) {
JFrame frame = new JFrame(); // 创建一个游戏界面的框架
frame.setBounds(10, 10, 900, 720); // 设置框架的大小
frame.setResizable(false); // 设置框架大小为不能改变
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(Color.blue);
SnakePanel panel = new SnakePanel(); //添加画布
frame.add(panel); // 刚添加时画布是空的看不到
frame.setVisible(true); // 允许显示游戏界面
}
}
package 贪吃蛇小游戏;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.*;
import javax.swing.*;
import java.util.Random;//导入随机数函数
import javax.swing.JPanel;
public class SnakePanel extends JPanel implements KeyListener,ActionListener{
ImageIcon up=new ImageIcon("up.png");
ImageIcon left=new ImageIcon("left.png");
ImageIcon down=new ImageIcon("down.png");
ImageIcon right=new ImageIcon("right.png");
ImageIcon title=new ImageIcon("title.jpg");
ImageIcon body=new ImageIcon("body.jpg");
ImageIcon food=new ImageIcon("food.jpg");
//snake
int [] snakeX=new int[750];
int [] snakeY=new int[750];
//随机生成食物的位置
Random rand=new Random();
int foodX=rand.nextInt(34)*25+25;//根据游戏界面大小设置
int foodY=rand.nextInt(34)*25+75;
//设置游戏的初始值
int len=3;//snake长度
int score=0;//分数
String direction = "R";//初始值蛇头向右
//判断开始和结束
boolean isStarted = false;
boolean isFailed = false;
//每100毫秒调用一次ActionPerformed
Timer timer = new Timer(200,this);//移动速度
//构造函数
public SnakePanel() {
this.setFocusable(true);//获取焦点
this.addKeyListener(this);//添加监听器
setup();
timer.start();
}
public void paint(Graphics g) {//画笔
this.setBackground(Color.black);//画布背景颜色
title.paintIcon(this, g, 25, 11);//主题图片
g.fillRect(25, 75 , 850, 650);//游戏界面
//画蛇头
if(direction.equals("R")) {
right.paintIcon(this, g, snakeX[0], snakeY[0]);
}
else if(direction.equals("L")) {
left.paintIcon(this, g, snakeX[0], snakeY[0]);
}
else if(direction.equals("U")) {
up.paintIcon(this, g, snakeX[0], snakeY[0]);
}
else if(direction.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("宋体",Font.BOLD,30));
g.drawString("按空格键开始或者暂停", 200, 300);
}
//游戏结束
if(isFailed) {
g.setColor(Color.white);
g.setFont(new Font("宋体",Font.BOLD,30));
g.drawString("游戏结束,按空格键重新开始", 200, 300);
}
//根据随机生成的位置显示食物
food.paintIcon(this, g, foodX, foodY);
//设置分数和snake的长度
g.setColor(Color.white);
g.setFont(new Font("宋体",Font.PLAIN,15));
g.drawString("分数:"+score, 650, 37);
g.drawString("长度:"+len, 650, 57);
}
//初始化游戏
private void setup() {
// TODO 自动生成的方法存根
isStarted = false;
isFailed = false;
len = 3 ;
score = 0 ;
snakeX[0]=100;snakeX[1]=75;snakeX[2]=50;
snakeY[0]=100;snakeY[1]=100;snakeY[2]=100;
}
@Override
//点击事件
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
timer.start();//??????
//移动
if(isStarted&&!isFailed) {//游戏开始并且未结束
//身体部分移动
for(int i=len;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] > 850) {
snakeX[0]= 25;//超过边界
}
}
else if(direction.equals("L")) {
snakeX[0]=snakeX[0]-25;
if(snakeX[0]<25) {
snakeX[0]=850;
}
}
else if(direction.equals("U")) {
snakeY[0]=snakeY[0]-25;
if(snakeY[0]<75) {
snakeY[0]=650;
}
}
else if(direction.equals("D")) {
snakeY[0]=snakeY[0]+25;
if(snakeY[0]>650) {
snakeY[0]=75;
}
}
//吃食物
if(snakeX[0] == foodX && snakeY[0]==foodY) {
len++;
score++;
foodX=rand.nextInt(34)*25+25;//重置食物坐标
foodY=rand.nextInt(24)*25+75;
}
//判断游戏结束,蛇头碰到身体
for(int i=1;i<len;i++) {
if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]) {
isFailed=true;//游戏结束
direction="R";
}
}
}
repaint();//刷新
}
@Override
//按下键盘的事件响应
public void keyPressed(KeyEvent e) {
// TODO 自动生成的方法存根
int KeyCode = e.getKeyCode();
if(KeyCode==KeyEvent.VK_SPACE) {//点击空格键
if(isFailed) {//如果游戏结束
setup();//重新开始
}
else {//游戏未开始
isStarted= !isStarted;//开始游戏
}
}
//根据键盘输入设置方向,不能反向移动
else if(KeyCode == KeyEvent.VK_UP && direction != "D") {
direction="U";
}
else if(KeyCode == KeyEvent.VK_DOWN && direction != "U") {
direction="D";
}
else if(KeyCode == KeyEvent.VK_RIGHT && direction != "L") {
direction="R";
}
else if(KeyCode == KeyEvent.VK_LEFT && direction != "R") {
direction="L";
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO 自动生成的方法存根
}
@Override
public void keyTyped(KeyEvent e) {
// TODO 自动生成的方法存根
}
}