MATHE-Würfel-Spiel



  • Hallo,

    ich sitze zur Zeit an einem kleinen Problem. Und zwar würde ich gern ein Programm schreiben, welches mir folgendes Würfelspiel berechnet:

    Zuerst wird eine Zahl x zwischen 1 und 100 festgelegt.

    Nun werden gleichzeitig 3 Würfel geworfen.
    Ziel ist es mit den geworfenen Augen durch +,-,*,/ möglichst nahe an die vorgegebene Zahl heran zu kommen.
    Es ist auch möglich die einzelnen Augenwerte mit 10 zu multiplizieren.

    Die Differenz zwischen Ergebnis und gesuchter Zahl wird als punktzahl aufgeschrieben. Wer am Ende die wenigsten Punkte hat gewinnt.

    BEISPIELE:

    Vorgegebene Zahl : 12

    geworfene Augen : 4,3,1

    Lösung: 4*3*1=12
    12-12=0

    0 Punkte

    Vorgegebene Zahl : 31

    geworfene Augen : 3,1,2

    mögl. Lösung: 30*1+2=32
    |31-32|=1

    1 Punkt

    usw.

    Das Prog soll nicht das ganze Spiel simulieren. Es soll dabei helfen nach besseren Lösungen zu suchen.
    Die 3 Augenwerte sollen manuell eingegeben werden.

    Am Ende soll der Lösungsweg, das Ergebnis und die Differenz ausgegeben werden.

    Bei mehreren gleichen Differenzen auch diese.

    Ich hab das ganze hier schon mal ansatzweise verscht, bekomme jedoch noch abstruse Werte raus. Habt Ihr vllt eine Idee? Oder Verbesserungsvorschläge?

    Hier mal mein Code:

    //============================================================================

    // Name : BestCombination.cpp

    // Author : JonnyDV

    // Version : 1

    //============================================================================

    #include <iostream>

    #include <stdio.h>

    #include <cmath>

    #include <string>

    #include <ext/hash_map>

    #include <vector.h>

    #include <map.h>

    #include <list.h>

    #include <pair.h>

    #include <algorithm>

    using namespace std;

    using namespace __gnu_cxx;

    //Vektor der fuer jede moegliche Permutation einen Vektor speichert. Laenge 48 da 48 moegliche Permutationen.

    vector<int> permutations[48];

    //array in dem alle vier Rechenoperationen drinstehn als string

    string operations[4];

    //Methode um alle Permutationen zu berechnen und diese in dem oben genannten Vektor zu speichern.

    int combinations(int a, int b, int c) {

    int myints[] = {a, b, c};

    int i = 0;

    //cout << "The 3! possible permutations with this 3 elements:\n";

    sort (myints,myints+3);

    do {

    vector<int> zahlen;

    // cout << myints[0] << " " << myints[1] << " " << myints[2] << endl;

    zahlen.push_back(myints[0]);

    zahlen.push_back(myints[1]);

    zahlen.push_back(myints[2]);

    //cout << zahlen[0] << " " << zahlen[1] << " " << zahlen[2] << endl;

    //cout << "groesse: " << zahlen.size()<<endl;

    permutations[i] = zahlen;

    i++;

    //maaaaaaaaagic... 😉

    } while ( next_permutation (myints,myints+3) );

    return 0;

    }

    /*

    ###########################################

    # #

    # METHODEN #

    # #

    ###########################################

    */

    void compDiff(vector<int> permutation, string a, string b, int wanted) {

    int d = permutation[0];

    int e = permutation[1];

    int f = permutation[2];

    cout<<" "<<permutation[0]<<endl;

    //das sind die Werte die wir mit den Zahlen erreichen

    int value1 = 33;

    int value2 = 22;

    //die Differenz zu der Zahl die wir erreichen wollten:

    int diff = 0;

    if (a == "+") {

    if (b == "-") {

    value1 = (d+e)-f;

    value2 = d+(e-f);

    }

    else {

    if (b == "*") {

    value1 = (d+e)*f;

    value2 = d+(e*f);

    }

    else {

    if (b == "/") {

    if ((d+e)% f != 0 || e % f != 0){

    cout<<"gibt ne kommazahl, doooooof"<<endl;

    }

    else {

    value1 = (d+e)/f;

    value2 = d+(e/f);

    }

    }

    }

    }

    }

    else {

    if (a == "-") {

    if(b == "+") {

    value1 = (d-e)+f;

    value2 = d-(e+f);

    }

    else {

    if (b == "-") {

    value1 = (d-e)-f;

    value2 = d-(e-f);

    }

    else {

    if (b == "*") {

    value1 = (d-e)*f;

    value2 = d-(e*f);

    }

    else {

    if (b == "/") {

    if ((d-e)% f != 0 || e % f != 0){

    cout<<"gibt ne kommazahl, doooooof"<<endl;

    }

    else {

    value1 = (d-e)/f;

    value2 = d-(e/f);

    }

    }

    }

    }

    }

    }

    else {

    if (a == "*") {

    if(b == "+") {

    value1 = (d*e)+f;

    value2 = d*(e+f);

    }

    else {

    if (b == "-") {

    value1 = (d*e)-f;

    value2 = d*(e-f);

    }

    else {

    if (b == "/") {

    if ((d*e)% f != 0 || e % f != 0){

    cout<<"gibt ne kommazahl, doooooof"<<endl;

    }

    else {

    value1 = (d*e)/f;

    value2 = d*(e/f);

    }

    }

    }

    }

    }

    else {

    if (a == "/") {

    if(b == "+") {

    if((d % e != 0) || (d % (e+f)!=0)) {

    cout<<"Gibt ne Kommazahl, blöd."<<endl;

    }

    else {

    value1 = (d/e)+f;

    value2 = d/(e+f);

    }

    }

    else {

    if (b == "-") {

    if((d % e != 0) || (d % (e-f)!=0)) {

    cout<<"Gibt ne Kommazahl, blöd."<<endl;

    }

    else {

    value1 = (d/e)-f;

    value2 = d/(e-f);

    }

    }

    else {

    if (b == "*") {

    if((d % e != 0) || (d % (e*f)!=0)) {

    cout<<"Gibt ne Kommazahl, blöd."<<endl;

    }

    else {

    value1 = (d/e)*f;

    value2 = d/(e*f);

    }

    }

    else {

    if (b == "/") {

    if ((d % e != 0) || (d/e)% f != 0 || e % f != 0){

    cout<<"gibt ne kommazahl, doooooof"<<endl;

    }

    else {

    value1 = (d/e)/f;

    value2 = d/(e/f);

    }

    }

    }

    }

    }

    }

    }

    }

    cout<<"Value1: " <<value1<<endl;

    cout<<"Value2: " <<value2<<endl;

    }

    }

    void computeSimple(vector<int> permutation, string a, int wanted) {

    int d = permutation[0];

    int e = permutation[1];

    int f = permutation[2];

    cout<<" "<<permutation[0]<<endl;

    //cout<<"Die Zahlen der aktuellen Permutation lauten: "<<d<<", "<<e<<", und "<<f<<endl;

    //das ist der Wert den wir mit den Zahlen erreichen

    int value = 0;

    //die Differenz zu der Zahl die wir erreichen wollten:

    int diff = 0;

    if (a == "+") {

    value = d+e+f;

    }

    else {

    value = d*e*f;

    }

    diff = wanted-value;

    //cout<<"Der berechnete Wert lautet: "<<value<<endl;

    //cout<<"Die Differenz betraegt: "<<diff<<endl;

    }

    //Methode um die Permutation zu finden die am naehsten an die gesuchte Zahl rankommt. Bei mehreren Permutationen mit

    //derselben Distanz zur "Zielzahl" werden alle moegliche Permutationen ausgegeben.

    void search(int wanted) {

    //Laufvariable fuer die Permutationen

    int i;

    //Laufvariable fuer den ersten Operant

    int k;

    //Laufvariable fuer den zweiten Operant

    int l;

    //ueber alle Permutationen gehen

    for (i = 0; i <= 48; i++) {

    //alle operanten der reihe nach

    for(k = 0; k < 4; k++) {

    //nochmal alle operanten

    for(l = 0; l < 4; l++) {

    switch(k)

    {

    //wenn der erste operant plus ist:

    case 0: switch(l)

    {

    //wenn beide Operanten "plus" sind: dann geh in die Methode die ohne Klammern rechnet

    case 0: //cout <<"Beide Operanten sind PLUS"<<endl;

    computeSimple(permutations[i], operations[k], wanted);

    break;

    //wenn es unterschiedliche Operanten sind: nimm die Methode mit der Klammersetzung

    default: //cout<<"Unterschiedliche Operanten"<<endl;

    compDiff(permutations[i], operations[k], operations[l], wanted);

    break;

    }

    break;

    //wenn der erste operant minus ist:

    case 1: compDiff(permutations[i], operations[k], operations[l], wanted);

    break;

    //wenn der erste operant mal ist:

    case 2: switch(k)

    {

    //wenn beide Operanten "mal" sind:

    case 2: //cout <<"Beide Operanten sind MAL"<<endl;

    computeSimple(permutations[i], operations[k], wanted);

    break;

    //bei unterschiedlichen operanten:

    default: //cout<<"Unterschiedliche Operanten"<<endl;

    compDiff(permutations[i], operations[k], operations[l], wanted);

    break;

    }

    break;

    //wenn der erste operant geteilt ist:

    case 3: compDiff(permutations[i], operations[k], operations[l], wanted);

    break;

    //wenn da irgend ein bullshit ist:

    default: //cout<<"Uuups, da is wohl ein Fehler..."<<endl;

    break;

    }

    }

    }

    }

    }

    //lies die gesuchte zahl ein

    int input_searched(){

    int z;

    cin>>z;

    while (z<=0 || z>100){

    cout<<"Zahl muss zwischen 1 und 100 liegen ! Bitte neu eingeben: "<<'\n';

    cin>>z;

    }

    return z;

    }

    //lies die augenzahl ein

    int input_dice(){

    int z;

    cin>>z;

    while (z<=0 || z>6){

    cout<<"Zahl muss zwischen 1 und 6 liegen ! Bitte neu eingeben: "<<'\n';

    cin>>z;

    }

    return z;

    }

    /*

    ###########################################

    # #

    # HAUPTPROGRAMM #

    # #

    ###########################################

    */

    int main(){

    int zahl, zahl1, zahl2, zahl3;

    cout << "Bitte die Zahl eingeben die erreicht werden soll: ";

    zahl = input_searched();

    cout<<zahl<<'\n';

    cout<<"Bitte die erste Zahl des Würfels eingeben: ";

    zahl1 = input_dice();

    cout<<zahl1<<'\n';

    cout<<"Bitte die zweite Zahl des Würfels eingeben: ";

    zahl2 = input_dice();

    cout<<zahl2<<'\n';

    cout<<"Bitte die dritte Zahl des Würfels eingeben: ";

    zahl3 = input_dice();

    cout<<zahl3<<'\n';

    operations[0] = "+";

    operations[1] = "-";

    operations[2] = "*";

    operations[3] = "/";

    //Vektor, der nen Vektor<string, string> enthaelt, erster string fuer Kombi, zweiter fuer Operanten, int fuer Distanz

    //vector <vector<string, string>, int> combidistance;

    combinations(zahl1, zahl2, zahl3);

    combinations(zahl1*10, zahl2, zahl3);

    combinations(zahl1, zahl2*10, zahl3);

    combinations(zahl1, zahl2, zahl3*10);

    combinations(zahl1*10, zahl2*10, zahl3);

    combinations(zahl1*10, zahl2, zahl3*10);

    combinations(zahl1, zahl2*10, zahl3*10);

    combinations(zahl1*10, zahl2*10, zahl3*10);

    //ZUM TESTEN:

    search(zahl);

    system("PAUSE");

    return 0;

    }



  • 1.) Code Tags verwenden
    2.) Falsches Forum
    3.) Bitte Fehler etc. mitteilen! Was sind abstruse Dinge?

    😉

    edit: oh....der Thread ist wohl schon etwas älter...ob der Erstelle das noch mitbekommt...

    lg, freakC++



  • Ich habs mal anders eingetippt.

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    double ziel;
    double bestes;
    
    void test3(double a,double b,double c) {
    	{
    		double x=a+b+c;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'+'<<b<<'+'<<c<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=a+b-c;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'+'<<b<<'-'<<c<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=a+(b-c);
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'+'<<'('<<b<<'-'<<c<<')'<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=a+b*c;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'+'<<b<<'*'<<c<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=(a+b)*c;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<'('<<a<<'+'<<b<<')'<<'*'<<c<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=a+b/c;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'+'<<b<<'/'<<c<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=(a+b)/c;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<'('<<a<<'+'<<b<<')'<<'/'<<c<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=a-b-c;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'-'<<b<<'-'<<c<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=a-(b-c);
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'-'<<'('<<b<<'-'<<c<<')'<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=a-b*c;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'-'<<b<<'*'<<c<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=(a-b)*c;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<'('<<a<<'-'<<b<<')'<<'*'<<c<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=a-b/c;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'-'<<b<<'/'<<c<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=(a-b)/c;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<'('<<a<<'-'<<b<<')'<<'/'<<c<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=a*b*c;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'*'<<b<<'*'<<c<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=a*b/c;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'*'<<b<<'/'<<c<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=a/b/c;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'/'<<b<<'/'<<c<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=(a/b)/c;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<'('<<a<<'/'<<b<<')'<<'/'<<c<<'='<<x<<'\n';
    		}
    	}
    }
    
    void test3(double a,double b) {
    	{
    		double x=a+b;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'+'<<b<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=a-b;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'-'<<b<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=a*b;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'*'<<b<<'='<<x<<'\n';
    		}
    	}
    	{
    		double x=a/b;
    		double d=abs(x-ziel);
    		if (d<=bestes) {
    			bestes=d;
    			cout<<a<<'/'<<b<<'='<<x<<'\n';
    		}
    	}
    }
    
    void test2(double a,double b,double c) {
    	test3(a,b,c);
    	test3(a,b,10*c);
    	test3(a,10*b,c);
    	test3(a,10*b,10*c);
    	test3(10*a,b,c);
    	test3(10*a,b,10*c);
    	test3(10*a,10*b,c);
    	test3(10*a,10*b,10*c);
    	test3(10*a+b,c);
    	test3(10*a+c,b);
    	test3(10*b+a,c);
    	test3(10*b+c,a);
    	test3(10*c+a,b);
    	test3(10*c+b,a);
    }
    
    void test1(double a,double b,double c) {
    	test2(a,b,c);
    	test2(a,c,b);
    	test2(b,a,c);
    	test2(b,c,a);
    	test2(c,a,b);
    	test2(c,b,a);
    }
    
    int main() {
    	int a=3;
    	int b=2;
    	int c=1;
    	ziel=31;
    	bestes=1000;
    	test1(a,b,c);
    	return 0;
    }
    
    30+2-1=31
    30+(2-1)=31
    32-1=31
    30-(1-2)=31
    32-1=31
    2+30-1=31
    2+(30-1)=31
    32-1=31
    2-(1-30)=31
    32-1=31
    32-1=31
    32-1=31
    

Anmelden zum Antworten