A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package game;
  2. import javax .swing.*;

  3. public class SnakeMain extends JFrame {
  4.         public SnakeMain(){
  5.                 SnakeWindow win=new SnakeWindow();
  6.                 add(win);
  7.                 setTitle("贪食蛇:");
  8.                 setSize(435,390);
  9.                 setLocation(200,200);
  10.                 setVisible(true);
  11.         }
  12.         public static void main(String[] args){
  13.                 new SnakeMain();
  14.         }

  15. }
复制代码
主要问题是下面这块:
  1. package game;
  2. import javax.swing.*;
  3. import java.awt.*;//有几个比较好的布局
  4. import java.awt.event.*;
  5. import java.util.*;//里面有生成随机数的功能
  6. import java.util.List;
  7. public class SnakeWindow extends JPanel implements ActionListener,KeyListener,Runnable{
  8.         JButton newGame,stopGame;
  9.         int fenShu=0,speed=1;
  10.         Thread nThread;
  11.         boolean start=false;
  12.         Random r=new Random();
  13.         int rx=0,ry=0;
  14.         int temp=0,temp1=0,temp2=0;
  15.         JDialog dialog=new JDialog();
  16.         JLabel label=new JLabel("你输了,你的分数是:"+fenShu);
  17.         JButton ok=new JButton("好吧");
  18.         List<SnakeAct> list=new ArrayList<SnakeAct>();
  19.         public SnakeWindow(){
  20.                 newGame=new JButton("开始");
  21.                 stopGame=new JButton("退出");
  22.                 this.setLayout(new FlowLayout(FlowLayout.LEFT));
  23.                 newGame.addActionListener(this);
  24.                 stopGame.addActionListener(this);
  25.                 newGame.addKeyListener(this);
  26.                 ok.addActionListener(this);
  27.                 this.addKeyListener(this);
  28.                 this.add(newGame);
  29.                 this.add(stopGame);
  30.                 dialog.setLayout(new FlowLayout());
  31.                 dialog.add(label);
  32.                 dialog.add(ok);
  33.                 dialog.setSize(200,150);
  34.                 dialog.setLocation(400,300);
  35.                 dialog.setVisible(false);
  36.                
  37.         }
  38.         public void paintComponent(Graphics g){
  39.                 super.paintComponent(g);//这个方法先擦掉面板,再重新画
  40.                 g.drawRect(10, 40, 400, 300);
  41.                 g.drawString("分数:"+fenShu,150,20);
  42.                 g.drawString("速度:"+speed,150,35);
  43.                 g.setColor(new Color(0,255,0));
  44.                 if(start){
  45.                         g.fillRect(10+rx*10, 40+ry*10,10, 10);//绘制实心蛇块,大小是10*10,位置是从(10,40)开始,以10的进制往周围滚动!
  46.                         g.setColor(new Color(255,0,0));
  47.                         for(int i=0;i<list.size();i++)
  48.                         {
  49.                                 g.fillRect(10+list.get(i).getX()*10,40+list.get(i).getY()*10, 10, 10);
  50.                         }
  51.                 }
  52.         }
  53.         public void keyTyped(KeyEvent e) {}

  54.         public void move(int x,int y){
  55.                 if(minYes(x,y)){
  56.                         list.get(0).setX(list.get(0).getX()+x);
  57.                         list.get(0).setY(list.get(0).getY()+y);
  58.                         eat();
  59.                         otherMove();
  60.                         repaint();
  61.                 }else{
  62.                         nThread=null;
  63.                     label=new JLabel("你输了,你的分数是:"+fenShu);
  64.                         dialog.setVisible(true);//设置死亡!
  65.                 }

  66.         }
  67.        
  68.         /*        public void up(){
  69.                 list.get(0).setY(list.get(0).getY()-1);
  70.                 repaint();
  71.         }
  72.         //这里为了减少代码,可以定义一个move()方法,传入两个int型参数!
  73.                  public void down(){
  74.                 list.get(0).setY(list.get(0).getY()+1);
  75.                 repaint();
  76.         }
  77.         public void left(){
  78.                 list.get(0).setX(list.get(0).getX()-1);
  79.                 repaint();
  80.         }
  81.         public void right(){
  82.                 list.get(0).setX(list.get(0).getX()+1);
  83.                 repaint();
  84.         }*/
  85.         public boolean minYes(int x,int y){
  86.                 if(!maxYes(list.get(0).getX()+x,list.get(0).getY()+y)){
  87.                         return false;
  88.                 }
  89.                         return true;
  90.         }
  91.         public boolean maxYes(int x,int y){
  92.                 if(x<0||x>=40||y<0||y>=30){
  93.                         return false;
  94.                 }
  95.                 for(int i=0;i<list.size();i++)
  96.                 {
  97.                         if(i>0&&list.get(0).getX()==list.get(i).getX()&&list.get(0).getY()==list.get(i).getY()){
  98.                                 return false;
  99.                         }
  100.                 }
  101.                 return true;
  102.                
  103.         }
  104.         public void keyPressed(KeyEvent e) {
  105.                 if(start){
  106.                         switch(e.getKeyCode()){
  107.                         case KeyEvent.VK_UP:
  108.                                 move(0,-1);
  109.                                 temp=1;
  110.                                 break;
  111.                         case KeyEvent.VK_DOWN:
  112.                                 move(0,1);
  113.                                 temp=2;
  114.                                 break;
  115.                         case KeyEvent.VK_LEFT:
  116.                                 move(-1,0);
  117.                                 temp=3;
  118.                                 break;
  119.                         case KeyEvent.VK_RIGHT:
  120.                                 move(1,0);
  121.                                 temp=4;
  122.                                 break;
  123.                         default:
  124.                                
  125.                                 break;
  126.                         }
  127.                 }
  128.         }
  129.         public void run(){
  130.                 while(start){
  131.                         switch(temp){
  132.                         case 1:
  133.                                 move(0,-1);
  134.                                 break;
  135.                         case 2:
  136.                                 move(0,1);
  137.                                 break;
  138.                         case 3:
  139.                                 move(-1,0);
  140.                                 break;
  141.                         case 4:
  142.                                 move(1,0);
  143.                                 break;
  144.                         default:
  145.                                 move(1,0);
  146.                                 break;
  147.                                
  148.                         }
  149.                         repaint();
  150.                         fenShu+=100*speed;

  151.                         try {
  152.                                 Thread.sleep(400-(50*speed));
  153.                         } catch (InterruptedException e) {
  154.                                 e.printStackTrace();
  155.                         }
  156.                 }
  157.         }
  158.         public void keyReleased(KeyEvent e) {}
  159.         public void actionPerformed(ActionEvent e) {
  160.                 if(e.getSource()==newGame){
  161.                         newGame.setEnabled(false);
  162.                         start=true;//按开始时将start设置为true
  163.                         rx=r.nextInt(40);ry=r.nextInt(30);
  164.                         SnakeAct tempAct=new SnakeAct();
  165.                         tempAct.setX(20);
  166.                         tempAct.setY(10);
  167.                         list.add(tempAct);
  168.                         requestFocus(true);
  169.                         nThread=new Thread(this);
  170.                         nThread.start();
  171.                         repaint();
  172.                 }
  173.                 if(e.getSource()==stopGame){
  174.                         System.exit(0);
  175.                 }
  176.                 if(e.getSource()==ok){
  177.                         list.clear();
  178.                         fenShu=0;
  179.                         speed=1;
  180.                         nThread = null;
  181.                         start=false;
  182.                         newGame.setEnabled(true);
  183.                         dialog.setVisible(false);
  184.                         repaint();
  185.                 }
  186.                
  187.         }
  188.        
  189.         public void eat(){
  190.                 if(rx==list.get(0).getX()&&ry==list.get(0).getY()){
  191.                         rx=r.nextInt(40);ry=r.nextInt(30);
  192.                         SnakeAct tempAct=new SnakeAct();
  193.                         tempAct.setX(list.get(list.size()-1).getX());
  194.                         tempAct.setY(list.get(list.size()-1).getY());
  195.                         list.add(tempAct);
  196.                         fenShu+=100+10*speed;
  197.                         temp1+=1;
  198.                         if((temp1-temp2)>=10){
  199.                                 temp1=temp2;
  200.                                 if(speed<=10){
  201.                                         speed+=1;
  202.                                 }
  203.                                
  204.                         }
  205.                 }
  206.         }
  207.         public void otherMove(){
  208.                 for(int i=0;i<list.size();i++){
  209.                         if(i==1){
  210.                                 list.get(i).setX(list.get(0).getX());
  211.                                 list.get(i).setY(list.get(0).getY());
  212.                         }
  213.                         else if(i>1){
  214.                                 SnakeAct tempAct = list.get(i-1);
  215.                                 list.set(i-1, list.get(i));
  216.                                 list.set(i, tempAct);
  217.                         }
  218.                 }
  219.         }
  220.         @SuppressWarnings("unused")
  221.         private int nextInt(){
  222.                 return 0;
  223.         }
  224. }

  225.        
  226.        
  227.        

复制代码
  1. package game;

  2. public class SnakeAct {
  3.         private int x;
  4.         private int y;//这里两个私有变量,直接用source--Generate Getters and Setters 进行包装
  5.         public int getX() {
  6.                 return x;
  7.         }
  8.         public void setX(int x) {
  9.                 this.x = x;
  10.         }
  11.         public int getY() {
  12.                 return y;
  13.         }
  14.         public void setY(int y) {
  15.                 this.y = y;
  16.         }
  17.        
  18. }
复制代码
主要问题是1、吃到第一颗后会死掉,应该是判断的问题,没找到!
          2、死了之后dialog上显示的分数仍为0!
求解,拜谢各位!

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

1 个回复

正序浏览
  1. 1.198,199行
  2. tempAct.setX(list.get(list.size()-1).getX());
  3. tempAct.setY(list.get(list.size()-1).getY());
  4. 这里将新添加的点的坐标设置为list中最后一个点的坐标,当此点添加到list中后,list中就存在两个坐标一模一样的点了。
  5. 97-102行:
  6. 在这部分的检测蛇是否自己吃自己时,若有两个点坐标一样,就判定蛇在吃自己了。
  7. for(int i=0;i<list.size();i++)
  8. {
  9.         if(i>0&&list.get(0).getX()==list.get(i).getX()&&list.get(0).getY()==list.get(i).getY()){
  10.                 return false;
  11.         }
  12. }
  13. 2.64行:
  14. label=new JLabel("你输了,你的分数是:"+fenShu);这里将label指向了新对象,原对象里装的仍然是原始字符串
  15. 应该这样:label.setText("你输了,你的分数是:"+fenShu);
  16. 3.游戏结束后,线程应该结束掉
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马