2013-10-31 37 views
1

我有我的tromino程序。但是,現在它需要轉換爲圖形(我最後留下)。我很困惑如何做到這一點,我知道一些關於圖形的基礎知識,但看看我的程序,似乎我可能需要做很多修改才能使其工作。使用圖形的Tromino程序

有沒有簡單的方法來做到這一點? 基本上我需要將我現在作爲數字的trominos轉換成一個棋盤(大小由用戶指定)。不足的廣場是任何顏色,表明它是缺陷廣場的位置。下面是代碼:

import java.util.*; 

    public class tromino { 

     private int[][] grid; 
     private int currentNum; 

     // Pre-condition: size must be a perfect power of 2 and 0<=x<size, 0<=y<size 
     // Post-condition: creates an empty tromino object with dimensions size x size. 
     public tromino(int size, int x, int y) { 

      int actualsize = 1; 
      while (actualsize < size) actualsize*=2; 

      // Make sure the grid size is a perfect power of 2. 
      grid = new int[actualsize][actualsize]; 
      currentNum = 1; 

      // Fill in the grid with all empty squares. 
      for (int i=0; i<actualsize; i++) { 
       for (int j=0; j<actualsize; j++) { 
        grid[i][j] = 0; 
       } 
      } 

      // This represents the original hole in the tromino. 
      grid[x][y] = -1; 
     } 

     // Wrapper call for recursive method. 
     public void tile() { 
      tileRec(grid.length, 0, 0); 
     } 

     private void tileRec(int size, int topx, int topy) { 

      // No recursive case needed here, just fill in your one tromino... 
      if (size == 2) { 

       // Fill in the one necessary tromino. The hole is identified by a 
       // non-zero number, so don't fill in that one square. 
       for (int i=0; i<size; i++) 
        for (int j=0; j<size; j++) 
         if (grid[topx+i][topy+j] == 0) 
          grid[topx+i][topy+j] = currentNum; 

       // Advance to the next tromino. 
       currentNum++; 
      } 

      // Recursive case... 
      else { 

       // Find coordinates of missing hole 
       int savex=topx, savey=topy; 

       for (int x=topx; x<topx+size; x++) 
        for (int y=topy; y<topy+size; y++) 
         if (grid[x][y] != 0) { 
          savex = x; 
          savey = y; 
         } 

       // Hole in upper left quadrant.  
       if (savex < topx + size/2 && savey < topy + size/2) { 

        // Recursively tile upper left quadrant. 
        tileRec(size/2, topx, topy); 

        // Fill in middle tromino 
        grid[topx+size/2][topy+size/2-1] = currentNum; 
        grid[topx+size/2][topy+size/2] = currentNum; 
        grid[topx+size/2-1][topy+size/2] = currentNum; 

        // Advance to the next tromino 
        currentNum++; 

        // Now we can make our three other recursive calls. 
        tileRec(size/2, topx, topy+size/2); 
        tileRec(size/2, topx+size/2, topy); 
        tileRec(size/2, topx+size/2, topy+size/2); 

       } 

       // Hole in upper right quadrant 
       else if (savex < topx + size/2 && savey >= topy + size/2) { 

        // Recursively tile upper right quadrant. 
        tileRec(size/2, topx, topy+size/2); 

        // Fill in middle tromino 
        grid[topx+size/2][topy+size/2-1] = currentNum; 
        grid[topx+size/2][topy+size/2] = currentNum; 
        grid[topx+size/2-1][topy+size/2-1] = currentNum; 

        // Advance to the next tromino 
        currentNum++; 

        // Now we can make our three other recursive calls. 
        tileRec(size/2, topx, topy); 
        tileRec(size/2, topx+size/2, topy); 
        tileRec(size/2, topx+size/2, topy+size/2); 

       } 

       // Hole in bottom left quadrant 
       else if (savex >= topx + size/2 && savey < topy + size/2) { 

        // Recursively tile bottom left quadrant. 
        tileRec(size/2, topx+size/2, topy); 

        // Fill in middle tromino 
        grid[topx+size/2-1][topy+size/2] = currentNum; 
        grid[topx+size/2][topy+size/2] = currentNum; 
        grid[topx+size/2-1][topy+size/2-1] = currentNum; 

        // Advance to the next tromino 
        currentNum++; 

        // Now we can make our three other recursive calls. 
        tileRec(size/2, topx, topy); 
        tileRec(size/2, topx, topy+size/2); 
        tileRec(size/2, topx+size/2, topy+size/2); 
       } 
       else { 

        // Recursively tile bottom right quadrant. 
        tileRec(size/2, topx+size/2, topy+size/2); 

        // Fill in middle tromino 
        grid[topx+size/2-1][topy+size/2] = currentNum; 
        grid[topx+size/2][topy+size/2-1] = currentNum; 
        grid[topx+size/2-1][topy+size/2-1] = currentNum; 

        // Advance to the next tromino 
        currentNum++; 

        // Now we can make our three other recursive calls. 
        tileRec(size/2, topx+size/2, topy); 
        tileRec(size/2, topx, topy+size/2); 
        tileRec(size/2, topx, topy); 
       } 

      } // end large if-else 

     } // end tileRec 


     // Prints out the current object. 
     public void print() { 

      for (int i=0; i<grid.length; i++) { 
       for (int j=0; j<grid[i].length; j++) 
        System.out.print(grid[i][j] + "\t"); 
       System.out.println(); 
      } 
     } 

     public static void main(String[] args) { 

      Scanner stdin = new Scanner(System.in); 

      // Get user input... 
      System.out.println("How big do you want your Tromino grid?"); 
      System.out.println("Please enter a perfect power of 2."); 
      int size = stdin.nextInt(); 

      System.out.println("Where do you want the hole?"); 
      System.out.println("Answer with an x and y coordinate separated by spaces."); 
      int x = stdin.nextInt(); 
      int y = stdin.nextInt(); 

      // Create our object and tile it! 
      tromino thisguy = new tromino(size, x, y); 
      thisguy.tile(); 

      // Print out the trominoed grid. 
      System.out.println("Here's your final grid:\n"); 
      thisguy.print(); 

     } 
    } 

更新的圖形,但我仍對如何完成我的代碼混淆?

import java.util.*; 
import java.awt.*; 
import javax.swing.*; 
class DrawingPanelTest2{ 
    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     double pw = input.nextDouble(); 
     myPan panel = new myPan(pw);  //calling class myPan of JPanel (put stuff inside frame) 
     JFrame application = new JFrame(); 
     application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     application.add(panel);   
     application.setSize(400, 400); 
     application.setVisible(true); 
    } 
} 

class myPan extends JPanel{ 
    public double pow;  //pow variable of type double 
    public tri play[];  //constructor intializes tromino 
    public background back; //type background variable back 
    public myPan(double p){ //method calling p 
     pow = p;   //pow = p (method calling pow now) 
     back = new background(p); //back = call to method background w/var p 
     play = new tri[10]; //this is where to create all of the triominoes 
          //example way (rough idea) 

    } 
    public void paintComponent(Graphics g){ //new method of type void 
     super.paintComponent(g);    //refers to parent's method paintCompenent 
     back.paintBackground(g);    //call method paintBackground 
     for(int i = 0; i < play.length; i++){ //paint all of the triominos 
      play[i].paintTri(g);    //paint the trominoes 
     } 
    } 
} 

class background{ 
    public double pow; 
    int across;     //across (row) 
    int up;      //column  
    public boolean filled[][]; 
    public background(double p){ 
     pow = p; 
     filled = new boolean[up][across]; //this is if it is filled with a tri 
              //need to figure out a way to set 
              //the filled ones to "true" 
    } 
    public void paintBackground(Graphics g){ //constructor header w/no return type? passes param g 
     paintComponent(g); 
     } 
     public void paintComponent(Graphics g){ // mutator method w/void return type modifying object g internal state 
//   super.paintComponent(g);   //refers to parent's method paintCompenent(call var g) 
     double num = Math.pow(2,pow);  //exp of 2 
     double across;     //across (row) 
     double up;      //column 
     if(pow % 2 == 0){ //is a square 
      across = Math.pow(num,0.5); 
      up = across; 
     } 
     else{      //not a square 
      double x = Math.floor(pow/2); //largest integer less than or = to exp/2 
      double y = x + 1;    
      across = Math.pow(2,x);  //row = 2^(expo) 
      up = Math.pow(2,y);   //column = 2^(power of 2) 
     } 
     System.out.println(across); 
     System.out.println(up); 
     // 
     // 
     double wid = 400/across; //width of one 
     double hi = 400/up; //height of one 
     double nowX = 0; 
     double nowY = 0; 
     for(int i = 0; i < up; i++){ //top to bottom 
      nowX = 0; 
      for(int j = 0; j < across; j++){ 
       g.setColor(Color.BLACK); 
       g.drawRect((int)nowX, (int)nowY, (int)wid, (int)hi); 
       if(filled[i][j] == true){ //<--how to check this using my "filled" array? 
        g.setColor(Color.GRAY); 
        g.fillRect((int)nowX, (int)nowY, (int)wid, (int)hi); 
       } 
       else{//the square is not ok 
        g.setColor(Color.RED); 
        g.fillRect((int)nowX, (int)nowY, (int)wid, (int)hi); 
       } 
       nowX = nowX + wid; 
      } 
      nowY = nowY + hi; 
     } 
    } 
    } 


class tri{ 
    public tri(int x, int y, int width, int height){ 

     //initilize variables 

//   int x = 0; 
//   int y = 0; 
//   int width = 0; 
//   int height = 0; 
    } 
    public void paintTri(Graphics g){ 
     //draw it here 
    } 
} 
+0

你應該弄清楚如何首先畫一個tromino。這是最基本的功能。然後,獲取該函數以獲取影響tromino繪製位置的x和y座標。然後,使用該函數在for循環中繪製所有的trominos。三格骨牌。 – sdasdadas

+0

如果你看我的程序中我的tromino被繪製,但它不使用圖形,我的trominoes用數字表示 – jSeesFor3ver

+0

正確的,你可能需要使用Swing並寫一個函數來繪製一個'JPanel'。除非你的老師給你繪畫課(如果這是一堂課)。 – sdasdadas

回答

1

這是一個基本概要。希望這有助於。

import java.util.*; 
import java.awt.*; 
import javax.swing.*; 
class DrawingPanelTest2{ 
    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     double pw = input.nextDouble(); 
     myPan panel = new myPan(pw); 
     JFrame application = new JFrame(); 
     application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     application.add(panel);   
     application.setSize(400, 400); 
     application.setVisible(true); 
    } 
} 

class myPan extends JPanel{ 
    public double pow; 
    public tri play[]; 
    public background back; 
    public myPan(double p){ 
     pow = p; 
     back = new background(p); 
     play = new tri[10]; //this is where you create all of your triominoes 
          //you can do it a different way, but this is an 
          //example 
    } 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     back.paintBackground(g); 
     for(int i = 0; i < play.length; i++){ //paint all of the triominos 
      play[i].paintTri(g); 
     } 
    } 
} 

class background{ 
    public double pow; 
    public boolean filled[][]; 
    public background(double p){ 
     pow = p; 
     filled = new boolean[up][across]; //this is if it is filled with a tri 
              //you'll need to figure out a way to set 
              //the filled ones to "true" 
    } 
    public paintBackground(Graphics g){ 
     public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     double num = Math.pow(2,pow); 
     double across; 
     double up; 
     if(pow % 2 == 0){ //is a square 
      across = Math.pow(num,0.5); 
      up = across; 
     } 
     else{ 
      double x = Math.floor(pow/2); 
      double y = x + 1; 
      across = Math.pow(2,x); 
      up = Math.pow(2,y); 
     } 
     System.out.println(across); 
     System.out.println(up); 
     // 
     // 
     double wid = 400/across; //width of one 
     double hi = 400/up; //height of one 
     double nowX = 0; 
     double nowY = 0; 
     for(int i = 0; i < up; i++){ //top to bottom 
      nowX = 0; 
      for(int j = 0; j < across; j++){ 
       g.setColor(Color.BLACK); 
       g.drawRect((int)nowX, (int)nowY, (int)wid, (int)hi); 
       if(...the square is OK...){ //<--you'll need a way to check this using the "filled" array 
        g.setColor(Color.WHITE); 
        g.fillRect((int)nowX, (int)nowY, (int)wid, (int)hi); 
       } 
       else{//the square is not ok 
        g.setColor(Color.RED); 
        g.fillRect((int)nowX, (int)nowY, (int)wid, (int)hi); 
       } 
       nowX = nowX + wid; 
      } 
      nowY = nowY + hi; 
     } 
    } 
    } 
} 

class tri{ 
    public tri(int x, int y, int width, int height){ 
     //initialize all of your values 
    } 
    public paintTri(Graphics g){ 
     super.paintComponent(g); 
     //draw it here 
    } 
} 
+0

我修復了一些代碼,並在我的答案中更新了它。儘管如此,我對一些部分感到困惑,如何在網格上繪製我的trominos?在模板中,你希望我在Jpanel中明顯地繪製它們,但是然後有一類tri('tromino'),在那裏要求再次繪製trominos?我更新了你的代碼,但輸出是空白窗口,爲什麼是空白? – jSeesFor3ver