贪吃蛇
- 定义数据
- 绘制界面
- 画静态图
- 创建定时器,使蛇动起来
- 监听键盘
- 改变蛇的方向
- 暂停开始游戏
- 增加判定
- 判断蛇是否吃到豆,吃到豆刷新豆的出现,积分增加
- 判断蛇头是否出界,如出界则从另一侧出现
- 判断蛇头是否撞到自己
public class StartGame {
//初始方向
String fangxiang = "right";
//初始蛇身长度
int lenth = 3;
//蛇身的坐标
int[] snakeX = new int[100];
int[] snakeY = new int[100];
//豆的坐标
int foodX;
int foodY;
//游戏是否开始
boolean isStart = false;
//游戏是否失败
boolean isfalse = false;
//游戏积分
int num;
Random random = new Random();
MyFrame frame = null;
MyTimer timer = null;
StartGame(){
frame = new MyFrame();
frame.setVisible(true);
frame.setResizable(false);//窗口大小不可变
frame.setBounds(100,100,65+34*25,120+24*25);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
timer = new MyTimer(100);
}
//游戏面板
class MyFrame extends JFrame{
//游戏面板
GamePanel gamePanel = null;
//键盘监听
KeyPass keypass = null;
MyFrame(){
gamePanel = new GamePanel();
this.add(gamePanel);
init();
//获取焦点事件和键盘事件
this.setFocusable(true);//获得焦点事件
keypass = new KeyPass();
this.addKeyListener(keypass);//获得键盘事件
this.repaint();
}
//蛇以及豆的初始地方
public void init(){
for (int i = 0; i < 3; i++) {
snakeX[i] = 100 - (25 * i);
snakeY[i] = 100;
}
//把食物随机放置在游戏区域上
foodX = 25 + 25*random.nextInt(34);
foodY = 75 + 25*random.nextInt(24);
}
class GamePanel extends JPanel{
//绘制面板,此游戏中的所有东西,都是使用这个画笔来画
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);//清屏
//背景
this.setBackground(Color.white);
//游戏区域
g.fillRect(25,75,34*25,24*25);
//豆
Image snakeFood = (new ImageIcon("static/food.png")).getImage();
g.drawImage(snakeFood,foodX,foodY,null);
//蛇身
Image snakeBody = (new ImageIcon("static/body.png")).getImage();
for (int i = 1; i < lenth; i++) {
g.drawImage(snakeBody,snakeX[i],snakeY[i],null);
}
//蛇头
Image snaketou = (new ImageIcon("static/" + fangxiang + ".png")).getImage();
g.drawImage(snaketou,snakeX[0],snakeY[0],null);
if (isStart == false && isfalse == false){
g.setColor(Color.white);
g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
g.drawString("按下空格开始游戏!",280,300);
}
if (isfalse == true){
g.setColor(Color.red);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("游戏失败,请按空格重新开始游戏!",155,300);
}
//游戏积分
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.setColor(Color.black);
g.drawString("积分:" + num + " 长度:" + lenth,270,50);
}
}
//键盘监听
class KeyPass implements KeyListener{
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE){
if (isfalse){//如果游戏失败,按下空格重新开始
isfalse = false;
isStart = false;
lenth = 3;
fangxiang = "right";
num = 0;
for (int i = 0; i < 3; i++) {
snakeX[i] = 100 - (25 * i);
snakeY[i] = 100;
}
foodX = 25 + 25*random.nextInt(34);
foodY = 75 + 25*random.nextInt(24);
}else if (isfalse == false){//如果游戏未失败,且正在运行中,按下空格停止游戏
isStart = !isStart;//取反,一下空格开始,再按空格停止
}
}
//监听键盘方向,改变蛇行走方向,且改变的方向不能为行走的反方向
if (e.getKeyCode() == KeyEvent.VK_UP){
if (fangxiang.equals("down")){
return;
}else {
fangxiang = "up";
}
}else if (e.getKeyCode() == KeyEvent.VK_DOWN){
if (fangxiang.equals("up")){
return;
}else {
fangxiang = "down";
}
}else if (e.getKeyCode() == KeyEvent.VK_LEFT){
if (fangxiang.equals("right")){
return;
}else {
fangxiang = "left";
}
}else if (e.getKeyCode() == KeyEvent.VK_RIGHT){
if (fangxiang.equals("left")){
return;
}else {
fangxiang = "right";
}
}
repaint();
}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {}
}
}
//定时器
class MyTimer implements Runnable {
Thread t1 = null;//创建线程对象 t1
long speed;
MyTimer(long speed){
this.speed = speed;
t1 = new Thread(this);
//启动线程 t1
t1.start();
}
@Override
public void run() {
while (true){
try {
t1.sleep(this.speed);
if (this == timer){
if (isStart){//如果游戏是开始状态,则动起来
//身体移动
for (int i = lenth; i > 0; i--) {
snakeX[i] = snakeX[i-1];
snakeY[i] = snakeY[i-1];
}
//蛇的走向
if (fangxiang.equals("up")){
snakeY[0] = snakeY[0] - 25;
if (snakeY[0] < 75){//边界判断
snakeY[0] = 26*25;
}
}else if (fangxiang.equals("down")){
snakeY[0] = snakeY[0] + 25;
if (snakeY[0] > 26*25) {//边界判断
snakeY[0] = 75;
}
}else if (fangxiang.equals("left")){
snakeX[0] = snakeX[0] - 25;
if (snakeX[0] < 25) {//边界判断
snakeX[0] = 34*25;
}
}else if (fangxiang.equals("right")){
snakeX[0] = snakeX[0] + 25;
if (snakeX[0] > 34*25) {//边界判断
snakeX[0] = 25;
}
}
//吃豆判定
if (snakeX[0] == foodX && snakeY[0] == foodY){
lenth++;//吃到食物长度 + 1
num+=20;
//再次随机生成食物
foodX = 25 + 25*random.nextInt(34);
foodY = 75 + 25*random.nextInt(24);
}
//失败判定
for (int i = 1; i < lenth; i++) {
if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]){
snakeX[i+1] = snakeX[0];
snakeY[i+1] = snakeY[0];
isStart = false;
isfalse = true;
}
}
frame.repaint();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new StartGame();
}
}