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
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
}
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.