java编写贪吃蛇

本文介绍了一个使用Java Swing实现的贪吃蛇游戏代码。游戏包括开始、暂停功能,通过键盘控制蛇的方向,游戏界面显示蛇的身体和食物,当蛇吃到食物时,蛇的身体增长,分数增加。游戏还实现了边界检测和自我碰撞检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码↓↓

package A;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
public  class A implements ActionListener,Runnable{
B B;B b=new B();
JFrame A=new JFrame("贪吃蛇");{//游戏框架、按钮
	b.setj(b.getj());
	A.setSize(800,600);
	A.setLocation(500,100);
	B =new B();
	A.add(B);A.add(b.getj());
	(b.getj()).setText("分数:     "+0);
	A.setLayout(null);
	A.addKeyListener(B);;
	A.setFocusable(true);}

static JButton JMP1=new JButton("开始");{
JMP1.setBounds(0,10,90,40);A.add(JMP1);
JMP1.addActionListener(this);
}
JButton JMP2=new JButton("暂停");{
JMP2.setBounds(100,10,90,40);A.add(JMP2);	
JMP2.addActionListener(this);
A.setVisible(true);
A.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] ags){
A a=new A();new B();Thread t=new Thread(a);t.start();
}

static int kaiguang;

public void actionPerformed(ActionEvent e) {
if(e.getSource()==JMP2){if(B.kaiguan!=2){kaiguang=1;JMP1.setLabel("继续");}JMP2.setFocusable(false); }
if(e.getSource()==JMP1){if(B.kaiguan!=2){kaiguang=0;JMP1.setLabel("开始");}else{B.kaiguan=0;B.chi=1;B.x=50;B.y=50;JMP1.setLabel("开始");}JMP1.setFocusable(false);}

	
}
public void run(){
	while(true){
	if(B.kaiguan==2){(b.getj()).setText("成绩:     "+B.chi);}else{(b.getj()).setText("分数:     "+B.chi);}
	try {
		 Thread.sleep(250);
		} catch (InterruptedException e) {
			return;
		}
	
}
}
}
class B extends JPanel implements KeyListener{//游戏界面、蛇、食物
int[] chx=new int[1000];int[] chy=new int[1000];//身体容器
int you=1,xia,zuo,shang=0;//方向函数
static int x=20,y=20,xx=50,yy=50,chi=1,xxx=50,yyy=50;//身体,食物方位
int i=1,ii=0,iii=1,d=0;//数量函数(身体)
static int kaiguan=0;//失败开关
Random rr=new Random();
public 	JTextField j=new JTextField();
public JTextField getj(){return j;}
public void setj(JTextField j){
	j.setBackground(Color.WHITE);
	j.setSize(200,40);
	j.setLocation(200,10);
	j.setEnabled(false);
	j.setFont(new Font("宋体",Font.BOLD,25));

}
public  B(){
	setSize(720,420);
	setLocation(30,80);
	setBackground(Color.WHITE);
	
}

public void keyPressed(KeyEvent a){
	if(a.getKeyCode()==KeyEvent.VK_UP&&xia!=1){xia=zuo=you=0;shang=1;}else{
	if(a.getKeyCode()==KeyEvent.VK_DOWN&&shang!=1){you=zuo=shang=0;xia=1;}
	else{if(a.getKeyCode()==KeyEvent.VK_RIGHT&&zuo!=1){xia=shang=zuo=0;you=1;}
	else{if(a.getKeyCode()==KeyEvent.VK_LEFT&&you!=1){you=xia=shang=0;zuo=1;}}}}

}
public void keyReleased(KeyEvent a){}
public void keyTyped(KeyEvent a) {}

public void paint(Graphics g){
	if(kaiguan!=A.kaiguang&&kaiguan!=2){kaiguan=A.kaiguang;}
	repaint();
	if(kaiguan==0){
	if(you==1){x=x+10;if(x<=0||x>=720){if(x<=0){x=720;}else{x=0;}};if(x==xx&&y==yy){xx=rr.nextInt(72);yy=rr.nextInt(42);xx=xx*10;yy=yy*10;chi=chi+1;}}else{
	if(zuo==1){x=x-10;if(x<=0||x>=720){if(x<=0){x=720;}else{x=0;}};if(x==xx&&y==yy){xx=rr.nextInt(72);yy=rr.nextInt(42);xx=xx*10;yy=yy*10;chi=chi+1;}}else{
    if(xia==1){y=y+10;if(y<=0||y>=420){if(y<=0){y=420;}else{y=0;}};if(x==xx&&y==yy){xx=rr.nextInt(72);yy=rr.nextInt(42);xx=xx*10;yy=yy*10;chi=chi+1;}}else{
    if(shang==1){y=y-10;if(y<=0||y>=420){if(y<=0){y=420;}else{y=0;}};if(x==xx&&y==yy){xx=rr.nextInt(72);yy=rr.nextInt(42);xx=xx*10;yy=yy*10;chi=chi+1;}}}}}
	super.paint(g);
	g.fillRect(x,y,10,10);
	if(d!=200){d=d+1;chx[d]=x;chy[d]=y;if(d>100){ii=ii+1;chx[ii]=chx[d];chy[ii]=chy[d];}}else{d=ii+1;ii=0;chx[d]=x;chy[d]=y;}
	iii=d-chi;for(i=d;i!=iii;i--){if(chx[i]==x&&chy[i]==y&&i<d){kaiguan=2;A.JMP1.setLabel("重新");};g.fillRect(chx[i],chy[i],10,10);}
	if(xx<=10||yy<=10){if(xx<=10){xx=xx+10;}else{yy=yy+10;}}
	g.fillRect(xx,yy,10,10);
	try {
		 Thread.sleep(150);
		} catch (InterruptedException e) {
			return;
		}
}else{
	try {
		super.paint(g);
		g.fillRect(x,y,10,10);
		iii=d-chi;for(i=d;i!=iii;i--){g.fillRect(chx[i],chy[i],10,10);}
		g.fillRect(xx,yy,10,10);
		 Thread.sleep(150);
		} catch (InterruptedException e) {
			return;
		}}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值