webForumDet fria alternativet

Problem med att skapa ny Vektor..

7 svar · 483 visningar · startad av Broms

BromsMedlem sedan sep. 2002188 inlägg
#1

Jag skall göra ett program som hanterar spelresultat..
I programmet visas först en meny, som man via denna, kommer till önskad aktivitet, lägga till nytt resultat, eller visa alla tidigare resultat.. om ett resultat med det inmatade namnet redan finns så skall bara poängen uppdateras, om den är större än tidigare max värde..

dvs kortfattat:

startameny;
vi väljer lägg till poäng;
OM det är första resultatet som lagts in så skapas en Vektor games, och namn och poäng läggs in..
Annars jämförs namnet med alla spel i Vektorn, om lika namn hittas, jämför poäng, uppdatera om nytt värde större än gamla värdet, annars skapa nytt inlägg i Vektorn med namn och poäng.

Får errors "cannot resolve symbol class Vector" && "cannot resolve symbol variable games"..

1. Hur fixar jag till skapandet av Vektorn? Gör jag det på smidigt sätt?

2. Jag får inte metoden checkPoints att fungera, har totat ihop den så långt jag kan.. den skall ju jämföra namnet i objektet Spel, med namnen i Vektorn först...

3. Det är väl smartast att använda sig av en Vektor i detta program, tänkte köra array först, men då man inte vet hur många element den skulle kunna komma att innehålla så tyckte jag Vektor verkade bäst..?

KODEN:
..........................

Main.java:

import extra.*;

public class Main {
	
	public static void main (String[] arg) {
				
		// Ladda meny
		Meny m1 = new Meny();
		m1.skapaMeny();
	}
}

Meny.java:

import extra.*;

public class Meny{
	
	// Instansvariabler
	private int val;
	
	// Konstruktor
	public Meny(){
		skapaMeny();
	}
	
	// Metoder
	public void skapaMeny(){
		Std.out.println(" <--// SPELHÖRNAN.NET //--> \n");
		Std.out.println("0 - Lägg till nytt spelresultat");
		Std.out.println("1 - Skriv ut spelresultat");

		// läsa av valet
		läsavMeny();
	}
	
	public void läsavMeny(){
		
		Std.out.println("\nVälj ditt alternativ + <ENTER>: ");
		val=Std.in.readInt();
		
		// gå till rätt undermeny
		subMeny();
	}
	
	// Läs av meny-val
	public void subMeny(){
		switch(val){
			case 0: läggTill(); break;
			case 1: visaAllt(); break;
			default: Std.out.println("Fel val\n"); läsavMeny();
		}
	}
	
	// Skapar ett nytt spelobjekt
	public void läggTill(){
		
		Std.out.print("Skriv in spelets namn: ");
		String namn=Std.in.readWord();
		
		Std.out.print("Skriv in ditt resultat: ");
		long poäng=Std.in.readLong();
		
		Spel temp = new Spel(namn,poäng);
	}
	
	// Visa alla resultat
	public void visaAllt(){
		// bla
		Std.out.println("Här följer alla resultat:\n");
		
		// hämtning av resultat
	}
	
} // class

Spel.java:

import extra.*;

public class Spel{
	
	// Instansvariabler
	private int i=0;
	private String namn;
	private long poäng;
	
	// Konstruktor
	public Spel(String n, long p){
		namn=n;
		poäng=p;
		i++;
		// Kontrollera om Vektor finns
		firstGame();
	}
	
	// Metoder
	public void firstGame(){
		if (i <= 1){
			Vector games = new Vector();
			games.add(new Spel(namn, poäng ));
		}else checkPoint();
	}
	
	// Kontrollerar om spelet finns sparat sedan tidigare,
	// om ja: jämför poäng och uppdatera då nytt värde är
	// större än tidigare, om nej: lägg till nytt spel med
	// index, namn och poäng.
	public void checkPoint(){
		if (namn.equals("/*något namn i Vektorn*/")){
			Std.out.println("spelet finns redan\n");

			/* - hämta ut spelpoäng från inmatat namn...hur?!
			Spel tmpSpel = (Spel)games.get(n);
			long a = tmpSpel.gePoäng();
			long b = poäng;
			if (b>a) tmpSpel.sättPoäng(poäng);
			*/
		}
		else{
			games.add(new Spel(namn, poäng ));
		}
	}
	
	// returnerar poäng
	public long gePoäng(){
		return poäng;
	}
	
	public void allaSpel(){
		
		// Utskrift av alla spel i vektorn
		for(int n = 0; n < games.size(); n++){
    		System.out.print(games.get(n) + "\n");
		}
	}
	
}

tack på förhand! /joph

BromsMedlem sedan sep. 2002188 inlägg
#2

kom på att Vector ligger i java.util, problemet med att skapa vektorn kvarstår dock, jag skall ju skapa en ny vektor endast första gången, dvs då i<=1.. men det görs aldrig :\

jmeMedlem sedan maj 20012 237 inlägg
#3

Första saken: :)

I konstruktören för meny() så anropar du metoden skapaMeny();

sedan efter att du har skapat en ny instans av klassen Meny så anropar du skapaMeny() igen. En kan du med fördel ta bort. Anropas skapaMeny() alltid så kan du tänka dig att låta den i konstruktören att vara kvar, men jag tycker att du ska ta bort det. Bättre att låta framtida användare av koden själv bestämma, när och hur metoden ska anropas.

Sen tycker jag att du inte ska ha variabeln val som privat instansvariabel. Ange val som parameter till submeny() istället.

Jag ser ingenstans i koden, där du skulle anropa metoden läggTill(), den som innehåller Vector v = new Vector(); osv

Sen tycker jag att du ska skippa åäö i dina metodnamn. :)

Det funkar med åäö, men enligt Suns konventioner så bör man skippa alla tecken som inte är internationellt anpassade. En bra idé är att köra med engelska namn på metoderna samt variablerna. :)

BromsMedlem sedan sep. 2002188 inlägg
#4

ahh tänkte inte på att jag anropade menyn 2 ggr, men vadå, om jag anropar:

	Meny m1 = new Meny();
	m1.skapaMeny();

, vad gör jag då av konstruktorn, då tar jag helt enkelt bort den?

-------

Sen ang "Jag ser ingenstans i koden, där du skulle anropa metoden läggTill(), den som innehåller Vector v = new Vector(); osv"

^^ Jag skapar ju ett nytt spelobjekt i läggTill() --> Spel temp = new Spel(namn,poäng) , och i konstruktorn för Spel så anropar jag firstGame() som skapar en ny vektor, lr annars går vidare till checkPoint().. tappar jag antopet till firstGame? hur fixar jag så att programmet går vidare dit?

jmeMedlem sedan maj 20012 237 inlägg
#5

Oj, mitt fel! Såg inte...

Nä ta inte bort konstruktören, utan ta bort anropet till skapaMeny()

Du har raden:

Spel temp = new Spel(namn,poäng);

i metoden läggTill();

Variabeln temp är en s k lokal variabel och den finns bara under läggTill() metodens exekvering. Dvs varje gång du anropar metoden läggTill(), så skapas objektet temp. När läggTill() är klar, så försvinner temp.

Sen i klassen spel så utökas i enbart i konstruktören. Därför kommer i alltid att vara mindre, eller lika med 1.

I metoden firstGame() så skapar du ännu en instans av klassen Game().

Dvs du skapar en ny instans av Game i klassen Game.

Du borde nog ha en yttre klass som sköter lagringen av Game-objekten.

Kom ihåg att i är en privat variabel. Varje instans av klassen Game har en egen variabel i.

Skapa en yttre klass, som sköter skapandet av Vectorn. Denna klass skapar också nya instanser av klassen Game och lagrar dessa i Vectorn.

Flytta metoderna firstGame(), checkPoint() och allaSpel() till den yttre menyn. Spel-klassen ska inte behöva veta av andra Spel-objekt som finns. Låt den yttre klassen sköta detta. Spel-klassen ska enbart veta om just den spels påäng, namn osv.

jmeMedlem sedan maj 20012 237 inlägg
#6

Jag gjorde en enklare början till den s k yttre klassen.
Du måste på nåt sätt koppla klassen Meny till klassen YttreKlass.
Dvs när användaren har matat in ett namn så måste yttre klassen få detta namn. Antar att programmet ska köras i DOS-prompten. Jag tycker att du ska använda meny-klassen till enbart inläsning av användarens text. Låt den yttre klassen bearbeta innehållet.

import java.util.Vector;

public class YttreKlass
{
	private Vector vector; // spara alla Spel-objekt i denna vector

	private Meny meny;

	public YttreKlass()
	{
		vector = new Vector(); // skapa en ny instanas av Vector

		meny = new Meny();
		meny.skapaMeny();

	}

	public void createNewGame(String pName, int pPoint)
	{
		// Här kan du kontrollera, om ett spel med samma namn redan finns.
		// Du kan också sköta kontrollen utanför denna metod, genom att placera if(!isGameOn() ) nån annanstans
		
		if(!isGameOn(pName) )
		{
			// inget spel med det namnet är igång!
			Spel spel = new Spel(pName, pPoint);

			vector.add(spel);
		}
		else
		{
			// kanske ett meddelande till användaren att ett spel med samma namn redan finns	
		}
	}

	public boolean isGameOn(String pName)
	{
		// kolla om det redan finns ett spel med angivet namn

		String temp = null;

		for(int i = 0; i < vector.size(); ++i)
		{
			Spel s = (Spel)vector.get(i);

			temp = s.getName(); // skapa en public metod med namnet getName(), som returnerar namnet på spelet

			if(temp.equals(pName) )
			{
				return true; // ett spel med samma namn hittades. Returnera false
			}
		}
		// om exekveringen kommer hit, så hittades inget spel med angivet namne
		return false;
	}
}
BromsMedlem sedan sep. 2002188 inlägg
#7

tack tack för det jme, försöker allt jag kan att få ihop allt nu, har lite svårigheter att komma på vart allt ska ligga bara, vilken klass som sköter vad etc.. :\

jmeMedlem sedan maj 20012 237 inlägg
#8

mm, OOP ställer till det i början. :)

Fortsätt att posta frågor. Du får nog hjälp ska du se.

Ett tips är att inte göra för svåra grejer på en gång.

Lär dig lite i taget. Testa dig fram. Strunta i GUI till att börja med.
Lär dig grunderna bra. Lär dig OOP.

Det finns många utmärkta tutorials på www.java.sun.com.

Sen bör du bekanta dig med Javas Api doc. Det måste du. ;)

141 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)