Ziegenproblem


Das Spiel besteht darin, eine Tür zu erraten, hinter dem ein Geldpreis versteckt ist. Der Preis wird zufällig hinter einer von drei Türen versteckt. Dann darf der Spieler auf ein Feld setzen. Darauf wird ein leeres Feld geöffnet, aber niemals das bereits gewählte. Jetzt hat der Spieler die Wahl, entweder bei seiner ersten Entscheidung zu bleiben, oder auf das andere Feld zu wechseln.

Siehe Wikipedia Ziegenproblem.

Beispiel: Ziegenproblem starte Applet


// 3 Programm Modes
// 1 .. play mode (vote yourself
// 2 .. simulation mode (calculates percentage)

//GUI Library ControlP5
import controlP5.*;
ControlP5 controlP5;
CheckBox checkbox;

PImage car, goat;

int mode = 0;
public int Iterations=10;
int trys, hits;
boolean doorIsOpen =false;
boolean showCar  = false;
boolean youWon=false;
boolean simulate= false;
boolean changeChoice =false;

// Erstelle Array mit dem Türen
Door[] door = new Door[3];

void setup() {
size(600, 400);
smooth();

reset();
trys=0;
rectMode(CENTER);
imageMode(CENTER);
textAlign(CENTER, CENTER);

car=loadImage("car.png");
goat=loadImage("goat.png");

fill(0);
stroke(255);
strokeWeight(4);

// Steuerelemente erstellen
controlP5 = new ControlP5(this);
controlP5.begin(10, 10);
controlP5.addButton("Play_Mode");
controlP5.addButton("Simulation_Mode").linebreak();
checkbox = controlP5.addCheckBox("checkBox", 180, 10);
checkbox.setColorForeground(color(120));
checkbox.setColorActive(color(255));
checkbox.setColorLabel(color(128));
checkbox.setItemsPerRow(1);
checkbox.setSpacingColumn(30);
checkbox.setSpacingRow(10);
checkbox.addItem("Change Choice", 0);
controlP5.addSlider("Iterations", 0, 10000, 10, 280, 10, 200, 10);
controlP5.addButton("Reset");
controlP5.addButton("OpenDoor");
controlP5.addButton("ShowCar");
controlP5.end();
}

void draw() {

//Modes wechseln
switch(mode) {
case 0:
drawScreenPlay();
break;
case 1:
drawScreenSimulation();
break;
default:
background(0);
break;
}
}

// Wenn aktiv gespielt wird
void drawScreenPlay() {
drawBackground();
}

// Simulation
void drawScreenSimulation() {
for (int j = 0; j<Iterations; j++) {
if (simulate) {
int selection = (int)random(0, 3);
door[selection].isChosen=true;
OpenDoor();
if (changeChoice) {
for (int i=0;i<3;i++) {
if (door[i].isChosen==false && door[i].isOpened==false) {
door[i].isChosen=true;
}
}
door[selection].isChosen=false;
}

ShowCar();

reset();
drawBackground();
}
}
simulate=false;
}

void drawBackground() {
background(50);
fill(255);
textSize(50);
text("Ziegenproblem", width/2, 100);
textSize(12);
text("Versuche: "+trys+" Treffer: "+hits+" Quote: "+(float)hits/trys*100+"%", width/2, 380);
if (youWon) {
textSize(40);
fill(200, 50, 50);
text("You Won!!!", width/2, 350);
}
for (int i=0;i<3;i++) {
door[i].render();
}
}

void mousePressed() {
if (mouseY > 100 &! showCar) {
for (int i=0;i<3;i++) {
door[i].isHit();
}
}
}

// Aktion Button Play Mode
public void Play_Mode() {
loop();
trys=0;
hits=0;
mode=0;
}

// Aktion Slider Iterations
public void Iterations(int wh) {
Iterations= int(wh);
}

// Aktion Button Simulation Mode
public void Simulation_Mode() {
simulate=true;
trys=0;
hits=0;
mode=1;
}

// Aktion Button Reset
public void Reset() {
reset();
}

// Aktion Radio Button
void controlEvent(ControlEvent theEvent) {
if (theEvent.isGroup()) {
changeChoice=!changeChoice;
}
}

// Aktion Button OpenDoor
public void OpenDoor() {
while (!doorIsOpen) {
int doorToOpen=int(random(0, 3));
if (!door[doorToOpen].isChosen && !door[doorToOpen].hasCar) {
door[doorToOpen].isOpened=true;
//println("DoorOpened: "+ doorToOpen);
doorIsOpen=true;
}
}
}

public void reset() {
doorIsOpen =false;
// create Doors
for (int i=0;i<3;i++) {
door[i] = new Door(i);
}

// verstecke Auto
int hideCarIn=(int) random(0, 3);
door[hideCarIn].hasCar=true;
boolean showCar  = false;
youWon=false;
}

// Aktion Button ShowCar
public void ShowCar() {

if (doorIsOpen) showCar  = true;
int hasCar=5;
int isChosen=5;
for (int i=0;i<3;i++) {
if (door[i].hasCar) hasCar=i;
if (door[i].isChosen) isChosen=i;
}
trys++;
if (hasCar==isChosen) {
hits++;
youWon=true;
}
}

class Door {

int index;
boolean isChosen, hasCar, isOpened;

Door (int index) {
this.index = index;
hasCar=false;
showCar=false;
isChosen=false;
}

void render() {
pushMatrix();
pushStyle();
stroke(255);
fill(0);
translate((index+1)*width/4, 240);

if (isChosen) {
strokeWeight(4);
stroke(0, 200, 50);
} else fill(0);
rect(0, 0, 100, 150);
stroke(255);
fill(0);
textSize(50);
if (hasCar && showCar) {
fill(255, 0, 40, 50);
image(car, 0, 0, 90, 90);
} else if (isOpened) {
fill(255, 0, 40, 50);
image(goat, 0, 0, 90, 90);
}
popStyle();
popMatrix();
}

void isHit() {
if (mouseX>((index+1)*width/4)-50
&& mouseX<((index+1)*width/4)+50
&& mouseY>240-75
&& mouseY<240+75) {
isChosen=true;
}
else  isChosen=false;
}
}
Advertisements

Ein Kommentar

  1. Pingback: Processing – Über dieses Weblog « processing – tutorial

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: