Mainmetod
Vi har informationen om klassen Pair och PairSequence och ska skriva en klass med mainmetod för att patientspel som spelar patienten 10000 gånger och sedan skriver ut sannolikheten för patienten att gå ut.
Ma spelar genom att man drar kort samtidigt som man räknar 123123123 och om kortet man drar är ess, två eller tre samtidigt som man räknar med den siffran så går inte spelet ut.
Jag får inte till detta och undrar vad jag gör för fel. Överst är min klass med mainmetod, programmet, under klistrar jag in Pair och PairSequence.
("obs" jag är inte ute efter om jag skrivit på omständigt sätt - har själv sett ett par saker som är onödiga - utan det är först att alls få det att fugnera, alltså vad som är fel med min mainmetod för att få detta att göra som uppgiften vill -- det andra vill jag helst inte ha tips om då jag vill göra "finslip" själv)
("obs2" de kommentarer jag skrivit efter "//" behöver ni inte försöka svara på eller FÖRSTÅ, om ni inte råkar se något speciellt - de är bara egna små kommentarer)
-----------------
package cardgame;
import pair.Pair;
import pair.PairSequence;
public class Nuda {
private static final int NBR_ITERATIONS = 10000;
public static void main(String[] args) {
PairSequence win = new PairSequence (4, 13); // ny omgång startar
int apa = 0;
double p = 0;
double q = 0;
boolean avsluta = true;
//while(avsluta){//medan avsluta är true
while(apa < NBR_ITERATIONS && avsluta){//...och medan apa är mindre än 10000 och avsluta är true
int i = 0;//korttalet sätts till noll innan varje påbörjad omgåg
boolean japp = true; //japp sätts till true innan varje påbörjad omgång, så man kan avbryta genom japp = false
while(japp){//kommer göra att gforsatsen körs om och om ---- detta är EN spelomgång och när ma kommer ur DENNA påbörjas
//....NÄSTA INTERATION!!!!
//-????- om man har while innan e for sats - är kontrolleras whilevillkoret? innan varje varv i forsatsen eller bara efter forsatsen körts och ma hamnar i while satsen igen????
for(int k = 0; k < 3; k++){//räknar 012012012
Pair a = win.pick();//drar ett kort och kortet hamnar i a
if(i < 52 && a.second() != k){// om inte kortnumret är lika med talet man räknar med
System.out.println(a.toString());//skriv ut kortet
i++;
}
else if(i < 52 && a.second() == k){
System.out.println("Patienten gick inte ut");
japp = false; // så while kan avbrytas och ny omgång påbörjas
q++;//räknaren för antalet gånger man spelat ökas
//return; // HAMNAR JAG I WHILE SATSEN UTANFÖR FORSATSEN NU????
}
else if(a.second() != k && i == 51){//om detta var det sista kortet
System.out.println(a.toString());//skriver ut kortet
System.out.println("Patienten gick ut!");
p++;//räknaren för antalet utgångna patienter ökas
q++; //räknaren för antalet gånger man spelat
apa++; //apa är antalet gånger man spelat
if(apa == (NBR_ITERATIONS - 1)){//OM SPELOMGÅNGEN VAR DEN SISTA
System.out.println("sannolikheten att patienten går ut är:" + q/p);
avsluta = false;
japp = false;
}else if(apa < NBR_ITERATIONS){
}
}
} // stänger for satsen
}//stänger while-japp-satsen
//apa++; //apa är antalet gånger man spelat
//if(apa == (NBR_ITERATIONS - 1)){//OM SPELOMGÅNGEN VAR DEN SISTA
// System.out.println("sannolikheten att patienten går ut är:" + q/p);
//avsluta = false;
}//går nu upp till första while-satsen och om
}
}
-----------------------
PAIR
package pair;
/** Ett par av heltal. */
public class Pair {
private int a;
private int b; // japp
/** Skapar ett nytt par av heltal. */
public Pair(int a, int b) {
this.a = a;
this.b = b; //japp
}
/** Hämtar parets första tal. */
public int first() {
return a; //japp
}
/** Hämtar parets andra tal. */
public int second() {
return b; //japp
}
/** Hämtar en sträng som beskriver paret, exempelvis "(5,3)". */
public String toString() {
return "(" + a + "," + b + ")";
} // VARFÖR SKRIVER MAN INTE BARA (a, b) NÄR DE NU ÄR TAL????
}
---------------------------
PAIRSEQUENCE
package pair;
import java.util.Random;
public class PairSequence {
private int n;
private Pair[] pairs; // EN VEKTOR MED PAIR!!! alltså det behöver inte
// finnas vektorer i implementeringen
// av PAIR utan man kan
private static Random rand = new Random();
/**
* Skapar en sekvens av alla talpar (a,b) sådana att 0 <= a < rows och 0 <=
* b < cols
*/
public PairSequence(int rows, int cols) { // hur ska jag fatta det ska
// bli/man syftar på 4*14=64?
n = rows * cols;
pairs = new Pair[n]; // VARFÖR KUNDE MAN INTE SKRIVA Pair pairs????
// vektor skapas med lika många boxar som det
// finns sifferkombos
// MEN MAN MÅSTE FYLLA DEN MED KOMBOS OCKSÅ!!!!
int i = 0;
while (i < n) // går igenom alla boxar en i taget
for (int a = 0; a < 4; a++) { // är i box 0 och där tar den a=0 och
// b=0,
for (int b = 0; b < 13; b++) {
pairs[i] = new Pair(a, b); // ...vilket alltså kommer ut här
i++; // så den fyller box 0 med 0,0, box 2 med 0,1 box 3 med
// 0,2 osv till 0,13
// ...sen går den upp och kollar villkoret och om det är
// sant ökar a till 1 och samma sak fortsätter men med
// a som 1 och 1,1, 1,2, 1,3 osv
// osv med resten av siffrorna 2 och 3
}
}
}
/** Undersöker om det finns fler par i sekvensen. */
public boolean more() {
if (n > 0) {
return true;
} else {
return false;
}
}
/**
* Hämtar ett slumpmässigt valt talpar ur sekvensen. Sekvensen blir ett
* element kortare. Om sekvensen är tom returneras null.
*/
public Pair pick() {
if (n > 0) {
rand = new Random();
int kort = rand.nextInt(n); // n? n-1? n+1? //kort tilldelas ett
// ... nytt randomtal i området noll
// till men inte med n
Pair a = pairs[kort]; // Pair a blir talparet i box pairs numrerad
// med slumptalssiffran
pairs[kort] = pairs[n - 1]; // PLOCKAR BORT ELEMENTET ERSÄTTER MED
// SISTA
n--; // n minskar med ett för vektorn har blivit kortare
return a;// returnerar det talparet i boxen
}
return null;
}
}
for-satsen inne i whileslingan är ingen bra idé. Om du inne i for-satsen upptäcker att du vill bryta både for-slingan och while-slingan finns det ingen bra metod. Fast du sätter japp=false fortsätter ju for-slingan. Det enda for-slingan är till för är att få k att bli 012012... och det ordnas enkelt med k=i%3. Strunta i japp och ersätt while-slingan med for(int i=0; i<52; i++). Då kan du bryta slingan med break.
Henrik Eriksson skrev :for-satsen inne i whileslingan är ingen bra idé. Om du inne i for-satsen upptäcker att du vill bryta både for-slingan och while-slingan finns det ingen bra metod. Fast du sätter japp=false fortsätter ju for-slingan. Det enda for-slingan är till för är att få k att bli 012012... och det ordnas enkelt med k=i%3. Strunta i japp och ersätt while-slingan med for(int i=0; i<52; i++). Då kan du bryta slingan med break.
Första fråga: k=i%3 är jag inte säker på hur jag ska tolka - och 52 är ju inte jämt delbart med 3.
Nytt försök. Men detta skriver bara ut 3 kort...:
package cardgame;
import pair.Pair;
import pair.PairSequence;
public class lllllll {
private static final int NBR_ITERATIONS = 10000;
public static void main(String[] args) {
PairSequence win = new PairSequence (4, 13); // ny omgång startar
int speladeganger = 0;
double p = 0;
double b = 0;
double q = 0;
boolean avsluta = true;
boolean detarsnartpask = true;
boolean japp = true;
while(speladeganger < NBR_ITERATIONS && avsluta){
int i = 0;//korttalet sätts till noll innan varje påbörjad omgåg
int k = 0;
while(japp){
while(k<3 && i<52 && detarsnartpask){
Pair a = win.pick();//drar ett kort och kortet hamnar i a
if(i < 52 && a.second() != k){// om inte kortnumret är lika med talet man räknar med
System.out.println(a.toString());//skriv ut kortet
k++;
i++;
}
else if(i < 52 && a.second() == k){
System.out.println("Patienten gick inte ut");
detarsnartpask = false;
japp = false; // så while kan avbrytas och ny omgång påbörjas
speladeganger++;//räknaren för antalet gånger man spelat ökas
}
else if(a.second() != k && i == 51){//om detta var det sista kortet
System.out.println(a.toString());//skriver ut kortet
System.out.println("Patienten gick ut!");
p++;//räknaren för antalet utgångna patienter ökas
b = b + p/NBR_ITERATIONS;
speladeganger++;
detarsnartpask = false;
japp = false; // så while kan avbrytas och ny omgång påbörjas
}
}
}
}//stänger stora while
System.out.println("sannolikheten att patienten går ut är:" + b);
}
}
Om du gör som jag föreslog blir det rätt. Och om i går från 0 till 51 kommer i%3 att genomlöpa 012012...