Fleshian

Tetris Souce Code

May 18th, 2014
325
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.34 KB | None | 0 0
  1. import java.awt.Color;
  2.  
  3. class Tetris extends javax.swing.JPanel
  4. implements java.awt.event.KeyListener
  5. {
  6. //  g.setColor(new Color(102,0,102)); //purple
  7. //  g.setColor(new Color(2,92,1)); //green
  8. //  g.setColor(new Color(158,12,41)); //red
  9. //  g.setColor(new Color(153,102,0)); //yellow
  10. //  g.setColor(new Color(153,51,0)); //orange
  11. //  g.setColor(new Color(1,36,118)); //blue
  12. //  g.setColor(new Color(2,88,108)); //cyan
  13.    
  14.     // new Color(0,210,240)
  15.     Font font = new Font("Tahoma", Font.BOLD,16);
  16.     Font fontTwo = new Font("Impact", Font.PLAIN,20);
  17.     Font fontThree = new Font("Impact", Font.PLAIN, 35);
  18.   int[][] occupied = new int[10][20];
  19.   int[][] colorsCoords = new int[10][20];
  20.   Color[] tokenBorderColors = {
  21.         new Color(2,88,108),  // I
  22.         new Color(1,36,118),    // J
  23.         new Color(153,51,0),  // L
  24.         new Color(153,102,0),  // O
  25.         new Color(2,92,1),    // S
  26.         new Color(102,0,102),  // T        
  27.         new Color(158,12,41)};   // Z              
  28.    
  29.   Color[] tokenInnerColors = {
  30.             new Color(0,210,240),  // I
  31.             new Color(71,134,226),    // J
  32.             new Color(255,100,0),  // L
  33.             new Color(255,182,24),  // O
  34.             new Color(0,216,0),    // S
  35.             new Color(197,41,166),  // T       
  36.             new Color(247,32,57)};   // Z  
  37.  
  38.     // [seven tokens] [ four rotations ] [ four cells]
  39.     static int[][][] xRotationArray = {
  40.        { {-1,0,1,2}, {1,1,1,1}, {-1,0,1,2}, {0,0,0,0} },    // I
  41.        { {-1,-1,0,1}, {0,1,0,0}, {-1,0,1,1}, {0,0,-1,0} },  // J      
  42.        { {1,-1,0,1}, {0,0,0,1}, {-1,0,1,-1}, {-1,0,0,0} },  // L
  43.        { {0,1,0,1}, {0,1,0,1}, {0,1,0,1}, {0,1,0,1} },      // O
  44.        { {0,1,-1,0}, {0,0,1,1}, {0,1,-1,0}, {-1,-1,0,0} },  // S
  45.        { {0,-1,0,1}, {0,0,1,0}, {-1,0,1,0}, {0,-1,0,0} },   // T           
  46.        { {-1,0,0,1}, {1,0,1,0}, {-1,0,0,1}, {0,-1,0,-1} },  // Z
  47.        
  48.     };
  49.     static int[][][] yRotationArray = {
  50.        { {0,0,0,0}, {-1,0,1,2}, {1,1,1,1}, {-2,-1,0,1} },   // I
  51.        { {0,1,1,1}, {0,0,1,2}, {1,1,1,2}, {0,1,2,2} },      // J
  52.        { {0,1,1,1}, {0,1,2,2}, {1,1,1,2}, {0,0,1,2} },      // L
  53.        { {0,0,1,1}, {0,0,1,1}, {0,0,1,1}, {0,0,1,1} },      // O
  54.        { {0,0,1,1}, {0,1,1,2}, {0,0,1,1}, {-1,0,0,1} },     // S
  55.        { {0,1,1,1}, {0,1,1,2}, {1,1,1,2}, {0,1,1,2} },      // T
  56.        { {0,0,1,1}, {0,1,1,2}, {1,1,2,2}, {0,1,1,2} },      // Z
  57.        
  58.     };
  59.  
  60.  
  61.   int score=0;  // score
  62.   int lineCompleted = 0;   // number of lines completed
  63.   int level=0;
  64.  
  65.   javax.swing.JLabel scoreLabel = new javax.swing.JLabel("SCORE : 0");
  66.   javax.swing.JLabel levelLabel = new javax.swing.JLabel("LEVEL : 0");
  67.   javax.swing.JLabel tetrisLabael = new javax.swing.JLabel("Team ANSUROER");
  68.  
  69.  
  70.   public void init()
  71.   {
  72.     this.setPreferredSize(new java.awt.Dimension(600,600));
  73.     this.setBackground(java.awt.Color.LIGHT_GRAY);          
  74.  
  75.     this.setLayout(null);    // absolute coordinate system
  76.    
  77.     tetrisLabael.setBounds(400, 25, 200, 100);
  78.     tetrisLabael.setFont(fontTwo);
  79.     this.add(tetrisLabael);
  80.    
  81.    
  82.     scoreLabel.setBounds(400,100,150,30);  // x,y,w,h (in pixels)
  83.     scoreLabel.setFont(font);
  84.     this.add(scoreLabel);
  85.    
  86.  
  87.    
  88.    
  89.     levelLabel.setBounds(400,125,100,30);
  90.     levelLabel.setFont(font);
  91.     this.add(levelLabel);
  92.  
  93.   }
  94.  
  95.   public void drawCell(int x,int y, int color)
  96.   {
  97.     occupied[x][y] = 1;
  98.     colorsCoords[x][y]= color;
  99.   }
  100.  
  101.   public void eraseCell(int x,int y)
  102.   {
  103.     occupied[x][y] = 0;
  104.   }
  105.  
  106.   public void drawToken(int x, int y, int[] xArray, int[] yArray, int color)
  107.   {
  108.     for (int i=0;i<4;i++)
  109.     {
  110.       drawCell(x+xArray[i],y+yArray[i], color);
  111.     }
  112.   }
  113.  
  114.   public void eraseToken(int x, int y, int[] xArray, int[] yArray)
  115.   {
  116.     for (int i=0;i<4;i++)
  117.     {
  118.       eraseCell(x+xArray[i],y+yArray[i]);
  119.     }
  120.   }
  121.  
  122.   public void paint(java.awt.Graphics gr)
  123.   {
  124.     super.paint(gr);
  125.  
  126.     for (int x=0;x<occupied.length;x++)
  127.       for (int y=0;y<occupied[0].length;y++)
  128.         if (occupied[x][y]==1)
  129.         {
  130.           // draw cell
  131.           gr.setColor(tokenBorderColors[colorsCoords[x][y]]);
  132.           gr.fillRect(x*30,y*30,30,30);
  133.           gr.setColor(tokenInnerColors[colorsCoords[x][y]]);
  134.           gr.fillRect(x*30+4,y*30+4,24,24);
  135. //          gr.setColor(tokenBorderColors[colorsCoords[x][y]]);          
  136. //          gr.fillRect(x*36+13,y*36+13,10,10);
  137.          
  138.         }
  139.         else
  140.         {
  141.           // erase cell
  142.           Color gridInnerColor = new Color(47,47,47);  
  143.           gr.setColor(Color.BLACK);
  144.           gr.fillRect(x*30,y*30,30,30);
  145.           gr.setColor(gridInnerColor);
  146.           gr.fillRect(x*30+2,y*30+2,28,28);
  147.         }
  148.   }
  149.  
  150.   public boolean isValidPosition(int x,int y, int tokenNumber, int rotationNumber)
  151.   {
  152.     int[] xArray = xRotationArray[tokenNumber][rotationNumber];
  153.     int[] yArray = yRotationArray[tokenNumber][rotationNumber];
  154.      
  155.     for (int i=0;i<4;i++)  // loop over the four cells
  156.     {
  157.       int xCell = x+xArray[i];
  158.       int yCell = y+yArray[i];
  159.  
  160.       // range check
  161.       if (xCell<0) return false;
  162.       if (xCell>=10) return false;
  163.       if (yCell<0) return false;
  164.       if (yCell>=20) return false;
  165.  
  166.       // occupancy check
  167.       if (occupied[xCell][yCell]==1) return false;
  168.     }
  169.     return true;
  170.   }
  171.  
  172.   public void clearCompleteRow(int[] completed)
  173.   {
  174.     // must loop for odd number of times.
  175.     // toggle sequence : 0,1,0,1,0
  176.     for (int blinking=0;blinking<5;blinking++)
  177.     {
  178.       for (int i=0;i<completed.length;i++)
  179.       {
  180.         if (completed[i]==1)
  181.         {
  182.           for (int x=0;x<10;x++)
  183.           {
  184.             // toggle the occupancy array
  185.             occupied[x][i]= 0;
  186.           }
  187.         }
  188.       }
  189.       repaint();
  190.       try { Thread.sleep(100); } catch (Exception ignore) {}
  191.     }
  192.   }
  193.  
  194.   public void shiftDown(int[] completed)
  195.   {
  196.     for (int row=0;row<completed.length;row++)
  197.     {
  198.       if (completed[row]==1)
  199.       {
  200.         for (int y=row;y>=1;y--)
  201.         {
  202.           for (int x=0;x<10;x++)
  203.           {
  204.             occupied[x][y] = occupied[x][y-1];
  205.             colorsCoords[x][y] = colorsCoords[x][y-1];
  206.           }
  207.         }
  208.       }
  209.     }
  210.   }
  211.  
  212.   public void checkRowCompletion()
  213.   {
  214.     int[] complete = new int[20];
  215.     for (int y=0;y<20;y++)  // 20 rows
  216.     {
  217.       int filledCell = 0;
  218.       for (int x=0;x<10;x++)  // 10 columns
  219.       {
  220.         if (occupied[x][y]==1) filledCell++;
  221.         if (filledCell==10) // row completed
  222.         {
  223.           complete[y]=1;
  224.         }
  225.       }
  226.     }
  227.  
  228.     clearCompleteRow(complete);
  229.  
  230.     shiftDown(complete);  
  231.  
  232.     addScore(complete);
  233.   }
  234.  
  235.   void addScore(int[] complete)
  236.   {
  237.     int bonus=10;  // score for the first completed line
  238.     for (int row=0;row<complete.length;row++)
  239.     {
  240.       if (complete[row]==1)
  241.       {
  242.         lineCompleted += 1;
  243.         score+=bonus;
  244.         bonus*=2;  // double the bonus for every additional line
  245.       }
  246.     }
  247.  
  248.     // advance level for every 3 completed lines
  249.     level = lineCompleted/3;  
  250.     if (level>30) { lineCompleted=0; level=0; }  // MAX LEVEL
  251.  
  252.     scoreLabel.setText("SCORE : "+score);
  253.     levelLabel.setText("LEVEL : "+level);
  254.   }
  255.  
  256.   boolean gameOver=false;
  257.   public void addFallingToken()
  258.   {
  259.     int x=4,y=0;
  260.     int tokenNumber, rotationNumber;
  261.  
  262.  
  263.       tokenNumber = (int) (7*Math.random());
  264.       rotationNumber = 0;
  265.      
  266.  
  267.     int color = tokenNumber;  
  268.     int[] xArray = xRotationArray[tokenNumber][rotationNumber];
  269.     int[] yArray = yRotationArray[tokenNumber][rotationNumber];
  270.    
  271.     if (!isValidPosition(x,y,tokenNumber,rotationNumber))
  272.     {
  273.       gameOver=true;
  274.       drawToken(x,y,xArray,yArray, color);
  275.       repaint();
  276.       return;
  277.     }
  278.  
  279.     drawToken(x,y,xArray,yArray, color);
  280.     repaint();
  281.    
  282.     int delay=30;  // mini second
  283.     int frame=0;
  284.     boolean reachFloor=false;
  285.     while (!reachFloor)
  286.     {
  287.       try { Thread.sleep(delay); } catch (Exception ignore) {}
  288.       eraseToken(x,y,xArray,yArray);
  289.  
  290.       // add keyboard control
  291.       if (leftPressed && isValidPosition(x-1,y,tokenNumber,rotationNumber)) {
  292.           try { Thread.sleep(85); } catch (Exception ignore) {}
  293.           x -= 1;
  294.       }
  295.       if (rightPressed && isValidPosition(x+1,y,tokenNumber,rotationNumber)) {
  296.           try { Thread.sleep(85); } catch (Exception ignore) {}      
  297.           x += 1;
  298.       }
  299.       if (downPressed && isValidPosition(x,y+1,tokenNumber,rotationNumber)) {
  300.           try { Thread.sleep(12); } catch (Exception ignore) {}              
  301.           y += 1;
  302.       }
  303.       if (spacePressed && isValidPosition(x,y,tokenNumber,(rotationNumber+1)%4))
  304.       {
  305.         rotationNumber = (rotationNumber+1)%4;
  306.         xArray = xRotationArray[tokenNumber][rotationNumber];
  307.         yArray = yRotationArray[tokenNumber][rotationNumber];
  308.         spacePressed=false;  
  309.       }
  310.  
  311.       int f=31-level;   // fall for every 31 frames, this value is decreased when level up
  312.       if (frame % f==0) y += 1;  
  313.       if (!isValidPosition(x,y,tokenNumber,rotationNumber)) // reached floor
  314.       {
  315.         reachFloor=true;
  316.         y -= 1;  // restore position
  317.       }
  318.       drawToken(x,y,xArray,yArray, color);
  319.       repaint();
  320.       frame++;
  321.     }
  322.  
  323.   }
  324.  
  325.   public void printGameOver()
  326.   {
  327.     javax.swing.JLabel gameOverLabel = new javax.swing.JLabel("GAME OVER");
  328.     gameOverLabel.setBounds(400,300,250,30);
  329.     gameOverLabel.setFont(fontThree);
  330.     gameOverLabel.setForeground(Color.RED);
  331.     add(gameOverLabel);
  332.     repaint();
  333.   }
  334.  
  335.  
  336.   boolean leftPressed=false;
  337.   boolean rightPressed=false;
  338.   boolean downPressed=false;
  339.   boolean spacePressed=false;
  340.  
  341.   // must implements this method for KeyListener
  342.   public void keyPressed(java.awt.event.KeyEvent event)
  343.   {
  344. //    System.out.println(event);
  345.     if (event.getKeyCode()==37) // left arrow
  346.     {
  347.       leftPressed=true;
  348.     }
  349.     if (event.getKeyCode()==39) // right arrow
  350.     {
  351.       rightPressed=true;
  352.     }
  353.     if (event.getKeyCode()==40) // down arrow
  354.     {
  355.       downPressed=true;
  356.     }
  357.     if (event.getKeyCode()==32) // space
  358.     {
  359.       spacePressed=true;
  360.     }
  361.  
  362.   }
  363.  
  364.   // must implements this method for KeyListener
  365.   public void keyReleased(java.awt.event.KeyEvent event)
  366.   {
  367. //    System.out.println(event);
  368.  
  369.     if (event.getKeyCode()==37) // left arrow
  370.     {
  371.       leftPressed=false;
  372.     }
  373.     if (event.getKeyCode()==39) // right arrow
  374.     {
  375.       rightPressed=false;
  376.     }
  377.     if (event.getKeyCode()==40) // down arrow
  378.     {
  379.       downPressed=false;
  380.     }
  381.     if (event.getKeyCode()==32) // space
  382.     {
  383.       spacePressed=false;
  384.     }
  385.  
  386.   }
  387.  
  388.   // must implements this method for KeyListener
  389.   public void keyTyped(java.awt.event.KeyEvent event)
  390.   {
  391. //    System.out.println(event);
  392.   }
  393.  
  394.  
  395.   public static void main(String[] args) throws Exception
  396.   {
  397.     javax.swing.JFrame window = new javax.swing.JFrame("Team ANSUROER");
  398.     window.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
  399.  
  400.     Tetris tetris = new Tetris();
  401.     tetris.init();
  402.  
  403.     window.add(tetris);
  404.     window.pack();
  405.     window.setVisible(true);
  406.  
  407.     try { Thread.sleep(1000); } catch (Exception ignore) {}
  408.  
  409.     window.addKeyListener(tetris);  // listen to keyboard event
  410.  
  411.     tetris.gameOver=false;
  412.     while (!tetris.gameOver)
  413.     {
  414.       tetris.addFallingToken();
  415.       tetris.checkRowCompletion();
  416.     }
  417.  
  418.     tetris.printGameOver();
  419.  
  420.   }
  421.  
  422. }
Advertisement
Add Comment
Please, Sign In to add comment