2020. február 25., kedd

Java programozás játék forrása

Bemelegitésnek

Példa ciklusra
for( int i = 0; i < 20; i++ ) {  System.out.println(i);}
vagy
for( int i = 0; i < 50; i++ ){  System.out.println(i + 1);}
Lottó sorsolás véletlen
for( int i = 0; i < 5; i++ ){  System.out.println( (int)(Math.random() * 90) + 1 );}
Páros számok
for( int i = 1; i <= 20; i++ ){  System.out.println(i * 2);}
Másik módszer
for( int i = 0; i < 20; i++ )
{
  System.out.println((i + 1) * 2);
}
És ha az 1-től indulva kell 20 páratlan?

for( int i = 1; i <= 20; i++ )
{
  System.out.println(i * 2 - 1);
}
A párosokból 1-et kivonva páratlanokat kapunk. Vagy 0-tól indulva:

for( int i = 0; i < 20; i++ )
{
  System.out.println(i * 2 + 1);
}
De csak hogy lássuk milyen rugalmas is a for ciklus, lássunk a párosokra egy másik megoldást:

for( int i = 2; i <= 40; i += 2 )
{
  System.out.println(i);
}

Elől tesztelő ciklusra példa
int db = 0;
int szam;
while( db != 10 )
{
  szam = (int)(Math.random() * 100) + 1;
  if( szam % 2 != 0 )
  {
    System.out.println(szam);
    db++;
  }
}

Értelmezzük a programot
kell egy változó, ami azt számolja majd, hogy hány páratlan számot sorsoltunk, mert a párosokkal nem foglalkozunk deklaráltam egy szam nevű változót, ahol az aktuálisan kisorsolt számot tároljuk
a ciklust futási feltétele az, hogy amíg nincs 10 páratlan szám, addig sorsolgasson a ciklusban sorsolok egy számot, és eltárolom miután kisorsoltam, megvizsgálom, hogy páratlan-e ha páratlan, akkor kiírom a sorsolt számot, és növelem eggyel a számlálót ha nem páratlan, akkor a ciklusmagból semmi nem hajtódik végre, mert nem megfelelő a szám és ismét próbálkozik egy sorsolással.

 Számítsuk ki két egész szám osztóját
Nem, nem a prímtényezős alakra bontással oldjuk meg

int szam1 = 660;
int szam2 = 366;
while( szam1 != szam2 )
{
  if( szam1 > szam2 )
  {
    szam1 = szam1 - szam2 ;
  }
  else
  {
    szam2 = szam2 - szam1 ;
  }
}
System.out.println("A ket szam legnagyobb kozos osztoja: " + szam1);

Értelmezzük elsőnek deklarálunk 2 változót a vizsgált számoknak kell egy ciklus azzal a futási feltétellel, hogy addig kell a kivonásokat ismételni, amíg a két szám nem egyenlő ha a szam1 a nagyobb, akkor abból vonjuk ki a szam2-őt fordított esetben a szam2-ből vonjuk ki a szam1-et
amikor a ciklus befejeződik, akkor a két szám bármelyike (mivel egyenlőek) a legnagyobb közös osztót jelenti, amit ki is íratunk Ha észrevetted, az is előfordulhat, hogy a ciklus egyszer sem fut le. Mi van akkor, ha a két szám alapból egyenlő? Akkor is kiírathatom bármelyiket, vagyis a ciklus utáni sorra lép a program és kiírja az egyiket. Az elöl tesztelő ciklusnál lehetséges, hogy a ciklus egyszer sem fut le!!!

Sorsolj ki egy páros számot a [10;50] intervallumból. Azt még egyszerűen megoldjuk, hogy az adott intervallumból sorsoljunk, de azzal a plusz feltétellel már nem tudunk mit kezdeni, hogy ez páros is legyen. Ezért addig sorsolunk, hogy a feltételnek megfelelő számot kapjunk:

int szam;
do
{
  szam = (int)(Math.random() * 41) + 10;
}
while( szam % 2 != 0 );

Nézzük akkor a programot részenként:
sorsolunk egy számot ha a szám 2-vel osztva nem 0 maradékot ad (páratlan), akkor a ciklus újraindul, vagyis megint sorsol egyet a ciklus akkor áll meg, ha a feltétel hamis lesz (páros) Azért jó itt a do-while ciklus, mert mindenképpen sorsolnom kell egy számot ahhoz, hogy megvizsgálhassam, meg kell-e ismételni a sorsolást. Természetesen összetett feltételt is megadhatok. Mondjuk olyan számot sorsoljunk az adott intervallumból, ami 2-vel és 5-tel is osztható:

int szam;
do
{
  szam = (int)(Math.random() * 41) + 10;
}
while( !(szam % 2 == 0 && szam % 5 == 0) );

Itt a ciklus futási feltételeként a kiemelt sorban egy összetett feltételt láthatsz, ami azért nem biztos, hogy annyira egyértelmű, mint amilyennek elsőre tűnik. A ciklus ugye akkor működik, ha a feltétel igaz. De itt eredetileg két részfeltételünk van, 2-vel és 5-tel osztható szám kell. Az már nem jó, ha esetleg egyik, vagy az sem, ha mindkét részfeltétel hamis. Igen ám, de a ciklus futási feltételeként nem azt kell megadni nekünk, amilyen számra nekünk szükségünk van, hanem pont az ellenkezőjét. Azt kell megadni, hogy milyen szám nem jó nekünk! Nézzük akkor lépésenként: szerkesszük meg azt a feltételt, ami nekünk megfelelő (ami összetett feltétel is lehet) negáljuk az egészet Természetesen itt is igaz, hogy ha akarjuk, egyszerűsíthetjük az összetett feltételt a már tanult módon:

while( !(szam % 2 == 0 && szam % 5 == 0) );

vagy ez

while( szam % 2 != 0 || szam % 5 != 0 );   





























Értelmezzétek a program forrását!

     import java.applet.*;
     import java.awt.*;
     public class Game extends Applet implements Runnable
     {
     }
     Thread gameThread;
     int width=400, height=400, MAX=1;
     int currentX[] = new int[MAX];
     int currentY[] = new int[MAX];
     public void start()
     {
          Thread gameThread = new Thread(this);
          gameThread.start();
     }
     public void init()
     {
          currentX[0]=0;
          currentY[0]=0;
     }
     public void run()
     {
     }
     public void paint(Graphics g)
     {
          update(g);
     }
     public void update(Graphics g)
     {
          Graphics2D g2 = (Graphics2D)g;

          // Háttérszín.

          g2.setBackground(Color.black);
          // Clear the applet.
          g2.clearRect(0, 0, width, height);
          // Rajzolószín zöld.
          g2.setColor(Color.green);
          //(X pos, Y pos, Width, Height)
          g2.fillOval(currentX[0], currentY[0], 20,20);
    }
     int speed=10; // Speed at which we will move the objects
     // Mozgatás
     int directionX[] = new int[MAX];
     int directionY[] = new int[MAX];
     long start=0;
     long tick_end_time;
     long tick_duration;
     long sleep_duration;
     static final int MIN_SLEEP_TIME = 10;
     static final int MAX_FPS = 20;
     static final int MAX_MS_PER_FRAME = 1000 / MAX_FPS;
     float fps=0;
     public void init()
     {
          currentX[0]=100;
          currentY[0]=0;
          directionX[0]=1;
          directionY[0]=0;
     }
     public void run()
     {
          while(true){
               start = System.currentTimeMillis();
               for(int i=0; i < MAX; i++){
                    if(directionX[i]==1)
                         currentX[i]+=speed;
                    if(directionX[i]==0)
                         currentX[i]-=speed;
                    if(currentX[i] <= 0)
                         directionX[i]=1;
                    if(currentX[i]+20 >= width)
                        directionX[i]=0;


                    if(directionY[i]==1)

                         currentY[i]+=speed;



                    if(directionY[i]==0)

                         currentY[i]-=speed;



                    if(currentY[i] <= 0)

                         directionY[i]=1;



                    if(currentY[i]+20 >= height)

                         directionY[i]=0;

               }



               repaint();



               tick_end_time = System.currentTimeMillis();

               tick_duration = tick_end_time - start;

               sleep_duration = MAX_MS_PER_FRAME - tick_duration;



               if (sleep_duration < MIN_SLEEP_TIME)

               {

                    sleep_duration = MIN_SLEEP_TIME;

               }

               fps = 1000 / (sleep_duration + tick_duration);



               try{

                    Thread.sleep(sleep_duration);

               } catch(InterruptedException e) {}



          }

     }




     start = System.currentTimeMillis();




     if(directionX[i]==1)

          currentX[i]+=speed;





     if(directionX[i]==0)

          currentX[i]-=speed;






These last two detect if the object has hit the side of the applet and if so change the direction:

     if(currentX[i] <= 0)

          directionX[i]=1;





     if(currentX[i]+20 >= width)

          directionX[i]=0;





     currentX[i]+20



     repaint();






     tick_end_time = System.currentTimeMillis();

     tick_duration = tick_end_time - start;

     sleep_duration = MAX_MS_PER_FRAME - tick_duration;



     if (sleep_duration < MIN_SLEEP_TIME)

     {

          sleep_duration = MIN_SLEEP_TIME;

     }

     fps = 1000 / (sleep_duration + tick_duration);





     try{

          Thread.sleep(sleep_duration);

     } catch(InterruptedException e) {}



     g.drawString("FPS: "+fps,1,400);


:




     java.awt.image.*;







     BufferedImage bufferdImg;

     Graphics2D bufferdImgSurface;






     bufferdImg = (BufferedImage)createImage(width, height);

     bufferdImgSurface = bufferdImg.createGraphics();






     public void update(Graphics g)

     {

          Graphics2D g2 = (Graphics2D)g;

          // Set the background color.

          bufferdImgSurface.setBackground(Color.black);



          // Clear the applet.

          bufferdImgSurface.clearRect(0, 0, width, height);



          bufferdImgSurface.setColor(Color.green);

          //(X pos, Y pos, Width, Height)

          bufferdImgSurface.fillOval(currentX[0], currentY[0], 20,20);



          g2.drawImage(bufferdImg, 0, 0, this);

     }


     g2.drawImage(bufferdImg, 0, 0, this);




     boolean collided=false;

     float dist;



     currentX[1]=0;

     currentY[1]=100;



     directionX[1]=0;

     directionY[1]=1;




     dist = (int)(Math.sqrt(Math.pow((currentX[0]+20)-(currentX[1]+20),2) + Math.pow((currentY[1]+20)-(currentY[1]+20),2)));



     if(dist < 20)

          collided = true;

     else

          collided = false;


     sqrt(pow((X1)-(X2),2) + pow((Y1)-(Y2),2)))



     bufferdImgSurface.fillOval(currentX[1], currentY[1], 20,20);



     if(collided==true)

          bufferdImgSurface.drawString("Collided",10,10);



     g2.drawImage(bufferdImg, 0, 0, this);




     public class Game extends Applet implements Runnable, MouseMotionListener, MouseListener



     int directionX[] = new int[MAX];

     int directionY[] = new int[MAX];



     BufferedImage bufferdImg;

     Graphics2D bufferdImgSurface;



     Thread gameThread;



     int width=400, height=400, MAX=50, speed=10;



     int currentX[] = new int[MAX];

     int currentY[] = new int[MAX];



     int step=0,          // Number of movements left/right

     direction=1,          // Current left/right direction (0=left, 1=right)

     shipX=width/2-10,          // Current player X possition

     shipY=height-45,          // Current player Y possition

     mbx=-10,          // The mouse position after mouse down, sets the_

     mby=-10,          // enemy bullet position to this.

     randomShoot=0,          // Used to work out which enemy is shooting

     health=50,          // The players health

     BNUM=10,          // Number of bullets

     playing=0;          // Are is the game playing (0=Playing, 1=Paused, 2=Game Over, 3=Win)



     int bX[] = new int[BNUM]; // Bullet X pos.

     int bY[] = new int[BNUM]; // Bullet Y pos.



     int ebX[] = new int[BNUM]; // Enemy Bullet X pos.

     int ebY[] = new int[BNUM]; // Enemy Bullet Y pos.



     long start=0,     // Frame start time

     tick_end_time,     // End frame time

     tick_duration,     // Time taken to display the frame

     sleep_duration;     // How long to sleep for



     static final int MIN_SLEEP_TIME = 10,                    // Min time to sleep for

                              MAX_FPS = 20, // Max frame rate.

                              MAX_MS_PER_FRAME = 1000 / MAX_FPS; // MS per frame



     float fps=0, // Current frame rate

               dist; // Distance between 2 points




     int row=10,     // Current Y position

     col=10,     // Current X position

     count=0;     // How many circles have been drawn



     currentX[0]=col;

     currentY[0]=row;





     for(int i=0; i < 50; i++) {

          count++;

          currentX[i]=col;

          col+=25;



          currentY[i]=row;



          if(count==10){

               row+=25;

               col=10;

               count=0;

          }

     }




The following two lines of code are used to start the mouse listener �listening� on the applet:

     addMouseMotionListener(this);

     addMouseListener(this);



     for(int i=0; i < BNUM; i++){

          bX[i]=-10;

          bY[i]=-10;

          ebX[i]=0;

          ebY[i]=height+10;

     }





     while(true){     // Starts the game loop

          start = System.currentTimeMillis(); // Sets the current time



          if(playing==0){     // Are we playing or is the game over?





     step++;

     for(int i=0; i < MAX; i++){

          if(step > 15) {

               if(direction==1){

                    direction=0;

               } else {

                    direction=1;

               }

          step=0;

          for(int j=0; j < MAX; j++)

               currentY[j]+=speed;

          }

          if(direction==1)

               currentX[i]+=speed;

          else

               currentX[i]-=speed;

     }





     for(int i=0; i < BNUM; i++){

          if(bY[i] <= 0) {

               bX[i]=mbx;

               bY[i]=mby;

               mbx=-10;

               mby=-10;

          }

          bY[i]-=speed;

     }





     for(int i=0; i < MAX; i++){

          for(int j=0; j < BNUM; j++) {

               if(!(bY[j]<=0)){

                    dist = (int)(Math.sqrt(Math.pow((currentX[i]+10)-bX[j],2) + Math.pow((currentY[i]+10)-bY[j],2)));

                    if(dist <= 20){

                         bY[j]=-50;

                         currentY[i]=-500;

                    }

               }

          }

     }





     for(int k=0; k < MAX; k++){

          randomShoot=(int)(Math.random()*MAX);

               if(currentY[randomShoot] >= 0){

                    for(int i=0; i < BNUM; i++){

                         if(ebY[i] >= height) {

                              ebX[i]=currentX[randomShoot];

                              ebY[i]=currentY[randomShoot];

                              break;

                         }

                    }

               }

     }







     for(int j=0; j < BNUM; j++) {

          if(!(ebY[j]>=height)){

               dist = (int)(Math.sqrt(Math.pow((shipX+10)-ebX[j],2) + Math.pow((shipY+10)-ebY[j],2)));

               if(dist <= 20){

                    ebY[j]=height+10;

                    health-=10;

               }

          }

     }






     for(int i=0; i < BNUM; i++){

          if(ebY[i] < height) {

               ebY[i]+=speed;

          }

     }







     if(health <=0)

          playing=2;






          int count=0;

          for(int j=0; j < MAX; j++){

               if(currentY[j]<0)

                    count++;



               if(currentY[j]>=340)

                    playing=2;

          }



          if(count==MAX)

               playing=3;





     } else { }



     repaint(); // Redraw the screen






               tick_end_time = System.currentTimeMillis();

               tick_duration = tick_end_time - start;

               sleep_duration = MAX_MS_PER_FRAME - tick_duration;



               if (sleep_duration < MIN_SLEEP_TIME)

               {

                    sleep_duration = MIN_SLEEP_TIME;

               }

               fps = 1000 / (sleep_duration + tick_duration);



               try{

                    Thread.sleep(sleep_duration);

                    } catch(InterruptedException e) {}

          }

     }




     public void paint(Graphics g)

     {

          update(g);

     }



     public void update(Graphics g)

     {

          Graphics2D g2 = (Graphics2D)g;



     // Set the background color.

     bufferdImgSurface.setBackground(Color.black);



     // Clear the applet.

     bufferdImgSurface.clearRect(0, 0, width, height);



     bufferdImgSurface.setColor(Color.green);

     //(X pos, Y pos, Width, Height)

     for(int i=0; i < MAX; i++)

          bufferdImgSurface.fillOval(currentX[i], currentY[i], 20,20);



     // Draw the read ship (a square)

     bufferdImgSurface.setColor(Color.red);

     bufferdImgSurface.fillRect(shipX, shipY, 20, 20);





     for(int j=0; j < BNUM; j++){

          bufferdImgSurface.setColor(Color.yellow);

          bufferdImgSurface.fillOval(bX[j], bY[j], 5,5);



          bufferdImgSurface.setColor(Color.blue);

          bufferdImgSurface.fillOval(ebX[j], ebY[j], 5,10);

     }

     // Draw a bottom line to our window

     bufferdImgSurface.setColor(Color.red);

     bufferdImgSurface.drawString("_________________________________________________________",0,375);






     if(playing==1)

          bufferdImgSurface.drawString("PAUSED", width/2-10, 390);

     else if(playing==2)

          bufferdImgSurface.drawString("****Game Over****", width/2-10, 390);

     else if(playing==3)

          bufferdImgSurface.drawString("****You Win!****", width/2-10, 390);






          for(int i=0; i < health; i++)

               bufferdImgSurface.drawString(" |", (2*i), 390);



          // Draw the buffered image to the screen.

          g2.drawImage(bufferdImg, 0, 0, this);

     }



     public void mouseMoved(MouseEvent e) { shipX=e.getX()-5; }



     public void mouseDragged(MouseEvent e) { shipX=e.getX()-5; }






     public void mouseClicked(MouseEvent e) {

          mbx=e.getX();

          mby=shipY;

     }



     public void mousePressed(MouseEvent e) {

     mbx=e.getX();

     mby=shipY;

     }






     public void mouseEntered(MouseEvent e) { playing=0; }



     public void mouseExited(MouseEvent e) { playing=1; }






     public void mouseReleased(MouseEvent e) { }

Nincsenek megjegyzések:

Megjegyzés küldése