private synchronized void Start_Newgame()
    {
        Pre_Start();
        score = 0;
        curlen = 1;
        stpt = 1;
        slpt = 0;
       
        voks = -1;
        xp[0] = -1;
        yp[0] = 0;
        curx = 10;//蛇的出发时的坐标
        cury = 10;
       
        key_anter=3;//出发时初始向右
        last_key_anter=2;
       
        new_request = false;
        pause = false;
        alive = true;
        
        starttid = System.currentTimeMillis();//starttid记录下新游戏的开始时间
        slutttid = starttid;
        sistmat = starttid;
        Draw_Sorearea(dg, true);//初始化时参数为true,强制写状态区
    }  private void Pre_Start()//每次开始新游戏主界面的初始化及字体的设定
    {
        bgfx.setFont(skrift);
        dg.setFont(skrift);
        bgfx.setColor(dif_Color[7]);//边框的颜色
        bgfx.fillRect(0, 0, playw, playh);
        bgfx.setColor(dif_Color[0]);//游戏区(除去边框)的颜色
        bgfx.fillRect(border, border, bricksw * pixsz, bricksh * pixsz);
        bgfx.setColor(dif_Color[9]);
       
        dg.drawImage(imb, 0, 0, this);
        
        for(int i = 0; i < bricksh; i++)
        {
            for(int j = 0; j < bricksw; j++)
                valueOfPlayField[j][i] = false;//初始化游戏区,让每个格子都为false.
        }
        Place_food();//初始放置食物
    }
    private void Place_food()//放置食物,也在线程中被调用
    {
        do
        {
            foodx = (int)(Math.random() * (double)bricksw);//随机放置食物
            foody = (int)(Math.random() * (double)bricksh);
        } while(valueOfPlayField[foodx][foody] || foodx == curx && foody == cury);//看是否在蛇上
      
        Paint_snakeOrfood(dg, foodx, foody, false, dif_Color[5], true);//把食物画到面板上
  
    }    public void stop()    
{   
    snake_Thread = null;    
    }    public void Updating(Graphics g, boolean flag)//在线程中不断执行的函数,由update()函数调用
    {
       if(!flag)
            Draw_Sorearea(g, true);
        if(!flag)
            g.drawImage(imb, 0, 0, this);//add!!!!!!!!!!!!!!!!!!!!!!!!!
         if(alive)
        {
         
          switch(key_anter)
            {
            case 0: // 向上,纵坐标(格数)-1
                
                 cury--;
                break;            case 1: // 向下,纵坐标(格数)+1
                cury++;
                break;            case 2: // '向左,横坐标(格数)-1
                curx--;
                break;            case 3: // 向右,横坐标(格数)+1
                curx++;
                break;
            }
          
           
            xp[stpt] = curx;//stpt初始为1,把蛇的初始位置记下
            yp[stpt] = cury;
            stpt++;
            stpt %= makslengde;
            slutttid = System.currentTimeMillis();
            if(curx == foodx && cury == foody)//当蛇头碰到食物时
            {
                int k1 = 0               
              k1 += 2000;              
             int i2 = (8000 * curlen) / k1;//计分函数
                score += i2;//加分
                Place_food();//重新放置食物
                voks += 1;//蛇的长度每次加1
                          
            }
            if(curx >= bricksw || cury >= bricksh || curx < 0 || cury < 0 || If_Onsnake(curx,cury))//当出界或碰到自己的身体时死亡
                 alive = false;
                  
            int i3 = 5 + (alive ? 1 : -2);//如果死亡则换颜色dif_Color[i3],否则为蛇的颜色
            if(voks < 0)//voks初始为-1,当voks小于0时才执行下段代码,            {
                int i1 = xp[slpt];
                int j1 = yp[slpt++];                
                slpt %= makslengde;//让它以2500为单位,蛇的最大值
                if(i1 >= 0)
                {
                   //(i1,j1)分别为蛇尾及蛇尾上一个格的坐标                   
                    Paint_snakeOrfood(g, i1, j1, false, dif_Color[0], false);//蛇经过后把颜色画为原来的背景色
              }
            } else
            {
                score += curlen + voks;//score中要衡量蛇的长度
                voks--;
                curlen++;               
            }
           Paint_snakeOrfood(g, curx, cury, true, dif_Color[i3],true);//画蛇身体
          
            if(!alive)
                checkhighscore();//查最高分,以后添加!!!!!!!!!!!!
        }
    }    private void Paint_snakeOrfood(Graphics g, int i1, int j1, boolean flag, Color color, boolean isSnake)
    {
        int i2 = i1 * pixsz + border;//从格子位置转化为绝对坐标
        int j2 = j1 * pixsz + border;
        int i3 = i2+2;
        int j3 = j2+2;
        bgfx.setColor(color);//off-screen画笔画食物用到的
        g.setColor(color);//系统画笔的颜色
        bgfx.fillRect(i2, j2, pixsz, pixsz);//画食物时的画笔
        
        g.fillRect(i2, j2, pixsz, pixsz);
        if(isSnake)
        {
        
        bgfx.setColor(dif_Color[9]);
        g.setColor(dif_Color[9]);
        bgfx.fillRect(i3, j3, pixsz-4, pixsz-4);
        
        g.fillRect(i3, j3, pixsz-4, pixsz-4);
        }
        if(i1 < bricksw && j1 < bricksh && i1 >= 0 && j1 >= 0)
            valueOfPlayField[i1][j1] = flag;//重新设置布尔值,若为蛇身体,则为true,否则为true
    }

解决方案 »

  1.   

    public void update(Graphics g)
        {
            g.drawImage(imb, 0, 0, this);//Test!!!!不加会有bug,?????
            Updating(g,true);//不断更新整个游戏区。
       
        }
        
        
       
       public void paint(Graphics g)//初始时,只画出状态区及Off_screen画板,以后每次屏幕有变化时,重绘off_screen
           {
           Updating(g,false);
           //g.drawImage(imb, 0, 0, this);//test!!!!!!
           
         
           }
        public void run()
        {
           
            while(snake_Thread != null) 
            {
               
                int i = 100 + (int)(sistflytt - System.currentTimeMillis());
               
                if(i < 20 || i > 100)
                    i = 20;
                try
                {
                    Thread.sleep(100);
                }
                catch(InterruptedException interruptedexception) { }
                sistflytt = System.currentTimeMillis();
                if(new_request)//不断测试用户是否按下重新游戏
                    Start_Newgame();
                if(!pause)    //如果未停止,做repaint();,若停止,则停止重绘但线程继续运行
                    repaint();
                
                Draw_Sorearea(dg, false);//写状态及分数,参数为false,有变化是才写
            
           
            }
            snake_Thread = null;
        }   
        private void Write_Toscroearea(String string, int i)//写函数,负责向状态区中写相应的信息
        {
            int j = dg.getFontMetrics().stringWidth(string);
            dg.drawString(string, i - j, playh +15);
            bgfx.drawString(string, i - j, playh + 15);
        }    private boolean If_Onsnake(int i, int j)//返回此点的布尔值
        {
            return valueOfPlayField[i][j];
        }    private void checkhighscore()//检查分数最大值
        {//以后做!!
        }    private void Draw_Sorearea(Graphics g, boolean flag1)/**此函数在线程中被调用
                                                             *写分,及其状态,长度,时间
                                                             *初始化时flag1为true,强制写
                                                             *当flage1为false时,则有变化才写
                                                             */                                                            
           {
            if(flag1)//如果参数为真,则强制写
            {
               
                dg.setColor(dif_Color[8]);
                bgfx.setColor(dif_Color[8]);
                dg.fillRect(0, pixsz * bricksh + border2, width, 25);
                bgfx.fillRect(0, playh, playw, 16);
                dg.setColor(dif_Color[5]);
                bgfx.setColor(dif_Color[5]);
                Write_Toscroearea("状态:", 50);
                Write_Toscroearea("时间:", 150);
                Write_Toscroearea("长度:", 250);
                Write_Toscroearea("分数:", 350);
                dg.setColor(dif_Color[9]);
                bgfx.setColor(dif_Color[9]);
                Write_Toscroearea("最好成绩: 213234", 540);
            }
            String string = alive ? "活" : "死";
            if(pause)
                string = "暂停";
            g.setColor(dif_Color[8]);
            bgfx.setColor(dif_Color[8]);
            boolean flag4 = !string.equals(SistStatus);
            if(flag4)
            {
                Write_Toscroearea(SistStatus, 90);
                SistStatus = string;
            }
            int i = (int)((slutttid - starttid) / 1000L);
            string = i + "";
            boolean flag2 = !string.equals(SistTid);
            if(flag2)
            {
                Write_Toscroearea(SistTid, 180);
                SistTid = string;
            }
            string = curlen + "";
            boolean flag5 = !string.equals(SistLengde);
            if(flag5)
            {
                Write_Toscroearea(SistLengde, 280);
                SistLengde = string;
            }
            string = score + "";
            boolean flag3 = !string.equals(SistScore);/**
                                                      *这种写法是为了:有变化就修改,没有变化,就不改
                                                      */
             if(flag3)     
            {
                Write_Toscroearea(SistScore, 400);
                SistScore = string;
            }
            dg.setColor(dif_Color[4]);
            bgfx.setColor(dif_Color[4]);
            if(flag4 || flag1)
                Write_Toscroearea(SistStatus, 90);
            if(flag2 || flag1)
                Write_Toscroearea(SistTid, 180);
            if(flag5 || flag1)
                Write_Toscroearea(SistLengde, 280);
            if(flag3 || flag1)
                Write_Toscroearea(SistScore, 400);
        }
      public void keyPressed(KeyEvent evt){
       if(key_anter!=last_key_anter)
       last_key_anter=key_anter;
            
      int keyCode=evt.getKeyCode();
       if(keyCode==KeyEvent.VK_LEFT)
        key_anter=2;                 //向左
       if(keyCode==KeyEvent.VK_RIGHT)
       key_anter=3;                  //向右
       if(keyCode==KeyEvent.VK_UP) 
       key_anter=0;                  //向上   
       if(keyCode==KeyEvent.VK_DOWN)
       key_anter=1;                  //向下
        if(keyCode==KeyEvent.VK_SPACE && evt.isShiftDown())
         new_request=true;        //当按下空格后按扭后,重设此值,重新游戏。
        if(keyCode==KeyEvent.VK_S)    
           { pause=!pause;
            if(pause)
                {
                    pausetime = System.currentTimeMillis();
                } else
                {
                    pausetime -= System.currentTimeMillis();
                    starttid -= pausetime;
                    sistmat -= pausetime;
                }
        }
            /*
             * 用以判断蛇的方向,当蛇向左时则不能突然点击向右,其他类似
             */
             
             if(key_anter==0 && last_key_anter==1)
                key_anter=last_key_anter;
             
             else if(key_anter==1 && last_key_anter==0)
                key_anter=last_key_anter;
             
             else if(key_anter==2 && last_key_anter==3)
                key_anter=last_key_anter;
             
             else if(key_anter==3 && last_key_anter==2)
                key_anter=last_key_anter;
             
      
      }
      public void keyReleased(KeyEvent evt){

    }
      public void keyTyped(KeyEvent evt){
      
    }
    }
      

  2.   

    http://community.csdn.net/Expert/topic/3207/3207001.xml?temp=.0363428
      

  3.   

    谢谢劝告,我会改的,这只是个demo
      

  4.   

    不可能会错的,你再看一下,顺便说以下是什么错误,最好在jcreator上编译