Schiffe versenken mit KI (Source)



  • Hallo Leute.
    Habe das Spiel geschrieben und es funktioniert auch,
    Ich will wissen was Ihr anders gemacht hättest, oder was zu viel war, was fehlt,
    und Kritik bitte.
    Danke, hier ist es:

    #include <iostream>
    #include <time.h>
    #include <stdlib.h>
    using namespace std;
    char cEfeld[9][10];// fEINDLICHES FELD SICHTBAR
    char cMfeld[9][10];//Mein Feld
    char vMirror[9][10];// Feindliches feld unsichbar
    int im = 0, ki = 0;// schiffe getroffen
    void showf();//zeige felder
    void filfelds();//fuhle felder mit werten
    void mships();//meine schiffe platzieren
    int setposs(char v, char h, int con);//setze werte in felder
    void battle();//Feuer auf positionen
    void kiship();//KI setz schiffe auf vMirror
    void kifire();// KI feuert
    int main()
    {
    	srand((unsigned)time(NULL));
    	filfelds();
    	showf();
    	mships();
    	kiship();
    	while (true)
    	{
    		battle();
    		if (ki == 5)
    		{
    			cout << "KI gewonnen.exit.";
    			return 0;
    		}
    		else if (im == 5)
    		{
    			cout << "Sie haben gewonnen.";
    			return 0;
    		}
    	}
    }
    
    void kifire()
    {
    	int v, h, z = 0;
    	while (z == 0)
    	{
    		v = 1 + rand() % 10;
    		h = 1 + rand() % 9;
    		if (cMfeld[v][h] == '.')
    		{
    			cMfeld[v][h] = '0';
    			z = 1;
    		}
    		else if (cMfeld[v][h] == '0')
    		{
    			z = 0;
    		}
    		else if (cMfeld[v][h] == '%')
    		{
    			z = 0;
    		}
    		else if (cMfeld[v][h] == '#')
    		{
                  cMfeld[v][h] = '%';
                  ki++;
                  z = 1;
    		}
    	}
    }
    
    void battle()
    {
    	char v, h;
    	cout << "Feuer auf Posizion :";
    	cin >> h;
    	cin >> v;
    	if (h < 'A' || h > 'I')
    	{
    		cout << "Falsche Koordinaten." << endl;
    	}
    	else if (v < '1' || v > '8')
    	{
    		cout << "Falsche Koordinaten." << endl;
    	}
    	else
    	{
    		setposs(v, h, 1);
    		if (im == 5)
    		{
    			showf();
    		}
    		else if (ki == 5)
    		{
    			showf();
    		}
    		else
    		{
    			kifire();
    			showf();
    		}
    	}
    }
    
    void kiship()
    {
    	int z = 5, v, h;
    	while (z != 0)
    	{
    		v = 1 + rand() % 10;
    		h = 1 + rand() % 9;
    		if (vMirror[v][h] == '.')
    		{
    			vMirror[v][h] = '#';
    			z--;
    		}
    	}
    }
    
    int setposs(char v, char h, int con)
    {
    	int vv, hh;
    	if (h == 'A')
    		hh = 1;
    	if (h == 'B')
    		hh = 2;
    	if (h == 'C')
    		hh = 3;
    	if (h == 'D')
    		hh = 4;
    	if (h == 'E')
    		hh = 5;
    	if (h == 'F')
    		hh = 6;
    	if (h == 'G')
    		hh = 7;
    	if (h == 'H')
    		hh = 8;
    	if (h == 'I')
    		hh = 9;
    	if (v == '1')
    		vv = 1;
    	if (v == '2')
    		vv = 2;
    	if (v == '3')
    		vv = 3;
    	if (v == '4')
    		vv = 4;
    	if (v == '5')
    		vv = 5;
    	if (v == '6')
    		vv = 6;
    	if (v == '7')
    		vv = 7;
    	if (v == '8')
    		vv = 8;
    	if (con == 0)
    	{
    		if (cMfeld[vv][hh] == '.')
    		{
    			cMfeld[vv][hh] = '#';
    			return 0;
    		}
    		else
    			return 1;
    	}
    	if (con == 1)
    	{
    		if (vMirror[vv][hh] == '.')
    			cEfeld[vv][hh] = '0';
    		if (vMirror[vv][hh] == '#')
    		{
    			cEfeld[vv][hh] = '%';
    			vMirror[vv][hh] = '%';
                im++;
    		}
    	}
    	return 0;
    }
    
    void mships()
    {
    	int ships = 5;
    	char v, h;
    	while (ships != 0)
    	{
    		cout << "\nSchiffe platzieren:" << endl;
    		cout << "Noch " << ships << " übrig\n";
    		cout << ">";
    		cin >> h;
    		if (h < 'A' || h > 'I')
    		{
    			cout << "Falsche Koordinaten." << endl;
    		}
    		else
    		{
    			cin >> v;
    			if (v < '1' || v > '8')
    			{
    				cout << "Falsche Koordinaten.\n";
    			}
    			else
    			{
    				int p = setposs(v, h, 0);
    				if (p == 0)
    				{
    					ships--;
    					showf();
    				}
    				else
    				{
    					cout << "Falsche Koordinaten.\n";
    				}
    			}
    		}
    	}
    }
    
    void showf()
    {
    	cout << "Meine Karte" << endl;
    	for (int z = 0; z < 9; z++)
    	{
    		for (int k = 0; k < 10; k++)
    		{
    			cout << cMfeld[z][k] << " ";
    		}
    		cout << endl;
    	}
    	cout << "-------------------" << endl;
    	cout << "Feind Karte" << endl;
    	for (int z = 0; z < 9; z++)
    	{
    		for (int k = 0; k < 10; k++)
    		{
    			cout << cEfeld[z][k] << " ";
    		}
    		cout << endl;
    	}
    }
    
    void filfelds()
    {
    	char v = '0';
    	char h = 'A';
    	for (int z = 0; z < 9; z++)
    	{
    		for (int k = 0; k < 10; k++)
    		{
    			if (k == 0)
    			{
    				cEfeld[z][k] = v;
    				cMfeld[z][k] = v;
    				vMirror[z][k] = v;
    				v++;
    			}
    			else if (z == 0)
    			{
    				cEfeld[z][k] = h;
    				cMfeld[z][k] = h;
    				vMirror[z][k] = h;
    				h++;
    			}
    			else
    			{
    				cEfeld[z][k] = '.';
    				cMfeld[z][k] = '.';
    				vMirror[z][k] = '.';
    			}
    			cEfeld[0][0] = ' ';
    			cMfeld[0][0] = ' ';
    		}
    	}
    }
    


  • //46-64
    switch (cMfeld[v][h]){
    case '.':
    	cMfeld[v][h] = '0';
    	z = 1;
    	break;
    case '0':
    case '%':
    	z = 0;
    	break;
    case '#':
    	cMfeld[v][h] = '%';
    	ki++;
    	z = 1;
    	break;
    }
    //119-152
    hh = h - 64; //was passiert eigentlich, wenn h kein Buchstabe von 'A'-'I' ist?
    vv = v - '0';
    

    Ansonsten Variablen sinnvolle Namen geben. Was bedeuten v, k, h, z?
    Statt "im" kann man die Variable "getroffeneSchiffeDesSpielers" nennen, dann sieht man auch besser durch.



  • if (h == 'A')
    hh = 1;
    if (h == 'B')
    hh = 2;
    if (h == 'C')
    hh = 3;
    if (h == 'D')
    hh = 4;
    if (h == 'E')
    hh = 5;
    if (h == 'F')
    hh = 6;
    if (h == 'G')
    hh = 7;
    if (h == 'H')
    hh = 8;
    if (h == 'I')
    hh = 9;
    if (v == '1')
    vv = 1;
    if (v == '2')
    vv = 2;
    if (v == '3')
    vv = 3;
    if (v == '4')
    vv = 4;
    if (v == '5')
    vv = 5;
    if (v == '6')
    vv = 6;
    if (v == '7')
    vv = 7;
    if (v == '8')
    vv = 8;

    spar dir die 23424234 ifs und ersetze das durch die entsprechende umrechung der buchstaben in Zahlen.
    hh = 1 ist identisch zu
    hh = (h+1)-'A'(oder so ähnlich bin gerade sehr müde und kein lust nachzudenken).
    D.h. direkte errechnung ist mögich



  • Danke Jungs. !!!!



  • Hi!

    Schöne Lösung und es funktioniert. Eine KI wäre "cooler", wenn diese dazu lernt. Aber das wäre mehr Code.


Log in to reply