1、我们需要建立四个头文件,然后分别设置蛇的状态,上下左右,这是蛇能够有方向可走的前提,然后我们再设置蛇身的节点,定义一个简单的函数,这样蛇的全身以及他的行走方向就弄完了。
2、贪吃蛇不能穿墙代码。
3、第二步,一个函数这个函数的目的是贪吃蛇不能穿墙,很简单的代码分别设置长宽的最大位移,在内部范围内设置为一即可通过,否则不能穿墙。贪吃蛇随机生成一个食物。
4、设置一个随机函数。这样贪吃蛇代码就做好了。
慧编程是一款面向STEAM教育领域的积木式和代码编程软件,基于图形化编程开发。
//package mainimport java.awt.Color
import java.awt.event.ActionEvent
import java.awt.event.ActionListener
import java.awt.event.KeyEvent
import java.awt.event.KeyListener
import java.awt.event.WindowAdapter
import java.awt.event.WindowEvent
import java.io.BufferedReader
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.InputStreamReader
import javax.swing.ImageIcon
import javax.swing.JFrame
import javax.swing.JLabel
import javax.swing.JMenu
import javax.swing.JMenuBar
import javax.swing.JMenuItem
import javax.swing.JOptionPane
import javax.swing.JPanel
public class TanChiShe implements KeyListener,ActionListener{
/**
* @param args
*/
int max = 300//蛇长最大值
final int JianJu = 15 //设定蛇的运动网格间距(窗口最大32*28格)
byte fangXiang = 4 //控制蛇的运动方向,初始为右
int time = 500 //蛇的运动间隔时间
int jianTime = 2//吃一个减少的时间
int x,y//蛇的运动坐标,按网格来算
int x2,y2//暂存蛇头的坐标
int jiFenQi = 0//积分器
boolean isRuned = false//没运行才可设级别
boolean out = false//没开始运行?
boolean run = false//暂停运行
String JiBie = "中级"
JFrame f = new JFrame("贪吃蛇 V1.0")
JPanel show = new JPanel()
JLabel Message = new JLabel("级别:中级蛇长:5 时间500ms 分数:00")
// JButton play = new JButton("开始")
JLabel sheTou
JLabel shiWu
JLabel sheWei[] = new JLabel[max]
static int diJi = 4//第几个下标的蛇尾要被加上
ImageIcon shang = new ImageIcon("tuPian\\isSheTouUp.png")//产生四个上下左右的蛇头图案
ImageIcon xia = new ImageIcon("tuPian\\isSheTouDown.png")
ImageIcon zhuo = new ImageIcon("tuPian\\isSheTouLeft.png")
ImageIcon you = new ImageIcon("tuPian\\isSheTouRight.png")
JMenuBar JMB = new JMenuBar()
JMenu file = new JMenu("开始游戏")
JMenuItem play = new JMenuItem(" 开始游戏 ")
JMenuItem pause = new JMenuItem(" 暂停游戏 ")
JMenu hard = new JMenu("游戏难度")
JMenuItem gao = new JMenuItem("高级")
JMenuItem zhong = new JMenuItem("中级")
JMenuItem di = new JMenuItem("低级")
JMenu about = new JMenu(" 关于 ")
JMenuItem GF = new JMenuItem("※高分榜")
JMenuItem ZZ = new JMenuItem("关于作者")
JMenuItem YX = new JMenuItem("关于游戏")
JMenuItem QK = new JMenuItem("清空记录")
static TanChiShe tcs = new TanChiShe()
public static void main(String[] args) {
// TanChiShe tcs = new TanChiShe()
tcs.f()
}
public void f(){
f.setBounds(250,100,515,530)
f.setLayout(null)
f.setAlwaysOnTop(true)//窗口始终保持最前面
f.setBackground(new Color(0,0,0))
f.setDefaultCloseOperation(0)
f.setResizable(false)
f.setVisible(true)
// f.getContentPane().setBackground(Color.BLACK)
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0)//退出程序
}
})
f.setJMenuBar(JMB)
JMB.add(file)
file.add(play)
file.add(pause)
JMB.add(hard)
hard.add(gao)
hard.add(zhong)
hard.add(di)
JMB.add(about)
about.add(GF)
GF.setForeground(Color.blue)
about.add(ZZ)
about.add(YX)
about.add(QK)
QK.setForeground(Color.red)
f.add(show)
show.setBounds(0,f.getHeight()-92,f.getWidth(),35)
// show.setBackground(Color.green)
// f.add(play)
// play.setBounds(240,240,80,25)
play.addActionListener(this)
pause.addActionListener(this)
gao.addActionListener(this)
zhong.addActionListener(this)
di.addActionListener(this)
GF.addActionListener(this)
ZZ.addActionListener(this)
YX.addActionListener(this)
QK.addActionListener(this)
show.add(Message)
Message.setForeground(Color.blue)
f.addKeyListener(this)
// show.addKeyListener(this)
play.addKeyListener(this)
sheChuShi()
}
public void sheChuShi(){//蛇初始化
sheTou = new JLabel(you)//用向右的图来初始蛇头
f.add(sheTou)
sheTou.setBounds(JianJu*0,JianJu*0,JianJu,JianJu)
// System.out.println("ishere")
shiWu = new JLabel("■")
f.add(shiWu)
shiWu.setBounds(10*JianJu,10*JianJu,JianJu,JianJu)
for(int i=0i<=diJii++) {
sheWei[i] = new JLabel("■")
f.add(sheWei[i])
sheWei[i].setBounds(-1*JianJu,0*JianJu,JianJu,JianJu)
}
while(true){
if(out == true){
yunXing()
break
}
try{
Thread.sleep(200)
}catch(Exception ex){
ex.printStackTrace()
}
}
}
public void sheJiaChang(){//蛇的长度增加
if(diJi <max){
sheWei[++diJi] = new JLabel(new ImageIcon("tuPian\\isSheWei.jpg"))
f.add(sheWei[diJi])
sheWei[diJi].setBounds(sheWei[diJi-1].getX(),sheWei[diJi-1].getY(),JianJu,JianJu)
// System.out.println("diJi "+diJi)
}
}
public void pengZhuanJianCe(){//检测蛇的碰撞情况
if(sheTou.getX()<0 || sheTou.getY()<0 ||
sheTou.getX()>f.getWidth()-15 || sheTou.getY()>f.getHeight()-105 ){
gameOver()
// System.out.println("GameOVER")
}
if(sheTou.getX() == shiWu.getX() &&sheTou.getY() == shiWu.getY()){
out: while(true){
shiWu.setLocation((int)(Math.random()*32)*JianJu,(int)(Math.random()*28)*JianJu)
for(int i=0i<=diJii++){
if(shiWu.getX()!= sheWei[i].getX() &&shiWu.getY()!=sheWei[i].getY()
&&sheTou.getX()!=shiWu.getX() &&sheTou.getY()!= shiWu.getY()){//如果食物不在蛇身上则退出循环,产生食物成功
break out
}
}
}
sheJiaChang()
// System.out.println("吃了一个")
if(time>100 ){
time -= jianTime
}
else{}
Message.setText("级别:"+JiBie+" 蛇长:"+(diJi+2)+"时间:"+time+"ms 分数:"+(jiFenQi+=10)+"")
}
for(int i=0i<=diJii++){
if(sheTou.getX() == sheWei[i].getX() &&sheTou.getY() == sheWei[i].getY()){
gameOver()
// System.out.println("吃到尾巴了")
}
}
}
public void yunXing(){
while(true){
while(run){
if(fangXiang == 1){//上
y-=1
}
if(fangXiang == 2){//下
y+=1
}
if(fangXiang == 3){//左
x-=1
}
if(fangXiang == 4){//右
x+=1
}
x2 = sheTou.getX()
y2 = sheTou.getY()
sheTou.setLocation(x*JianJu,y*JianJu)//设置蛇头的坐标 网格数*间隔
for(int i=diJii>=0i--){
if(i==0){
sheWei[i].setLocation(x2,y2)
// System.out.println(i+" "+sheTou.getX()+" "+sheTou.getY())
}
else{
sheWei[i].setLocation(sheWei[i-1].getX(),sheWei[i-1].getY())
//System.out.println(i+" "+sheWei[i].getX()+" "+sheWei[i].getY())
}
}
pengZhuanJianCe()
try{
Thread.sleep(time)
}catch(Exception e){
e.printStackTrace()
}
}
Message.setText("级别:"+JiBie+" 蛇长:"+(diJi+2)+"时间:"+time+"ms 分数:"+(jiFenQi+=10)+"")
try{
Thread.sleep(200)
}catch(Exception e){
e.printStackTrace()
}
}
}
public void gameOver(){//游戏结束时处理
int in = JOptionPane.showConfirmDialog(f,"游戏已经结束!\n是否要保存分数","提示",JOptionPane.YES_NO_OPTION)
if(in == JOptionPane.YES_OPTION){
// System.out.println("YES")
String s = JOptionPane.showInputDialog(f,"输入你的名字:")
try{
FileInputStream fis = new FileInputStream("GaoFen.ini")//先把以前的数据读出来加到写的数据前
InputStreamReader isr = new InputStreamReader(fis)
BufferedReader br = new BufferedReader(isr)
String s2,setOut = ""
while((s2=br.readLine())!= null){
setOut =setOut+s2+"\n"
}
FileOutputStream fos = new FileOutputStream("GaoFen.ini")//输出到文件流
s = setOut+s+":"+jiFenQi+"\n"
fos.write(s.getBytes())
}catch(Exception e){}
}
System.exit(0)
}
public void keyTyped(KeyEvent arg0) {
// TODO 自动生成方法存根
}
public void keyPressed(KeyEvent arg0) {
// System.out.println(arg0.getSource())
if(arg0.getKeyCode() == KeyEvent.VK_UP){//按上下时方向的值相应改变
if(fangXiang != 2){
fangXiang = 1
// sheTou.setIcon(shang)//设置蛇的方向
}
//System.out.println("UP")
}
if(arg0.getKeyCode() == KeyEvent.VK_DOWN){
if(fangXiang != 1){
fangXiang = 2
// sheTou.setIcon(xia)
}
//System.out.println("DOWN")
}
if(arg0.getKeyCode() == KeyEvent.VK_LEFT){//按左右时方向的值相应改变
if(fangXiang != 4){
fangXiang = 3
//sheTou.setIcon(zhuo)
}
// System.out.println("LEFT")
}
if(arg0.getKeyCode() == KeyEvent.VK_RIGHT){
if(fangXiang != 3){
fangXiang = 4
//sheTou.setIcon(you)
}
// System.out.println("RIGHT")
}
}
public void keyReleased(KeyEvent arg0) {
// TODO 自动生成方法存根
}
public void actionPerformed(ActionEvent arg0) {
// TODO 自动生成方法存根
JMenuItem JI = (JMenuItem)arg0.getSource()
if(JI == play){
out = true
run = true
isRuned = true
gao.setEnabled(false)
zhong.setEnabled(false)
di.setEnabled(false)
}
if(JI == pause){
run = false
}
if(isRuned == false){//如果游戏还没运行,才可以设置级别
if(JI == gao){
time = 200
jianTime = 1
JiBie = "高级"
Message.setText("级别:"+JiBie+" 蛇长:"+(diJi+2)+"时间:"+time+"ms 分数:"+jiFenQi)
}
if(JI == zhong){
time = 400
jianTime = 2
JiBie = "中级"
Message.setText("级别:"+JiBie+" 蛇长:"+(diJi+2)+"时间:"+time+"ms 分数:"+jiFenQi)
}
if(JI == di){
time = 500
jianTime = 3
JiBie = "低级"
Message.setText("级别:"+JiBie+" 蛇长:"+(diJi+2)+"时间:"+time+"ms 分数:"+jiFenQi)
}
}
if(JI == GF){
try{
FileInputStream fis = new FileInputStream("GaoFen.ini")
InputStreamReader isr = new InputStreamReader(fis)
BufferedReader br = new BufferedReader(isr)
String s,setOut = ""
while((s=br.readLine())!= null){
setOut =setOut+s+"\n"
}
if(setOut.equals("")){
JOptionPane.showMessageDialog(f,"暂无保存记录!","高分榜",JOptionPane.INFORMATION_MESSAGE)
}
else{
JOptionPane.showMessageDialog(f,setOut)
}
}catch(Exception e){
e.printStackTrace()
}
}
if(JI == ZZ){//关于作者
JOptionPane.showMessageDialog(f,"软件作者:申志飞\n地址:四川省绵阳市\nQQ:898513806\nE-mail:shenzhifeiok@126.com","关于作者",JOptionPane.INFORMATION_MESSAGE)
}
if(JI == YX){//关于游戏
JOptionPane.showMessageDialog(f,"贪吃蛇游戏\n游戏版本 V1.0","关于游戏",JOptionPane.INFORMATION_MESSAGE)
}
if(JI == QK){
try{
int select = JOptionPane.showConfirmDialog(f,"确实要清空记录吗?","清空记录",JOptionPane.YES_OPTION)
if(select == JOptionPane.YES_OPTION){
String setOut = ""
FileOutputStream fos = new FileOutputStream("GaoFen.ini")//输出到文件流
fos.write(setOut.getBytes())
}
}catch(Exception ex){}
}
}
}
//是我自己写的,本来里面有图片的,但无法上传,所以把图片去掉了,里面的ImageIcon等语句可以去掉。能正常运行。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)