Avatar billede max-w Nybegynder
10. marts 2003 - 19:07 Der er 2 kommentarer og
1 løsning

primitiv spil

Hej alle!
Jeg kom til at klikke på svar da jeg skrev min kommentar!!
Jeg er nybegynder i java, og har fået en opgave at programere et simlpelt spil, f.eks. et skib(eller et objekt) der skal kunne bevære sig, eller lign. Er der nogen der kan hjælpe mig med at finde en sourse kode et eller andet sted på nettet. tak
PS: det er ikke en opgave som jeg får karakter for, men er hænger sammen med en læringsproces i Java. det er ikke mening at jeg kopire fra et andet spil, men at se hvordan man strukturerer et sådan program.
Tak til dem der har tidligere skrevet kommentar til.
Max
Avatar billede repsak Nybegynder
11. marts 2003 - 10:36 #1
Denne side holder ... er god til at få ideer
http://www.javacooperation.gmxhome.de/indexEng.html
og denne er ikke decideret til spil, men indeholder alligevel elementer som kan bruges. Fx. collision detection
http://www.programming.de/
Avatar billede ng-km Nybegynder
11. marts 2003 - 18:31 #2
Her er en prototype på et spil jeg engang lavede til min 3 årige søn, så han kunne lære at bruge musen. Det færdige spil fylder for meget, så du kan få prototypen for dobbeltklik-versionen (den fylder nu altså også en del).

Struktureringen af programmet er ikke et udtryk for hvordan "man gør". Det er udelukkende et forsøg for at se hvad jeg kunne lave med Java inden jeg gik igang med det endelige program.

Spillet går ud på at fange en figur med musen ved at dobbeltklikke på den(meget simpelt). Hastigheden på figuren kan ændres, og ligeledes kan dobbeltklikket ændres i hastighed, men de kan i dette program kun ændres i selve koden.

Koden kan compiles og benyttes direkte som den er vist her, men da jeg afprøvede den lige inden afsendelse hertil var valideringen på hvornår figuren ryger ud over spilledpladen ikke helt stabil, men det kan du jo prøve at rette op på selv.

Bevægelses-algoritmen er ikke supergod, for figuren bevæger sig i små lige linier, men det færdige program med lydeffekter, farver, og fyrværkeri har gjort min søn til en haj med musen, så algoritmen har ikke være en betydende faktor til mit brug. I det færdige program er der mulighed for at vælge at køre uden klik, med enkelt klik eller dobbeltklik, og det har være rigtig god træning for ham.

Håber du kan bruge det til noget, for jeg tror der er mange programmerings-finesser til en nybegynder i denne kode.


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class PrimitivtSpil extends JFrame implements ActionListener
{
    private Random r = new Random();
  private JButton startButton;
  private Spilleplade spilleplade;

    public PrimitivtSpil()
  {
    setSize(800,600);
    setTitle("Fang teksten");

    Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension screenSize = toolkit.getScreenSize();
    Dimension selfBounds = getSize();
    setLocation((screenSize.width - selfBounds.width) / 2, (screenSize.height - selfBounds.height) / 2);
    getContentPane().setLayout(null);

        spilleplade = new Spilleplade();
        spilleplade.setBounds(10,10,770,500);
    spilleplade.setBorder(BorderFactory.createTitledBorder("Spilleplade"));
        getContentPane().add(spilleplade);

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    startButton = new JButton("Start spillet");
    startButton.setBounds(300,530,200,22);
    startButton.addActionListener(this);
    getContentPane().add(startButton);
  }

    public int randomNumber(int start, int slut)
    {
        if(start > slut)
            return - 1;

        return r.nextInt(slut-start) + start;
    }//randomNumber


    public boolean getRandomBoolean()
    {
        int temp = randomNumber(0, 11);
       
        if(temp < 5)
            return true;
        else
            return false;
    }
    public static void main(String args[])
    {
        PrimitivtSpil ps = new PrimitivtSpil();
        ps.setVisible(true);
    }

    public void actionPerformed(ActionEvent event)
    {
        //her sættes hastigheden stort tal = langsom
        spilleplade.startFiguren(20);
    }

    //inner class
    public class Spilleplade extends JPanel
    {
        private JLabel figurLabel;//figuren der vises
        private int antalFanget;//hvor mange er der fanget ialt (max 5)
        private int hastighed;//hvor hurtigt skal figuren hoppe rundt
        private Traad figurTraad;//tråden der starter figuren
        private int x;//figurens placering på x-aksen
        private int y;//figurens placering på y-aksen
   
        //til dobbeltklik-administration
        private boolean andetKlik = false;
        private    long tid = 0;
        private long dobbeltKlikTid = 600;//her kan tiden for dobbeltklik ændres
        private long nytid = 0;
           
        private int placeringAfFangedeFigurer;

        public Spilleplade()
        {
            super();//til doublebuffering
        setLayout(null);
        antalFanget = 0;
        placeringAfFangedeFigurer = 5;
            this.setCursor(new Cursor(Cursor.HAND_CURSOR));
        }//constructor
   
        public void startFiguren(int hastighed)
        {
            //nulstil variabler til dobbeltklik
            andetKlik = false;
            tid = 0;
            nytid = 0;
           
            //tråden vil ikke dø ved ét kald til interrupt
            if(figurTraad != null)
            {
                while(figurTraad.isAlive())
                    figurTraad.interrupt();
            }
   
            antalFanget = 0;//nulstil antal fangede figurer
            placeringAfFangedeFigurer = 10;//nulstil placering af figurer
            removeAll();//rense vinduet når der startes en ny figur
            //aktivFigur = figurnavn;
           
            //hastigheden der er valgt under indstillinger
            this.hastighed = hastighed;
           
            //initialisering af figuren der skal vises
            figurLabel = new JLabel("Fang mig");
        figurLabel.setBounds(getWidth()/2,getHeight()/2, 60, 20);
        figurLabel.addMouseListener(new MuseLytter());
        add(figurLabel);
        update(getGraphics());
       
        figurTraad = new Traad();
        figurTraad.start();
        }//startFiguren
   
   
        public void stopFigur()
        {
            if(figurLabel != null)
            {
                remove(figurLabel);
                figurLabel = null;
            }
   
            while(figurTraad.isAlive())
                figurTraad.interrupt();
   
        update(getGraphics());
        }


        //bruges inde i tråden
        public Graphics getThisGraphics()
        {
            return this.getGraphics();
        }
   
        private class Traad extends Thread
        {
            public void run()
            {
                Rectangle r = figurLabel.getBounds();
               
                x = (int)r.getX();
                y = (int)r.getY();
   
                int xVandring = 0;
                int yVandring = 0;
               
                boolean xFortegn = false;//true = læg til  false = træk fra
                boolean yFortegn = false;//true = læg til  false = træk fra
               
                try
                {
                    while(antalFanget < 5)
                    {
                        //hvor langt skal der gåes i hver retning
                        if(xVandring == 0)
                        {
                            //gå dette antal i x-retning
                            xVandring = randomNumber(0, 100);
                            //sørg for at den ikke forsvinder ud til venstre
                            if(xVandring > x )
                                xFortegn = true;
                            else
                            //sørg for at den ikke forsvinder ud til højre
                            if(xVandring + x > 600)
                                xFortegn = false;
                            else
                                xFortegn = getRandomBoolean();
                        }
                        if(yVandring == 0)
                        {
                            //gå dette antal i y-retning
                            yVandring = randomNumber(0, 100);
                            //sørg for at den ikke forsvinder oven ud
                            if(yVandring > y )
                                yFortegn = true;
                            else
                            //sørg for at den ikke forsvinder under ud
                            if(yVandring + y > 450)
                                yFortegn = false;
                            else
                                yFortegn = getRandomBoolean();
                        }
                       
                        //kør til højre
                        if(xFortegn)
                            x++;
                        //kør til venstre
                        else
                            x--;
                        //kør ned
                        if(yFortegn)
                            y++;
                        //kør op
                        else
                            y--;
                       
                      figurLabel.setBounds(x,y,60,20);
                      sleep(hastighed + 1);//kan ikke være nul
                     
                      //tæl ned til 0 og skift retning
                      xVandring--;
                      yVandring--;
                    }//while
                }
                catch(InterruptedException e)
                {
                    System.out.println("InterruptedException in thread");
                }
            }//run
        }//class Traad
       
       
        public class TidsTraad extends Thread
        {
            public void run()
            {
                try
                {
                    sleep(dobbeltKlikTid);
                    andetKlik = false;
                    nytid = 0;
                    tid = 0;
                }
                catch(InterruptedException e)
                {
                    System.out.println("InterruptedException in thread");
                }
            }
        }
       
        //Til musen
        public class MuseLytter extends MouseAdapter
        {
            public void mouseReleased(MouseEvent e)
            {
                if(andetKlik)
                {
                    //stop når der er fanget 5 figurer
                    if(antalFanget == 4)
                        stopFigur();
                   
                    //lav en figur og sæt den op i hjørnet
                    JLabel fangetFigurLabel = new JLabel("Øv");
                tilfoejLabel(fangetFigurLabel);
               
                    antalFanget++;
                   
                    //start figuren et tilfældigt sted når den er fanget
                    if(figurLabel != null)
                    {
                        x = randomNumber(0, 650);
                        y = randomNumber(0, 450);
                    }//if
                }//if andet klik
            }//mouseReleased
           
            public void mousePressed(MouseEvent e)
            {
               
                if(tid == 0)
                {
                    Date date = new Date();
                    tid = date.getTime();
                    andetKlik = false;
                    TidsTraad tt = new TidsTraad();
                    tt.start();
                    return;
                }
               
                Date date = new Date();
                nytid = date.getTime();
   
                if(nytid-tid <= dobbeltKlikTid && !andetKlik)
                {
                    andetKlik = true;
                    tid = 0;
                }
                else
                {
                    tid = 0;
                }
            }//mouseEntered
        }//MuseLytter
   
        /**
        * Tilføjer en figur (label) i øverste venstre hjørne af vinduet forskyder hvert billede med 40
        */
        public void tilfoejLabel(JLabel fangetFigurLabel)
        {
            fangetFigurLabel.setBounds(placeringAfFangedeFigurer,10, 50, 50);
            add(fangetFigurLabel);
          update(getGraphics());
          placeringAfFangedeFigurer = placeringAfFangedeFigurer + 40;
        }
    }//inner class
}
Avatar billede max-w Nybegynder
11. marts 2003 - 21:49 #3
mange tak, jeg prøver at komme videre, både ved at læse fra web siderne, og at studere ng-kms koder som jeg mener vil der være et meget godt start og giver et godt overblik over opbygning af sådan et spil.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester