/**贪吃蛇*/importjava.awt.*;//包含文件importjavax.swing.*;importjava.awt.event.*;publicclassGreedSnackextendsJFrame{inti,j;WH_panelpanel;//定义WH_panel的实例JMenuBarwh_bar;//定义菜单实例publicGreedSnack()//构造函数{super(贪吃蛇--game--);//框架名称Containerc=getContentPane();//获得框架容器setBounds(200,200,620,465);//设置frame的大小c.setLayout(null);//设置框架布局wh_bar=newJMenuBar();//定义菜单实例setJMenuBar(wh_bar);//设置菜单JMenu[]m={newJMenu(文件),newJMenu(编辑)};//主菜单JMenuItem[][]mi={//下拉菜单项{newJMenuItem(开始),newJMenuItem(退出)},//设计菜单的内容{newJMenuItem(分数),newJMenuItem(记录分)}};for(i=0;im.length;i++)//添加菜单{wh_bar.add(m[i]);//添加下拉菜单for(j=0;jmi[i].length;j++)//小于菜单的长度{m[i].add(mi[i][j]);//添加}//for}//formi[0][0].addActionListener(newActionListener()//设置菜单监听{publicvoidactionPerformed(ActionEvente)//{try{panel.thread.start();//开始线程panel.right();//直接执行right函数}catch(Exceptionee){}//对线程进行捕获错误}});addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente)//键盘监听{if(e.getKeyCode()==KeyEvent.VK_LEFT)//监听左键panel.left();//执行left函数if(e.getKeyCode()==KeyEvent.VK_RIGHT)//监听右键panel.right();//执行right函数if(e.getKeyCode()==KeyEvent.VK_UP)//监听上键panel.up();//执行up函数if(e.getKeyCode()==KeyEvent.VK_DOWN)//监听下键panel.down();//执行down函数}//键盘事件publicvoidkeyTyped(KeyEvente){}publicvoidkeyReleased(KeyEvente){}});panel=newWH_panel();panel.setLayout(null);//panel布局c.add(panel);//添加panel}publicstaticvoidmain(Stringargs[])//主函数{GreedSnackapp=newGreedSnack();//设置frame的实例app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口app.setVisible(true);//设置成可见}//main}//greedsnackclassWH_panelextendsJPanelimplementsRunnable//panel函数{Threadthread;//定义线程intx=0,y=0,wh_direct=0;//设置变量intfood_x=60,food_y=80;//初始食物的位置intd_l,d_r,d_u,d_d;//定义行使方向inti,j,wh_stop;intfood_date;//定义食物数int[][]wh_array=newint[30][20];//定义数组publicWH_panel()//构造函数{this.setBounds(0,0,600,400);//设置panel的大小thread=newThread(this);//创建线程threadfor(i=0;i30;i++)//给数组付初值{for(j=0;j20;j++)//列标小于20{wh_array[i][j]=0;//将数组赋为0}//for}//for}//WH_panel()publicvoidleft()//left函数{if(d_r!=3)//假设现在向右行进{wh_direct=1;//wh_direct为1d_l=1;//标记左不能运行d_r=3;d_u=0;//标记上可以运行d_d=0;//标记下可以运行}else//假设现在不是向右行进{d_l=0;//向左可以运行}}publicvoidright()//右键函数{if(d_l!=1)//假设现在向左行进{wh_direct=2;//wh_direct为2d_l=1;d_r=3;//向右不可以运行d_u=0;//向上可以运行d_d=0;//向下可以运行}else//假设没有向左行进{d_r=0;//向右可以运行}}publicvoidup()//向上键函数{if(d_d!=7)//假设现在向下行进{wh_direct=3;//wh_direct为3d_u=5;//向上不可以运行d_d=7;d_l=0;//向左可以行进d_r=0;//向右可以运行}else//假设现在没有向下运行{d_u=0;//可以向上行进}}publicvoiddown()//向下键的函数{if(d_u!=5)//如果现在向上运行{wh_direct=4;//wh_direct为4d_u=5;d_d=7;//现在不可向下行进d_r=0;//现在可向右行进d_l=0;//现在向左行进}else//如果现在没有向上行进{d_d=0;//可以向下行进}}publicvoidrun()//线程函数{while(true)//while循环{if(wh_direct==1)//向左方{if(x=20&&y=0&&x=580&&y=380)//规定范围if(wh_array[x/20-1][y/20]!=0)//当下一个有蛇身{wh_stop=1;//wh_stop=1}x=x-20;//x坐标减小变化wh_run();}if(wh_direct==2)//向右方{if(x=0&&y=0&&x=560&&y=380)//规定范围if(wh_array[x/20+1][y/20]!=0)//当下一个有蛇身{wh_stop=1;//wh_stop=1}x=x+20;//x坐标增大变化wh_run();}if(wh_direct==3)//向上方{if(x=0&&y=20&&x=580&&y=380)//规定范围if(wh_array[x/20][y/20-1]!=0)//当下一个有蛇身{wh_stop=1;//wh_stop=1}y=y-20;//y坐标减小变化wh_run();}if(wh_direct==4)//向下方{if(x=0&&y=0&&x=580&&y=360)//规定范围if(wh_array[x/20][y/20+1]!=0)//当下一个有蛇身{wh_stop=1;//wh_stop=1}y=y+20;//y坐标增大变化wh_run();}if(food_x==x&&food_y==y)//蛇头的坐标与食物相同{food_x=((int)(Math.random()*30))*20;//随机食物坐标Xfood_y=((int)(Math.random()*20))*20;//随机食物坐标Yrepaint();//刷新绘图food_date=food_date+1;//食物数进行自加}if(x==600||y==400||x0||y0||wh_stop==1)//到达边界跳出循环{break;}}}publicvoidwh_run()//蛇身行进函数{/**此函数为贪吃蛇的重点函数,实现蛇身的各种变化,主要思路是:*将面板分割成20X30的数组,并将其初始值赋为0,每次将蛇头*值赋为1,然后对数组非0的数进行加1操作,若数组内的值大于*蛇本身应有的长度,就将其值改为0,最后对数组不为0的进行绘*图。*/if(x=0&&y=0&&x=580&&y=380)//当坐标满足数组范围时{wh_array[x/20][y/20]=1;//此时蛇头数组值为1}for(i=0;i30;i++)//检测整个数组{for(j=0;j20;j++)//y小于20{if(wh_array[i][j]!=0)//如果数组中含有不为0的值{wh_array[i][j]=wh_array[i][j]+1;//对其加1操作}//if}//for}//forrepaint();//从绘窗口wh_sleep(200);//睡眠for(i=0;i30;i++)//给数组付初值{for(j=0;j20;j++)//y小于20{if(wh_array[i][j]food_date+1)//若蛇身长度大于食物数加1{wh_array[i][j]=0;//将值变为0}//if}//for}//for}//wh_run()protectedvoidpaintComponent(Graphicsg)//绘图函数{g.setColor(Color.getHSBColor(0,0,200));//panel背景颜色g.fillRect(0,0,this.getWidth(),this.getHeight());for(i=0;i30;i++)//检测数组{for(j=0;j20;j++)//y坐标小于20{if(wh_array[i][j]!=0)//在wh_array不为0时{g.setColor(Color.BLUE);//蛇身颜色g.fillRect(20*i,20*j,20,20);//画蛇身g.setColor(Color.lightGray);//蛇身外框颜色g.drawRect(20*i,20*j,20,20);//蛇身外框}//if}//for}//forg.setColor(Color.RED);//食物颜色g.fillOval(food_x,food_y,20,20);//画食物if(x==600||y==400||x0||y0||wh_stop==1)//当蛇撞墙时{g.setColor(Color.getHSBColor(0,0,200));//panel背景颜色g.fillRect(0,0,this.getWidth(),this.getHeight());//画矩形充当背景g.setColor(Color.BLACK);//设置字符串颜色g.drawString(gameover,250,150);//输出gameover}//if}//paintComponentpublicstaticvoidwh_sleep(longmillis)//自定义sleep函数{try{Thread.sleep(millis);//调用线程休眠}//trycatch(InterruptedExceptione)//捕获错误{System.err.println(+e);e.printStackTrace();//输出错误}//catch}//wh_sleep}