顯示具有 Java 標籤的文章。 顯示所有文章
顯示具有 Java 標籤的文章。 顯示所有文章

2010年9月18日 星期六

[Java] 貪食蛇

這是一個非常簡單的畫出移動及按鍵的控制..

import java.awt.*;

import java.awt.event.*;

import java.util.*;

import javax.swing.*;


public class Snake extends JFrame implements Runnable {

  private PaintPanel paintPanel = new PaintPanel();

  private boolean isRunning = true;

  private long[] sleepTime  = {500, 400, 300, 200, 100};

  private int dir = KeyEvent.VK_RIGHT;

  static Snake s = null;

  private LinkedList<Point> snakeList = new LinkedList<Point>();

  private int resolution = 20;

  public Snake() {

    super("Java Snake");

    setSize(500, 500);

    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

    setLocation(((int)dim.getWidth() - 500) / 2, ((int)dim.getHeight() - 500) / 2);

    initComponent();

    initSnake();

    setVisible(true);

    setDefaultCloseOperation(EXIT_ON_CLOSE);

  }

  private void initSnake() {

    snakeList.add(new Point(7,0));

    snakeList.add(new Point(6,0));

    snakeList.add(new Point(5,0));

    snakeList.add(new Point(4,0));

    snakeList.add(new Point(3,0));

    snakeList.add(new Point(2,0));

    snakeList.add(new Point(1,0));

    snakeList.add(new Point(0,0));

  }

  private void initComponent() {

    setLayout(new BorderLayout());

    add(paintPanel);

    addKeyListener(new SnakeKeyListener());

    addComponentListener(new ComponentListener() {

      public void componentHidden(ComponentEvent arg0) {

      }

      public void componentMoved(ComponentEvent arg0) {

      }

      public void componentResized(ComponentEvent arg0) {

        Dimension d = s.getSize();

        if(d.width <= 500) s.setSize(500, 500);

        if(d.height <= 500) s.setSize(500, 500);

      }

      public void componentShown(ComponentEvent arg0) {

      }

    });


  }

  public void run() {

    while(isRunning) {

      try {

        Thread.sleep(sleepTime[0]);

      } catch (InterruptedException e) {

        e.printStackTrace();

      }

      checkBoundary();

      moveSnake();

      paintPanel.repaint();

    }

  }

  private void moveSnake() {

    Point p = snakeList.get(0);

    Point newPoint = null;

    switch(dir) {

      case KeyEvent.VK_RIGHT:

        newPoint = new Point(p.x + 1, p.y);

        snakeList.addFirst(newPoint);

        break;

      case KeyEvent.VK_LEFT:

        newPoint = new Point(p.x - 1, p.y);

        snakeList.addFirst(newPoint);

        break;

      case KeyEvent.VK_UP:

        newPoint = new Point(p.x, p.y - 1);

        snakeList.addFirst(newPoint);

        break;

      case KeyEvent.VK_DOWN:

        newPoint = new Point(p.x, p.y + 1);

        snakeList.addFirst(newPoint);

        break;

    }

    snakeList.removeLast();

  }

  private void checkBoundary() {

    

  }

  public static void main(String[] args) {

      s = new Snake();

    Thread d = new Thread(s);

    d.start();


  }

  private final class SnakeKeyListener extends KeyAdapter {

    public void keyPressed(KeyEvent arg0) {

      int keyDir = arg0.getKeyCode();

      if(keyDir != KeyEvent.VK_UP && keyDir != KeyEvent.VK_DOWN &&

          keyDir != KeyEvent.VK_RIGHT && keyDir != KeyEvent.VK_LEFT) {

        return;

      }

      if((dir == KeyEvent.VK_UP && keyDir == KeyEvent.VK_DOWN) || 

         (dir == KeyEvent.VK_DOWN && keyDir == KeyEvent.VK_UP) ||

         (dir == KeyEvent.VK_RIGHT && keyDir == KeyEvent.VK_LEFT) ||

         (dir == KeyEvent.VK_LEFT && keyDir == KeyEvent.VK_RIGHT)) {

        System.out.println("return");

        return;

      }

      dir = keyDir;

    }

  }

  private final class PaintPanel extends JPanel {


    public PaintPanel() {

      setBackground(Color.DARK_GRAY);

    }

    public void paint(Graphics g) {

      CleanBackground(g);

      PaintSnake(g);

    }

    private void PaintSnake(Graphics g) {

      Dimension d = null;

      d = getSize(d);

      for(int i = 0; i < snakeList.size(); ++i) {

        g.setColor(new Color(0, 255 - i*(255 / (snakeList.size())), 0));

        Point p = snakeList.get(i);

        g.fill3DRect(

            p.x*(int)(d.width / resolution), 

            p.y*(int)(d.height / resolution), 

            d.width / resolution, d.height / resolution, 

            true

            );

      }

    }

    private void CleanBackground(Graphics g) {

      Dimension d = null;

      d = getSize(d);

      g.setColor(Color.RED);

      g.fillRect(0, 0, d.width, d.height);

      g.setColor(Color.DARK_GRAY);

      for(int i = 0; i < d.width / resolution; ++i) {

        for(int j = 0; j < d.height / resolution; ++j){

          g.fill3DRect(

              i*(int)(d.width / resolution), 

              j*(int)(d.height / resolution), 

              d.width / resolution, 

              d.height / resolution, 

              true);

        }

      }

    }

  }

}

2009年8月31日 星期一

Java Queue Implement

雖然原本的Java就有這個東西了,但是還是實作一下。

class JElemrnt {
  public JElemrnt prev;
  public T value;
  public JElemrnt next;
    
  public JElemrnt(T t) {
    prev = null;
    next = null;
    value = t;
  }
}

public class JQueue {
  
  JElemrnt head;
  JElemrnt tail;

  int queueSize;
  public JQueue() {
    queueSize = 0;
    head = null;
    tail = null;
  }
  public void enqueue(T t) {
    JElemrnt tmp = new JElemrnt(t);
    if(queueSize == 0) {
      head = tmp;
      tail = tmp;
    } else {
      tmp.prev = tail;
      tail.next = tmp;
      tail = tmp;
    }
    ++queueSize;
    System.out.println("Enqueue Element: " + t.toString());
    System.out.println("Now queue size is: " + queueSize);
  }
  public T dequeue() {
    if(head == null || tail == null) {
      return null;
    }
    T retVal = tail.value;
    tail = tail.prev;
    //tail.next = null;
    --queueSize;
    System.out.println("Dequeue Element: " + retVal.toString());
    System.out.println("Now queue size is: " + queueSize);
    if(queueSize == 0) {
      head = null;
      tail = null;
    }
    return retVal;
  }
  public T query(int n) {
    if(n > queueSize) return null;
    return null;
  }
  public static void main(String[] argv) {
    System.out.println("Starting queue demo...");
    JQueue q = new JQueue();
    Integer i1 = new Integer(1);
    Integer i2 = new Integer(2);
    Integer i3 = new Integer(3);
    q.enqueue(i1);
    q.enqueue(i2);
    Integer de = q.dequeue();
    q.enqueue(i3);
    de = q.dequeue();
    de = q.dequeue();
    System.out.println("Ending queue demo...");
  }
}

正多面體座標產生器



public class 正多面體 {
  private static double r = 50;
  
  public static void main(String argv[]) {
    正四面體();
    正六面體();
    正八面體();
    正十二面體();
    正二十面體();
  }

  public static void printPoints(String s, Point3D[] v) {
    System.out.println(s);
    for(int i = 0; i < v.length; ++i) {
      System.out.println("p" + (i+1) + " " + v[i].x + " " + v[i].y + " " + v[i].z);
    }
  }
  
  public static void printLines(String s, int[][] o) {
    System.out.println(s);
    if(o == null) return;
    int c = 0;
    for(int i = 0; i < o.length; ++i) {
      for(int j = 0; j < o[i].length - 1; ++j) {
        System.out.println("l" + (c+1) + " p" + (o[i][j]+1) + " p" + (o[i][j+1]+1));
        c++;
      }
      System.out.println("l" + (c+1) + " p" + (o[i][o[i].length-1]+1) + " p" + (o[i][0]+1));
      c++;
    }
  }
  
  private static Point3D minus(Point3D p) {
    // TODO Auto-generated method stub
    return new Point3D(-p.x, -p.y, -p.z);
  }
  
  private static void 正四面體() {
    // TODO Auto-generated method stub
    double sq2 = Math.sqrt(2.0), sq3 = Math.sqrt(3.0); 
    Point3D[] Vt = new Point3D[4];
    Vt[0] = new Point3D(0, r, 0); 
    Vt[1] = new Point3D(0, -r/3, r*2*sq2/3); 
    Vt[2] = new Point3D(r*sq2/sq3, -r/3, -r*sq2/3); 
    Vt[3] = new Point3D(-r*sq2/sq3, -r/3, -r*sq2/3); 
     
    int[][] ord = {{0, 1, 2}, {0, 2, 3}, {0, 3, 1}, {1, 3, 2}};
    printPoints("正四面體", Vt);
    printLines("正四面體", ord);
  }

  
  
  private static void 正六面體() {
    // TODO Auto-generated method stub
    double sq2 = Math.sqrt(2.0), sq3 = Math.sqrt(3.0); 
    Point3D[] Vt = new Point3D[8];
    Vt[0] = new Point3D(0, r, 0); 
    Vt[1] = new Point3D(0, r/3, r*2*sq2/3); 
    Vt[2] = new Point3D(r*sq2/sq3, r/3, -r*sq2/3); 
    Vt[3] = new Point3D(-r*sq2/sq3, r/3, -r*sq2/3); 
     
    for(int i = 4; i < Vt.length; i++) 
        Vt[i] = minus(Vt[i-4]); 

    int[][] ord = {{0, 1, 7, 2}, {0, 2, 5, 3}, {0, 3, 6, 1}, 
                   {4, 6, 3, 5}, {4, 7, 1, 6}, {4, 5, 2, 7}}; 

    printPoints("正六面體", Vt);
    printLines("正六面體", ord);
  }

  private static void 正八面體() {
    // TODO Auto-generated method stub
    Point3D[] Vt = new Point3D[6];
    Vt[0] = new Point3D(0, r, 0); 
    Vt[1] = new Point3D(0, 0, r); 
    Vt[2] = new Point3D(r, 0, 0); 
     
    for(int i = 3; i < Vt.length; i++) 
        Vt[i] = minus(Vt[i-3]); 
     
    int[][] ord = {{0, 1, 2}, {0, 2, 4}, {0, 4, 5}, {0, 5, 1}, 
                   {3, 5, 4}, {3, 1, 5}, {3, 2, 1}, {3, 4, 2}};
    printPoints("正八面體", Vt);
    printLines("正八面體", ord);

  }

  private static void 正十二面體() {
    // TODO Auto-generated method stub
    double sq3=Math.sqrt(3.0),sq5=Math.sqrt(5.0);
    double t1 = (sq5+1)/2, t2 = (sq5-1)/2; 

    Point3D[] Vt = new Point3D[20];
    Vt[0] = new Point3D(0,r,0); 
    Vt[1] = new Point3D(0,r*sq5/3,r*2/3); 
    Vt[2] = new Point3D(r*sq3/3,r*sq5/3,-r/3); 
    Vt[3] = new Point3D(-r*sq3/3,r*sq5/3,-r/3); 
    Vt[4] = new Point3D(r*sq3/3,r/3,r*sq5/3); 
    Vt[5] = new Point3D(r*t1*sq3/3,r/3,r*t2*t2/3); 
    Vt[6] = new Point3D(r*t2*sq3/3,r/3,-r*t1*t1/3); 
    Vt[7] = new Point3D(-r*t2*sq3/3,r/3,-r*t1*t1/3); 
    Vt[8] = new Point3D(-r*t1*sq3/3,r/3,r*t2*t2/3); 
    Vt[9] = new Point3D(-r*sq3/3,r/3,r*sq5/3); 
    for(int i = 10; i < Vt.length; i++) 
        Vt[i] = minus(Vt[i-10]);
    
    
    int[][]ord = 
            {{ 0, 1, 4, 5, 2},{ 0, 2, 6, 7, 3},{ 0, 3, 8, 9, 1}, 
            { 1, 9,16,17, 4},{ 2, 5,18,19, 6},{ 3, 7,14,15, 8}, 
            {10,12,15,14,11},{10,13,17,16,12},{10,11,19,18,13}, 
            {11,14, 7, 6,19},{12,16, 9, 8,15},{13,18, 5, 4,17}};
    printPoints("正十二面體", Vt);
    printLines("正十二面體", ord);

  }

  private static void 正二十面體() {
    // TODO Auto-generated method stub
     double sq5=Math.sqrt(5.0); 
     double t1 = (sq5+1)/2, t2 = (sq5-1)/2; 
     Point3D[] Vt = new Point3D[12];
     Vt[0] = new Point3D(0,r,0); 
     Vt[1] = new Point3D(0,r/sq5,r*2/sq5); 
     Vt[2] = new Point3D(r*Math.sqrt(t1/sq5),r/sq5,r*t2/sq5); 
     Vt[3] = new Point3D(r*Math.sqrt(t2/sq5),r/sq5,-r*t1/sq5); 
     Vt[4] = new Point3D(-r*Math.sqrt(t2/sq5),r/sq5,-r*t1/sq5); 
     Vt[5] = new Point3D(-r*Math.sqrt(t1/sq5),r/sq5,r*t2/sq5); 
     for(int i = 6; i < Vt.length; i++) 
        Vt[i] = minus(Vt[i-6]); 
     
     int[][]ord = 
              {{0, 1,2},{0, 2,3},{0, 3,4},{ 0, 4, 5},{ 0,5, 1}, 
               {1,10,2},{2,11,3},{3, 7,4},{ 4, 8, 5},{ 5,9, 1}, 
               {6, 8,7},{6, 9,8},{6,10,9},{ 6,11,10},{ 6,7,11}, 
               {7, 8,4},{8, 9,5},{9,10,1},{10,11, 2},{11,7, 3}};
     printPoints("正二十面體", Vt);
     printLines("正二十面體", ord);

  }
  
  static class Point3D {
    public double x, y, z;
    public Point3D() {
      this.x = 0;
      this.y = 0;
      this.z = 0;
    }
    public Point3D(double x, double y, double z) {
      this.x = x;
      this.y = y;
      this.z = z;
    }
  }
}

2009年8月30日 星期日

Java Bézier Cubic Curve

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class CubicBezierCurve extends JFrame {

    private Point[] controlPoint = new Point[4];
    private Point[] curve = new Point[1024];
    private PaintPael paintPanel = null;
    private JLabel location = new JLabel("x: 0  y: 0");
    private static CubicBezierCurve cbc = null;
    private int controlPointCount = 0;
    public CubicBezierCurve() {
        for(int i = 0; i < controlPoint.length; ++i)
            controlPoint[i] = new Point(0, 0);
        InitComponent();
        setBackground(Color.WHITE);
        setSize(640, 480);
        setVisible(true);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }
    private void InitComponent() {
        setLayout(new BorderLayout());
        
        paintPanel = new PaintPael();
        
        add(paintPanel, BorderLayout.CENTER);
        
        Panel eastPanel = new Panel();
        eastPanel.setBackground(Color.BLACK);
        eastPanel.setLayout(new FlowLayout());
        Button restart = new Button("Restart");
        restart.addActionListener(new ButtonListener());
        
        
        eastPanel.add(restart);
        add(eastPanel, BorderLayout.EAST);
        location.setForeground(Color.RED);
        location.setBackground(Color.BLACK);
        add(location, BorderLayout.NORTH);
    }
    
    public Point BezierFunction(double t) {
      
      double tsqure = t * t;
      double tcubic = tsqure * t * t;

      double t1      = (1.0 - t);
      double t1square = t1 * t1; 
      double t1cubic = t1square * t1;
      
        double x = controlPoint[0].x * tcubic +
        3 * controlPoint[1].x * tsqure * t1 +
        3 * controlPoint[2].x * t * t1square+
        controlPoint[3].x * t1cubic;
        
        double y = controlPoint[0].y * t * t * t +
        3 * controlPoint[1].y * tsqure * t1 +
        3 * controlPoint[2].y * t * t1square+
        controlPoint[3].y * t1cubic;
            
        return new Point((int)x, (int)y);
    }
    public void ComputeCurve() {
        double t = 1.0 / 1024.0;
        for(int i = 0; i < curve.length; ++i) {
            curve[i] = BezierFunction(t * i);
        }
    }

    public static void main(String[] argv) {
        cbc = new CubicBezierCurve();
    }
   
    class PaintPael extends JPanel {

        public PaintPael() {
            PanelListener pl = new PanelListener();
            addMouseListener(pl);
            addMouseMotionListener(pl);
            setBackground(Color.BLACK);
        }
        public void paint(Graphics g) {
          super.paint(g);
            g.setClip(0, 0, getWidth(), getHeight());
            PaintControlPoint(g);
            PaintControlLine(g);
            PaintCurve(g);
        }
        private void PaintControlLine(Graphics g) {
            g.setColor(Color.green);
            if(controlPoint[0].x != 0 && controlPoint[0].y != 0 && controlPoint[1].x != 0 && controlPoint[1].y != 0)
                g.drawLine(controlPoint[0].x, controlPoint[0].y, controlPoint[1].x, controlPoint[1].y);
            if(controlPoint[1].x != 0 && controlPoint[1].y != 0 && controlPoint[2].x != 0 && controlPoint[2].y != 0)
                g.drawLine(controlPoint[1].x, controlPoint[1].y, controlPoint[2].x, controlPoint[2].y);
            if(controlPoint[2].x != 0 && controlPoint[2].y != 0 && controlPoint[3].x != 0 && controlPoint[3].y != 0)
                g.drawLine(controlPoint[2].x, controlPoint[2].y, controlPoint[3].x, controlPoint[3].y);
        }
        private void PaintControlPoint(Graphics g) {
            g.setColor(Color.BLUE);
            for(int i = 0; i < controlPoint.length; ++i) {
                if(controlPoint[i] != null && controlPoint[i].x != 0 && controlPoint[i].y != 0) {
                    g.fillOval(controlPoint[i].x - 2, controlPoint[i].y - 2, 4, 4);
                }
            }
        }
        private void PaintCurve(Graphics g) {
            if(curve[0] != null) {
                g.setColor(Color.RED);
                for(int i = 0; i < curve.length; ++i) {
                    g.fillOval(curve[i].x, curve[i].y, 2, 2);
                }
            }
        }
    }
    
    class ButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            for(int i = 0; i < controlPoint.length; ++i) {
                if(controlPoint[i] != null) {
                    controlPoint[i].setLocation(0, 0);
                }
            }
            curve = null;
            curve = new Point[1024];
            //paintPanel.paintImmediately(0, 0, paintPanel.getWidth(), paintPanel.getHeight());
            controlPointCount = 0;
            cbc.repaint();
        }
    }
    
    class PanelListener extends MouseAdapter implements MouseMotionListener {
        @Override
        public void mouseClicked(MouseEvent arg0) {
            for(int i = 0; i < controlPoint.length; ++i) {
                if(controlPoint[i] != null && controlPoint[i].x == 0 && controlPoint[i].y == 0) {
                    controlPoint[i].x = arg0.getX();
                    controlPoint[i].y = arg0.getY();
                    break;
                }
            }
            if(controlPoint[3].x != 0 && controlPoint[3].y != 0 && curve[0] == null) {
                cbc.ComputeCurve();
            }
            controlPointCount ++;
            cbc.repaint();

        }
        @Override
        public void mouseDragged(MouseEvent arg0) {
        }

        @Override
        public void mouseMoved(MouseEvent arg0) {
            location.setText("x: " + arg0.getX() + "  y: " + arg0.getX());
        }
    }
}

Java Quick Sort


public class JQuickSort {

  public static void main(String[] argv) {
    // JQuickSort qs = new JQuickSort(Integer.parseInt(argv[0]));
    JQuickSort qs = new JQuickSort(20);
    qs.start();
  }

  int[] a = null;

  public JQuickSort(int num) {
    a = new int[num];
    for (int i = 0; i < num; ++i) {
      int n = (int) (Math.random() 9999);
      a[i= n;
    }
  }

  int partition(int number[]int left, int right) {
    int i, j, s;
    s = number[right];
    i = left - 1;
    for (j = left; j < right; j++) {
      if (number[j<= s) {
        i++;
        int tmp = number[i];
        number[i= number[j];
        number[j= tmp;
      }
    }
    int tmp = number[i + 1];
    number[i + 1= number[right];
    number[right= tmp;
    return i + 1;
  }

  private void printArray() {
    System.out.print("Array: ");
    for (int i = 0; i < a.length; ++i) {
      System.out.print(a[i" ");
    }
    System.out.println();
  }

  void quicksort(int number[]int left, int right) {
    int q;

    if (left < right) {
      q = partition(number, left, right);
      quicksort(number, left, q - 1);
      quicksort(number, q + 1, right);
    }
  }

  private void start() {
    printArray();
    quicksort(a, 0, a.length - 1);
    printArray();
  }

}

Java Quick Sort


2009年8月27日 星期四

Java Heap Sort

public class HeapSort {
    public static void sort(int[] number) {
        int[] tmp = new int[number.length + 1];
       
        // 配合說明,使用一個有徧移的暫存陣列
        for(int i = 1; i < tmp.length; i++) {
            tmp[i] = number[i-1];  
        }
       
        createHeap(tmp);
       
        int m = number.length;
        while(m > 1) {
            swap(tmp, 1, m);
            m--;

            int p = 1;
            int s = 2 * p;

            while(s <= m) {
                if(s < m && tmp[s+1] < tmp[s])
                    s++;
                if(tmp[p] <= tmp[s])
                    break;
                swap(tmp, p, s);
                p = s;
                s = 2 * p;
            }
        }
       
        // 這邊將排序好的暫存陣列設定回原陣列
for(int i = 0; i < number.length; i++) {
            number[i] = tmp[i+1];  
        }
    }
   
    private static void createHeap(int[] tmp) {
        int[] heap = new int[tmp.length];
       
        for(int i = 0; i < heap.length; i++)
            heap[i] = -1;

        for(int i = 1; i < heap.length; i++) {
            heap[i] = tmp[i];
            int s = i;
            int p = i / 2;
while(s >= 2 && heap[p] > heap[s]) {
                swap(heap, p, s);
                s = p;
                p = s / 2;
            }
        }

        for(int i = 1; i < tmp.length; i++)
            tmp[i] = heap[i];
       
    }
   
    private static void swap(int[] number, int i, int j) {
        int t;
        t = number[i];
        number[i] = number[j];
        number[j] = t;
    }
}