实验项目2

该代码创建了一个基于JavaSwing的贪吃蛇游戏。游戏包括蛇的移动、食物生成、碰撞检测和游戏状态管理。玩家可以通过键盘控制蛇的方向,吃到食物会增长,碰到边界或自身则游戏结束。游戏界面使用Graphics进行绘制,并通过KeyListener监听用户输入,用Timer控制游戏的帧率。
摘要由CSDN通过智能技术生成

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.util.Random;

public class Snake extends JFrame implements KeyListener, ActionListener, MouseListener {

int snakelong=2;//蛇当前长度

int[] Snakex=new int[100];

int[] Snakey=new int[100];

Random random=new Random();

int foodx;

int foody;

Timer timer=new Timer(100, this);//定时器

int started=0;//游戏信息 0-未开始 1-开始 2-结束

int fangxiang=1;//蛇的方向 0-左 1-右 2-上 3-下

public void myJFrame() {

this.setTitle("贪吃蛇大作战");

this.setSize(800, 600);

this.setDefaultCloseOperation(Snake.EXIT_ON_CLOSE);

this.setResizable(false);

this.addKeyListener(this);

this.setVisible(true);

// 蛇的初识位置

Snakex[0]=60;

Snakey[0]=100;

Snakex[1]=40;

Snakey[1]=100;

// 随机食物的初识位置

foodx=random.nextInt(40);

foody=random.nextInt(20);

foodx=foodx*20;

foody=foody*20+80;

}

//覆写paint方法,绘制界面

public void paint(Graphics g) {

// 绘制背景

g.setColor(Color.BLUE);

g.fillRect(0, 0, 800, 600);

//绘制游戏区域

g.setColor(Color.black);

g.fillRect(0, 80, 800, 520);

//绘制蛇

for (int i=0;i<snakelong;i++) {

g.setColor(Color.yellow);

g.fillRect(Snakex[i],Snakey[i],25,25);

}

// 绘制食物

g.setColor(Color.red);

g.fillOval(foodx,foody,25,25);

if (started==0) {

g.setColor(Color.BLACK);//设置画笔颜色

g.setFont(new Font("微软雅黑",10,20)); //设置字体

g.drawString("按下“空格键”开始游戏",300,65); //绘制字符

} else if (started==1 ) {

g.setColor(Color.BLACK);

g.setFont(new Font("微软雅黑",10,20));

g.drawString("当前分数为:",300,65);

g.drawString(String.valueOf(snakelong - 2),420,65);

} else if (started == 2) {

g.setColor(Color.BLACK);

g.setFont(new Font("微软雅黑",10,20));

g.drawString("游戏结束-",250,65);

g.drawString("游戏得分为:",350,65);

g.drawString(String.valueOf(snakelong - 2),470,65);

}

}

// 事件监听

@Override

public void actionPerformed(ActionEvent e) {

// 判断游戏是否开始

if (started==1) {

// 通过循环控制蛇移动

for (int i=snakelong-1;i>0;i--) {

Snakex[i]=Snakex[i-1];

Snakey[i]=Snakey[i-1];

}

// 判断蛇移动的方向

if (fangxiang==0) {//蛇的方向 0-左 1-右 2-上 3-下

Snakex[0]=Snakex[0]-20;

} else if (fangxiang==1) {

Snakex[0]=Snakex[0] + 20;

} else if (fangxiang==2) {

Snakey[0]=Snakey[0] - 20;

} else if (fangxiang==3) {

Snakey[0]=Snakey[0] + 20;

}

// 判断是否撞墙

if (Snakex[0]<0||Snakex[0]>780||Snakey[0]<80||Snakey[0]>580) {

started=2;

}

// 判断蛇是否吃到了食物

if (Snakex[0]==foodx&&Snakey[0]==foody) {

snakelong++;

foodx=random.nextInt(39);

foody=random.nextInt(22);

foodx=foodx*20;

foody=foody*20+80;

System.out.println(foodx +","+foody);

}

// 判断是否吃到了自己

for (int i=1;i<snakelong; i++) {

if (Snakex[0]==Snakex[i]&&Snakey[0]==Snakey[i]) {

started=2;

}

}

// 判断食物是否随机在了蛇身上

for (int i=0;i<snakelong;i++) {

if (foodx==Snakex[i]&&foody==Snakey[i]) {

// 随机食物的初识位置

foodx=random.nextInt(39);

foody=random.nextInt(22);

foodx=foodx*20;

foody=foody*20 +80;

System.out.println(foodx +","+foody);

}

}

repaint();

}

timer.start();

}

// 输入

@Override

public void keyTyped(KeyEvent e) {

}

// 键盘按下——控制游戏的开始以及蛇的移动方向

@Override

public void keyPressed(KeyEvent e) {

int key=e.getKeyCode();

// 判断是否为空格

if (key==KeyEvent.VK_SPACE) {

if (started==0) {

started=1;

} else if(started==1) {

started=0;

} else if (started==2) {

started=0;

snakelong=2;//蛇当前长度

//蛇的初识位置

Snakex[0]=60;

Snakey[0]=100;

Snakex[1]=40;

Snakey[1]= 100;

// 随机食物的初识位置

foodx=random.nextInt(40);

foody=random.nextInt(20);

foodx=foodx*20;

foody=foody*20+80;

// 初始化方向

fangxiang=1;

}

repaint();

timer.start();

// 左

} else if(key==KeyEvent.VK_LEFT) {

if (fangxiang!= 1) {

fangxiang=0;

}

// 右

} else if(key==KeyEvent.VK_RIGHT) {

if (fangxiang!=0) {

fangxiang=1;

}

// 上

} else if(key==KeyEvent.VK_UP) {

if (fangxiang!=3) {

fangxiang=2;

}

//下

} else if (key == KeyEvent.VK_DOWN) {

if (fangxiang!=2) {

fangxiang=3;

}

}

}

// 弹起

@Override

public void keyReleased(KeyEvent e) {

}

// 点击

@Override

public void mouseClicked(MouseEvent e) {

}

// 按下

@Override

public void mousePressed(MouseEvent e) {

}

// 抬起

@Override

public void mouseReleased(MouseEvent e) {

}

// 进入

@Override

public void mouseEntered(MouseEvent e) {

}

// 离开

@Override

public void mouseExited(MouseEvent e) {

}

public static void main(String[] args) {

Snake snake=new Snake();

snake.myJFrame();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值