title: Java Applet Grid Game Flashing On Refresh/Keypress
body: <p>I made a simple game on a grid in java that involves controlling a white square with the WASD keys. Whenever I press W,S,A, or D, the screen sometimes flickers before drawing the grid again. I am fairly new to coding, so the more you can dumb it down for me, the better.</p>
  
  <pre><code>import java.applet.*;
  import java.awt.*;
  import java.awt.event.*;
  /**
   * DotGame.applet
   * 
   * A simple game where the player controls a white circle with the WASD keys.
   *  - If the user moves his circle over a green circle, his score will go up by 1, and another red circle will spawn.
   *  - If the user moves his circle over a red circle, his score will go down by 1, and one less red circle will be generated.
   *  - There is no win condition, it is just a test game.
   *  
   * @author -----------
   * @version 11-9-2014 
   */
  
  public class DotGame extends Applet
  implements KeyListener, MouseListener
  {
  int width,height;
  int powerup = 1;
  int click = 0;
  int x,y;
  final int size = 40;
  int ox = size,oy = size;
  int rx = 0, ry = 0;
  int reddots = 0;
  int red[][] = new int[1000][2];
  String s = "";
  int score = 0;
  int DrawGrid = 0;
  String sc = "";
  int powerupdots = 1;
  int yellow[][] = new int[1][2];
  int powerupcounter = 0;
  int shield = 0;
  int blue[][] = new int[1][2];
  
  public void init()
  {
      this.setSize(740,500);        
      width = 640;
      height = 480;        
      setBackground( Color.black );
      x = width/2;
      y = height/2;
      s = "CLICK TO START";
      addMouseListener( this );
      addKeyListener( this );
  }
  
  public void keyPressed( KeyEvent e ) { }
  
  public void keyReleased ( KeyEvent e ) { }
  
  public void keyTyped( KeyEvent e )
  {
      char c = e.getKeyChar();
      String t = c+"";
      //This will change the coordinates of the user-controlled circle by the size of the circle based on what button is pressed
      if(powerupcounter &gt; 0)
      {
          powerup = 2;
      }
      else if(powerupcounter == 0)
      {
          powerup = 1;
      }
  
      if( t.equalsIgnoreCase("w" )&amp;&amp; oy &gt; 0+((powerup-1)*size))
      {
          oy = oy-(size*powerup);
      }
      else if( t.equalsIgnoreCase("s") &amp;&amp; oy &lt; height-(size*powerup))
      {
          oy = oy+(size*powerup);
      }
      else if( t.equalsIgnoreCase("a")&amp;&amp; ox &gt; 0+((powerup-1)*size))
      {
          ox = ox-(size*powerup);
      }
      else if( t.equalsIgnoreCase("d") &amp;&amp; ox &lt; width-(size*powerup))
      {
          ox = ox+(size*powerup);
      }
      else if(t.equalsIgnoreCase("w" ) &amp;&amp; oy == 0)
      {
          oy = height-(size*powerup);
      }
      else if(t.equalsIgnoreCase("s") &amp;&amp; oy == height-size)
      {
          oy = 0+((powerup-1)*size);
      }
      else if(t.equalsIgnoreCase("a") &amp;&amp; ox == 0)
      {
          ox = width-(size*powerup);
      }
      else if(t.equalsIgnoreCase("d") &amp;&amp; ox == width-size)
      {
          ox = 0+((powerup-1)*size);
      }
      else if(t.equalsIgnoreCase("w") &amp;&amp; oy == size &amp;&amp; powerup ==2)
      {
          oy = height-size;
      }
      else if(t.equalsIgnoreCase("s") &amp;&amp; oy == height -(size*powerup) &amp;&amp; powerup ==2)
      {
          oy = 0;
      }
      else if(t.equalsIgnoreCase("a") &amp;&amp; ox == size &amp;&amp; powerup ==2)
      {
          ox = width-size;
      }
      else if(t.equalsIgnoreCase("d") &amp;&amp; ox == width -(size*powerup) &amp;&amp; powerup ==2)
      {
          ox = 0;
      }
  
      if(powerupcounter &gt; 0)
      {
          powerupcounter--;
      }
  
      repaint();
      e.consume();
  }
  
  public void mouseEntered( MouseEvent e) {}
  
  public void mouseExited( MouseEvent e) {}
  
  public void mousePressed( MouseEvent e) {}
  
  public void mouseReleased( MouseEvent e) {}
  
  public void mouseClicked( MouseEvent e) 
  {
      if(click == 0)
      {
          randomYellow();
          randomBlue();
          DrawRandom();            
          x = e.getX();
          y = e.getY();
          s = "";
          repaint();
          e.consume();
          click = 1;
      }
  }
  
  public void CheckScore()
  {
      if(ox == rx &amp;&amp; oy == ry)
      {
          score++;
          reddots+=10;
          DrawRandom();
      }
  }
  
  public void DrawRandom()
  {
      //The reason we divide by the size and then multiply after it is an int is to
      //make sure that the random circle drawn is in the same base as the size of the circle,
      //so that the player's circle can move directly over it, and not be of by a fraction
      //of the predetermined size.
  
      rx = (int)(Math.random()*width/size)*size;
      ry = (int)(Math.random()*height/size)*size;
      while(rx == ox &amp;&amp; ry == oy)
      {
          rx = (int)(Math.random()*width/size)*size;
          ry = (int)(Math.random()*height/size)*size;
      }
  
      for(int y = 0 ; y &lt; reddots ; y++)
      {
          red[y][0] = (int)(Math.random()*width/size)*size;
          red[y][1] = (int)(Math.random()*height/size)*size;
          while(red[y][0] == rx &amp;&amp; red[y][1] == ry || red[y][0] == yellow[0][0] &amp;&amp; red[y][1] == yellow[0][1] 
          || red[y][0] == ox &amp;&amp; red[y][1] == oy || red[y][0] == blue[0][0] &amp;&amp; red[y][1] == blue[0][1])
          {
              red[y][0] = (int)(Math.random()*width/size)*size;
              red[y][1] = (int)(Math.random()*height/size)*size;
          }
      }
  
  }
  
  public void randomYellow()
  {
      yellow[0][0] = (int)(Math.random()*width/size)*size;
      yellow[0][1] = (int)(Math.random()*height/size)*size;
      while(yellow[0][0] == rx &amp;&amp; yellow[0][1] == ry)
      {
          yellow[0][0] = (int)(Math.random()*width/size)*size;
          yellow[0][1] = (int)(Math.random()*height/size)*size;
      }
  }
  
  public void randomBlue()
  {
      blue[0][0] = (int)(Math.random()*width/size)*size;
      blue[0][1] = (int)(Math.random()*height/size)*size;
      while(blue[0][0] == rx &amp;&amp; blue[0][1] == ry || blue[0][0] == yellow[0][0] &amp;&amp; blue[0][1] == yellow[0][1])
      {
          blue[0][0] = (int)(Math.random()*width/size)*size;
          blue[0][1] = (int)(Math.random()*height/size)*size;
      }
  }
  
  public void CheckDeath()
  {
      for(int y = 0 ; y &lt; reddots ; y++)
      {
          if(ox == red[y][0] &amp;&amp; oy == red[y][1] &amp;&amp; shield == 0)
          {
              score--;
              reddots--;
              DrawRandom();
          }
          else if(ox == red[y][0] &amp;&amp; oy == red[y][1] &amp;&amp; shield !=0)
          {
              shield--;
              DrawRandom();
          }
      }
  }
  
  public void CheckPowerup()
  {
      for(int y = 0 ; y &lt; powerupdots ; y++)
      {
          if(ox == yellow[y][0] &amp;&amp; oy == yellow[y][1])
          {
              powerupcounter += 10;
              randomYellow();
          }
      }
  }
  
  public void CheckShield()
  {
      if(ox == blue[0][0] &amp;&amp; oy == blue[0][1] &amp;&amp; shield &lt; 5)
      {
          shield++;
          randomBlue();
      }
      else if(ox == blue[0][0] &amp;&amp; oy == blue[0][1] &amp;&amp; shield &gt;= 5)
      {
          randomBlue();
      }
  }
  
  public void CheckWin( Graphics g )
  {
      g.setColor(Color.black);
      g.fillRect(0,0,width,height);
      while(1 == 1)
      {
          g.drawString( "YOU WIN" , width/2, height/2);
      }
  
  }
  
  public void paint( Graphics g )
  {
  
      CheckScore();
      if(score == 20)
      {
          CheckWin(g);
      }
      CheckDeath();
      CheckPowerup();
      CheckShield();
      DrawGrid(g);
      g.setColor(Color.yellow);
      g.fillRect(yellow[0][0],yellow[0][1],size+1,size+1);
      g.setColor(Color.red);
      for(int y = 0; y &lt; reddots ; y++)
      {
          g.fillRect(red[y][0],red[y][1],size+1,size+1);
      }
      sc = ""+score;
      //Draw user
      g.setColor(Color.white);
      g.fillRect(ox,oy,size+1,size+1);
      //Draw shield around user if they have shields (max 5)
      if(shield &gt;= 1)
      {
          g.setColor(Color.blue);
          g.fillRect(ox,oy,size+1,5);
          g.fillRect(ox,oy,5,size+1);
          g.fillRect(ox,oy+size-4,size+1,5);
          g.fillRect(ox+size-4,oy,5,size+1);
      }
      //Draw green tile
      g.setColor(Color.green);
      g.fillRect(rx,ry,size+1,size+1);
      //Draw shield tile
      g.setColor(Color.blue);
      g.fillRect(blue[0][0],blue[0][1],size+1,size+1);        
      g.setColor( Color.green );
      g.drawString( s, x, y );
      g.drawString( "Score : "+sc, 650, 20);
      g.drawString( "Powerups : "+powerupcounter, 650, 40);
      g.drawString( "Red Dots : "+reddots, 650,60);
      g.drawString( "Shield : "+shield,650,80);   
  }
  
  public void DrawGrid( Graphics g )
  {
      g.setColor(Color.orange);
      for(int x = 0 ; x &lt;= width ; x += size)
      {
          g.drawLine(x,0,x,height);
      }
      for(int y = 0 ; y &lt;= height ; y+= size)
      {
          g.drawLine(0,y,width,y);
      }
  }
  </code></pre>
  
  <p>}</p>