Oto mam zaszczyt zaprezentować Pong w wersji hoRacego.
Mój pierwszy raz z (n)aplletami javy.

Gra niewątpliwie wypełnia lukę w przemyśle komputerowej rozrywki.
Kliknij poniżej, aby doznać olśnienia:

W razie jakby coś nie działało, musisz zassać wirtualną furę Javy, np. stąd.
Kod źródłowy dostępny w pełnej wersji tego postu. Kliknij więc ;)
  1. import java.awt.*;
  2. import java.applet.*;
  3. import java.awt.event.*;
  4.  
  5.  
  6.  
  7. public class klasa extends Applet implements MouseMotionListener, ActionListener, ItemListener, Runnable, MouseListener
  8. {
  9.  TextField field1; // pierwszy argument
  10.  TextField field2; // drugi argument
  11.  Choice rodzaj_paletki, inteligencja;
  12.  int ai, pal;
  13.  Panel p1;
  14.  int Height=640,Width=480, pkt_a, pkt_b, mX, mY, rog_x, rog_y;
  15.  float p1x, p1y, p2x, p2y;
  16.  Point p;
  17.  String string;
  18.  Button cheat, reset;
  19.  private Image dbImage;
  20.  private Graphics dbg;
  21.  float wspolczynnik;
  22.  int game=3;
  23.  
  24.  float ball_x;
  25.  float ball_y;
  26.  int radius;
  27.   // Szybkosci piłki
  28.  float speed_x;
  29.  float speed_y;
  30.   // Szybkość przeciwnika
  31.  float opp_speed;
  32.   // Szybkość: nim większa wartość, tym wolniej.
  33.  int time;
  34.   // Rozmiary paletki
  35.  int pHeight = 20, pWidth = 100;
  36.   //Ograniczenia planszy
  37.  float breakRight; //590
  38.  float breakLeft; //50
  39.  int breakTop=60+radius; //50
  40.  int breakDown=460-radius; //470
  41.  //Zmienne potrzebne do obliczania odbicia
  42.  int roznica;
  43.  float odlegloscOdSrodka;
  44.  
  45.  int punkt;
  46.  
  47.  String pal1="Liniowa – dodawanie", pal2="Sektorowa – sztywna", pal3="Liniowa – mnożenie";
  48.  String ai1="Idealne AI", ai2="AI z ograniczoną szybkością", ai3="Tryb samotnika";
  49.  
  50.  
  51.  
  52.  
  53.  public void init()
  54.  {
  55.   setBackground(Color.red);
  56.   addMouseMotionListener(this);
  57.   addMouseListener(this);
  58.   setSize(Height,Width);
  59.  
  60.   p1x= rog_x+10; //zawsze tak ma być
  61.   p2x = Height-40;
  62.   p2y = Width / 2;
  63.  
  64.   speed_y=(float)Math.random();
  65.   speed_x=1;
  66.   pkt_a=0;
  67.   pkt_b=0;
  68.   rog_x=10;
  69.   rog_y=50;
  70.   ball_x = (Height/2)-10;
  71.   ball_y = (Width/2);
  72.   radius = 10;
  73.    // Szybkość przeciwnika
  74.   opp_speed = (float)1.6;
  75.    // Szybkość: nim większa wartość, tym wolniej.
  76.   time = 2;
  77.   punkt=0;
  78.   //Domyśle paletki i inteligencje
  79.   ai=1;
  80.   pal=1;
  81.  
  82.  
  83.  
  84.   breakRight=p2x - radius; // LINIA CIĘCIA PRAWA
  85.   breakLeft=p1x + radius +20; // LINIA CIĘCIA LEWA
  86.  
  87.  
  88.  
  89.   p1 = new Panel();
  90.   field1 = new TextField(5); // pierwszy argument
  91.   field2 = new TextField(5); // drugi argument
  92.   rodzaj_paletki = new Choice();
  93.   rodzaj_paletki.add(pal1);
  94.   rodzaj_paletki.add(pal2);
  95.   rodzaj_paletki.add(pal3);
  96.   rodzaj_paletki.addItemListener(this);
  97.   inteligencja = new Choice();
  98.   inteligencja.add(ai1);
  99.   inteligencja.add(ai2);
  100.   inteligencja.add(ai3);
  101.   inteligencja.addItemListener(this);
  102.   cheat = new Button("cheat");
  103.   cheat.addActionListener(this);
  104.   reset = new Button("reset");
  105.   reset.addActionListener(this);
  106.  
  107.   p1.setLayout(new FlowLayout());
  108.   p1.setBackground(Color.yellow); // panel p1 kolor zólty
  109.   p1.add(rodzaj_paletki);
  110.   p1.add(new Label("Gracz 1:"));
  111.   p1.add(field1);
  112.   p1.add(new Label("Gracz 2:"));
  113.   p1.add(field2);
  114.   //p1.add(cheat);
  115.   p1.add(reset);
  116.   p1.add(inteligencja);
  117.   setVisible(true);
  118.   p1.setBounds(0, 0, 100, 20);
  119.   add(p1);
  120.  
  121.  }
  122.  public void start() {
  123.   Thread th = new Thread (this);
  124.   th.start ();
  125.  
  126.  }
  127.  
  128.  public void stop() { }
  129.  
  130.  public void destroy() { }
  131.  
  132.  public void run () {
  133.   while(true)
  134.   {
  135.    if (game==1) // GRA WŁASCIWA
  136.    {
  137.    
  138.     if (ball_y >= breakTop) // od GÓRY ODBICIE
  139.     {
  140.      speed_y = -speed_y;
  141.     }
  142.    
  143.     if (ball_y <= breakDown) // od DOŁU ODBICIE
  144.     {
  145.      speed_y = -speed_y;
  146.     }
  147.    
  148.     if ((ball_x >= breakRight)|(ball_x <= breakLeft))
  149.     {
  150.      
  151.      // SPRAWDZENIE CZY NIE UDERZA W PALETKE
  152.      // I TRZEBA NALICZYĆ PUNKT
  153.      
  154.      if (ball_x >= breakRight)
  155.      {
  156.       roznica = (int)ball_y - (int)p2y;  //ROZNICA ODLEGLOSCI PRAWEJ PALETKI
  157.      } else if (ball_x <= breakLeft)
  158.      {
  159.       roznica = (int)ball_y - (int)p1y;  //ROZNICA ODLEGLOSCI LEWEJ PALETKI
  160.      }
  161.      
  162.      if(roznica<0 | roznica > 100)  // TRZEBA PUNKT
  163.      {
  164.       if (ball_x >= breakRight) // PUNKT DLA GRACZA 1 / 2gi wtopił
  165.       {
  166.       pkt_a++;
  167.       System.out.println("PUNKT DLA GRACZA 1");
  168.       punkt=1;
  169.  
  170.       }
  171.      
  172.       if (ball_x <= breakLeft)  // PUNKT DLA GRACZA 2 / 1szy wtopił
  173.       {
  174.       pkt_b++;
  175.       System.out.println("PUNKT DLA GRACZA 2");
  176.       punkt=2;
  177.       }
  178.      } else  // KULKA TRAFIŁA W PALETKE
  179.      {
  180.       // PATA PONY :)
  181.      
  182.       if (ball_x >= breakRight) //  Odbicie od 2
  183.       {
  184.        punkt=4;
  185.       }
  186.      
  187.       if (ball_x <= breakLeft)  //  Odbicie od 1
  188.       {
  189.        punkt=3;
  190.       }
  191.      
  192.       // LICZENIE SZATAŃSKICH WSPÓŁCZYNNIKÓW ODLEGŁOŚCI
  193.      
  194.       if (ball_x >= breakRight)
  195.       {
  196.        odlegloscOdSrodka = p2y + (pWidth / 2) - ball_y;  //ROZNICA ODLEGLOSCI PRAWEJ PALETKI
  197.       } else if (ball_x <= breakLeft)
  198.       {
  199.        odlegloscOdSrodka = p1y + (pWidth / 2) - ball_y;  //ROZNICA ODLEGLOSCI LEWEJ PALETKI
  200.       }
  201.      
  202.       wspolczynnik = (odlegloscOdSrodka / (pWidth / 2));
  203.  
  204.      
  205.      
  206.  
  207.       switch(pal)
  208.       {
  209.      
  210.        case(1): // Liniowa – dodawanie
  211.         speed_y = (speed_y - wspolczynnik);  // MODYFIKACJA TRAJEKTORII
  212.        break;
  213.        
  214.        case(2): // Sektorowa – stała
  215.         if (roznica >= 0 & roznica < 20)
  216.         {
  217.          speed_y = -2;
  218.          System.out.println("Strefa 1: Mocno do góry");
  219.         }
  220.         else if (roznica >= 20 & roznica < 40)
  221.         {
  222.          speed_y = (float)-1;
  223.          System.out.println("Strefa 2: Średnio do góry");
  224.         }
  225.         else if (roznica >= 40 & roznica < 60)
  226.         {
  227.          //speed_y = speed_y;
  228.          System.out.println("Strefa 3: Bez zmian");
  229.         }
  230.         else if (roznica >= 60 & roznica < 80)
  231.         {
  232.          speed_y = (float)1;
  233.          System.out.println("Strefa 4: Średnio na dół");
  234.         }
  235.         else if (roznica >= 80 & roznica < 100)
  236.         {
  237.          speed_y = (float)2;
  238.          System.out.println("Strefa 5: Mocno na dół");
  239.         }
  240.        break;
  241.        
  242.        case(3): // Liniowa – mnożenie
  243.         speed_y = (speed_y * wspolczynnik*4);  // MODYFIKACJA TRAJEKTORII
  244.        break;
  245.       }
  246.      
  247.  
  248.  
  249.      
  250.  
  251.      
  252.        // DEBUGOWANIE
  253.       System.out.print("odlegloscOdSrodka: ");
  254.       System.out.print(odlegloscOdSrodka);
  255.       System.out.print("; Ball_y: ");
  256.       System.out.print(ball_y);
  257.       System.out.print("; Speed_x: ");
  258.       System.out.print(speed_x);
  259.       System.out.print("; Speed_y: ");
  260.       System.out.print(speed_y);
  261.       System.out.print("; Wspolcz:");
  262.       System.out.println(wspolczynnik);
  263.      }
  264.      speed_x = -speed_x;
  265.     }
  266.    
  267.  
  268.     // PRZESUNIĘCIE KULKI
  269.     ball_x = ball_x + speed_x;
  270.     ball_y = ball_y + speed_y;
  271.    
  272.     repaint();
  273.     try
  274.     {
  275.     Thread.sleep (time);
  276.     }
  277.     catch (InterruptedException ex)
  278.     {
  279.  
  280.     }
  281.    }
  282.    
  283.    if (game==2)
  284.    {
  285.    
  286.    }
  287.   }
  288.  
  289.  }
  290.  
  291.  public void paint(Graphics g)
  292.  {
  293.  
  294.   // WYPEŁNIENIE TEKSTEM
  295.    field1.setText(Integer.toString(pkt_a));
  296.    field2.setText(Integer.toString(pkt_b));
  297.   // PLANSZA
  298.    g.setColor(Color.green);
  299.    g.fillRoundRect(rog_x, rog_y, Height-20, Width-60, 20, 20);
  300.    g.setColor(Color.black);
  301.    // LINIE ŚRODKA
  302.    g.drawLine((Height/2)-8, rog_y ,(Height/2)-8, Width-10);
  303.    g.drawLine((Height/2)-12, rog_y ,(Height/2)-12, Width-10);
  304.    // KÓŁKO NA ŚRODKU
  305.    //g.drawOval((Height/2)-10, rog_y, 100, 100);
  306.    // REKLAMA
  307.    
  308.   if (game==1) // ************* GRA WŁASCIWA
  309.   {    
  310.    // PIŁKA
  311.     // piłka właściwa
  312.     g.setColor(Color.yellow);
  313.     g.fillOval((int)ball_x - radius, (int)ball_y - radius, 2 * radius, 2 * radius);
  314.     // obwódka
  315.     g.setColor(Color.black);
  316.     g.drawOval((int)ball_x - radius, (int)ball_y - radius, 2 * radius, 2 * radius);
  317.  
  318.    //***************************
  319.    // PALETKA GRACZA 1
  320.     g.setColor(Color.black);
  321.    
  322.    
  323.    
  324.     //Sprawdzanie ograniczeń, aby nie wyjeżdzało poza
  325.     if(mY < rog_y) p1y=rog_y;  // paletka wykracza za górę
  326.     else if(mY > Width-110) p1y=Width-110;  // paletka wykracza za dół
  327.     else p1y=mY; // normalnie
  328.    
  329.     g.fillRect((int)p1x, (int)p1y, (int)pHeight, (int)pWidth); //PALETKA 1
  330.    
  331.    //***************************
  332.    // PALETKA GRACZA 2 (CPU)
  333.     g.setColor(Color.black);
  334.      
  335.  
  336.      
  337.     switch(ai)
  338.     {
  339.      case(3): // GDY MA PODĄŻAĆ ZA KURSOREM
  340.      p2y = mY;
  341.      break;
  342.      
  343.      case(1): // IDEALNE AI ;) )) Najgenialniejsze i najwspanialsze
  344.      p2y = ball_y-50;
  345.      break;
  346.      
  347.      case(2): // AI z określoną szybkością
  348.      if (p2y >= ball_y) p2y = p2y - opp_speed;   //Piłka wyżej -> idziem do góry
  349.      else if(p2y < ball_y) p2y = p2y + opp_speed ;// Piłka niżej -> idzemy na dół
  350.      break;
  351.     }
  352.    
  353.      
  354.      
  355.      
  356.     //Sprawdzanie ograniczeń, aby nie wyjeżdzało poza pole gry
  357.     if(p2y < rog_y) p2y=rog_y;  // paletka wykracza za górę
  358.     else if(p2y > Width-110) p2y=Width-110;  // paletka wykracza za dół
  359.    
  360.     g.fillRect((int)p2x, (int)p2y, (int)pHeight, (int)pWidth); //PALETKA 2
  361.        
  362.  
  363.  
  364.     // POCHWAŁA GŁUPOTY! i efekty graficzne po PUNKCIE :)
  365.  
  366.      switch(punkt)
  367.      {
  368.       case(1):
  369.        game=2;
  370.       break;
  371.      
  372.       case(2):
  373.        game=2;
  374.       break;
  375.      
  376.       case(3):
  377.       g.setFont(new Font("Tahoma",10,40));
  378.       g.drawString("PATA!", 110, 150);
  379.       break;
  380.      
  381.       case(4):
  382.       g.setFont(new Font("Tahoma",10,40));
  383.       g.drawString("PON!", Height-180, 150);
  384.       break;
  385.      }
  386.    
  387.     g.setFont(new Font("Tahoma",10,10));
  388.     g.drawString("(c) www.hoRacy.art.pl", Height-150, Width-15);
  389.    
  390.   }
  391.  
  392.   if (game==2)
  393.   {
  394.    /*
  395.     int x1,x2,y1,y2;
  396.     for (int it=1;it<1000;it++)
  397.     {
  398.     x1 = (int)((Math.random())*1000)%640;
  399.     x2 = (int)((Math.random())*1000)%640;
  400.     y1 = (int)((Math.random())*1000)%480;
  401.     y2 = (int)((Math.random())*1000)%480;
  402.     g.setColor(Color.DARK_GRAY) ;
  403.     g.drawLine(x1,y1,x2,y2);
  404.     }
  405.    */
  406.    g.setColor(Color.white);
  407.    g.fillRoundRect(150, 180, 330, 100, 10, 10);
  408.    g.setColor(Color.black);
  409.    g.setFont(new Font("Tahoma",100,30));
  410.    switch(punkt)
  411.    {
  412.     case(1):
  413.     g.drawString("Gracz 1: PUNKT!", 200,Width/2);
  414.    
  415.     break;
  416.    
  417.     case(2):
  418.      g.drawString("Gracz 2: PUNKT!", 200,Width/2);
  419.  
  420.     break;
  421.    }
  422.    
  423.  
  424.   }
  425.  
  426.   if (game==3)
  427.   {
  428.    
  429.     int x1,x2,y1,y2;
  430.     for (int it=1;it<10;it++)
  431.     {
  432.     x1 = (int)((Math.random())*1000)%640;
  433.     x2 = (int)((Math.random())*1000)%640;
  434.     y1 = (int)((Math.random())*1000)%480;
  435.     y2 = (int)((Math.random())*1000)%480;
  436.     g.setColor(Color.DARK_GRAY) ;
  437.     g.drawLine(x1,y1,x2,y2);
  438.     repaint();
  439.     }
  440.    
  441.    g.setColor(Color.white);
  442.    g.fillRoundRect(150, 180, 330, 100, 10, 10);
  443.    g.setColor(Color.black);
  444.    g.setFont(new Font("Tahoma",100,20));
  445.    g.drawString("Pong : hoRacy's version", 160,Width/2-20);
  446.    g.setFont(new Font("Arial",100,12));
  447.    g.drawString("kliknij by zagrać", 300,Width/2+20);
  448.  
  449.    
  450.  
  451.   }
  452.    
  453.    
  454.     // ODKOMENTUJ ABY ZOBACZYC FAJNOSC
  455.     //fajnosc();
  456.  
  457.  
  458.  
  459.  
  460.  }
  461.  
  462.  public void update (Graphics g)
  463.  {
  464.   // initialize buffer
  465.   if (dbImage == null)
  466.   {
  467.   dbImage = createImage (this.getSize().width, this.getSize().height);
  468.   dbg = dbImage.getGraphics ();
  469.  
  470.   }
  471.  
  472.   // clear screen in background
  473.   dbg.setColor (getBackground ());
  474.   dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
  475.  
  476.   // draw elements in background
  477.   dbg.setColor (getForeground());
  478.   paint (dbg);
  479.  
  480.   // draw image on the screen
  481.   g.drawImage (dbImage, 0, 0, this);
  482.  
  483.  }
  484.  
  485.  public void mouseDragged(MouseEvent evt)
  486.  {
  487.  
  488.  
  489.  }
  490.  
  491.  public void mouseMoved(MouseEvent evt)
  492.  {
  493.   p = evt.getPoint();
  494.   string = "x = " + p.x + "; y = " + p.y;
  495.   mX = p.x;
  496.   mY = p.y;
  497.   //System.out.print("mX: ");System.out.print(mX);System.out.print("; mY: ");System.out.println(mY);
  498.  
  499.   //repaint(p1x, p1y, 20, 100); // TYLKO obszar paletki
  500.  }
  501.  
  502.  public void mouseClicked(MouseEvent evt)
  503.  {
  504.   if(game==2)
  505.   {
  506.    game=1;
  507.    punkt=0;
  508.    reset("pozycje");
  509.   }
  510.   if(game==3)
  511.   {
  512.    reset("all");
  513.   }
  514.  }
  515.  public void mouseExited(MouseEvent evt)
  516.  {
  517.  }
  518.  public void mousePressed(MouseEvent evt)
  519.  {
  520.  }
  521.  public void mouseReleased(MouseEvent evt)
  522.  {
  523.  }
  524.  public void mouseEntered(MouseEvent evt)
  525.  {
  526.  }
  527.  
  528.  public void actionPerformed(ActionEvent evt)
  529.  {
  530.   String label = evt.getActionCommand();
  531.  // Obsługa PRZYCISKU cheat
  532.   if (label.equals("cheat")) {
  533.    try {
  534.     pkt_a = Integer.parseInt(field1.getText());
  535.     pkt_b = Integer.parseInt(field2.getText());
  536.     System.out.println("Kliknieto CHEAT");
  537.     System.out.println(pkt_a);System.out.println(pkt_b);
  538.     //repaint();
  539.    } catch (NumberFormatException e) {
  540.     System.out.println("Blad argumentow CHEAT!");
  541.    }
  542.   }
  543.  
  544.   // Obsługa PRZYCISKU RESET
  545.   if (label.equals("reset")) {
  546.    try {
  547.     reset("all");
  548.  
  549.     System.out.println("Kliknieto RESET");
  550.     System.out.println(pkt_a);System.out.println(pkt_b);
  551.     //repaint();
  552.      
  553.  
  554.    } catch (NumberFormatException e) {
  555.     System.out.println("Blad argumentow RESET!");
  556.    }
  557.   }
  558.  }
  559.  
  560.  public void itemStateChanged(ItemEvent e)
  561.  {
  562.   String ai_spr=inteligencja.getSelectedItem();
  563.   String pal_spr=rodzaj_paletki.getSelectedItem();
  564.  
  565.   if (ai_spr==ai1) ai=1;
  566.   else if(ai_spr==ai2) ai=2;
  567.   else if(ai_spr==ai3) ai=3;
  568.  
  569.   if (pal_spr==pal1) pal=1;
  570.   else if(pal_spr==pal2) pal=2;
  571.   else if(pal_spr==pal3) pal=3;
  572.    
  573.  }
  574.  
  575.  public void reset(String co)
  576.  {
  577.   if (co=="all")
  578.   {
  579.    game=1;
  580.    speed_y=(float)Math.random();
  581.    speed_x=1;
  582.    pkt_a=0;
  583.    pkt_b=0;
  584.    rog_x=10;
  585.    rog_y=50;
  586.    ball_x = (Height/2)-10;
  587.    ball_y = (Width/2);
  588.    radius = 10;
  589.    opp_speed = (float)1.6;
  590.    time = 2;
  591.    punkt=0;
  592.   } else if (co=="pozycje")
  593.   {
  594.    speed_y=(float)Math.random();
  595.    speed_x=1;
  596.    rog_x=10;
  597.    rog_y=50;
  598.    ball_x = (Height/2)-10;
  599.    ball_y = (Width/2);
  600.    radius = 10;
  601.    opp_speed = (float)1.6;
  602.    time = 2;
  603.    punkt=0;
  604.   }
  605.  
  606.  }
  607.  
  608. }
Be Sociable, Share!
Tagi: , , , ,
Pozostaw odpowiedź