VierGewinnt: 4 in einer Reihe?



  • Hallo,

    ich wusste nicht genau wohin mit dem Thema, hab es mal hier gepostet, da es aus meiner Sicht hier am ehesten hinpasst.

    Ich hab dieses Programm geschrieben:

    #include <iostream>
    
    using namespace std;
    
    void spmode();
    void mpmode();
    void man();
    
    bool bSieg=false;
    
    void feld_ausgeben(char *pcFeld);
    inline char auswerten(char zeichen, char *cSpielfeld);
    
    int main()
    {
    	char cAuswahl[9]={0};
    
    	while(cAuswahl[0]!='4')
    	{
    		cout<<"VierGewinnt!"<<endl;
    		cout<<"-------------------"<<endl;
    		cout<<"1: Einzelspielermodus"<<endl;
    		cout<<"2: Zweispielermodus"<<endl;
    		cout<<"3: Spielanleitung"<<endl;
    		cout<<"-------------------"<<endl;
    		cout<<"4: Beenden"<<endl;
    
    		cin.get(cAuswahl,8);
    
    		switch(cAuswahl[0])
    		{
    			case('1'):
    			{
    				spmode();
    				cin.ignore();
    				break;
    			}
    			case('2'):
    			{
    				mpmode();
    				cin.ignore();
    				break;
    			}
    			case('3'):
    			{
    				man();
    				cin.ignore();
    				break;
    			}
    			case('4'):
    			{
    				break;
    			}
    			default:
    			{
    				cout<<"Ungueltige Eingabe!"<<endl<<endl;
    				cin.ignore();
    			}
    		}
    	}
    	return 0;
    }
    
    void spmode()
    {
    	char cSpielfeld[6][7]={};
    	bool bSieg=false;
    
    	for(int iZeile=0; iZeile<6; iZeile++)
        	{
    		for(int iSpalte=0; iSpalte<7; iSpalte++)
    		{
    			    cSpielfeld[iZeile][iSpalte]='-';
    		}
    	}
    
    	cout<<"Willkommen im Einspielermodus!"<<endl;
    
    	while(bSieg==false)
    	{
    		feld_ausgeben(&(cSpielfeld[0][0]));
    		auswerten('o', &(cSpielfeld[0][0]));
    
    		feld_ausgeben(&(cSpielfeld[0][0]));
    		auswerten('#', &(cSpielfeld[0][0]));
    	}
    }
    
    void mpmode()
    {	
    	char cSpielfeld[6][7]={};
    
    	for(int iZeile=0; iZeile<6; iZeile++)
        	{
    		for(int iSpalte=0; iSpalte<7; iSpalte++)
    		{
    			    cSpielfeld[iZeile][iSpalte]='-';
    		}
    	}
    
    	cout<<"Willkommen im Mehrspielermodus!"<<endl;
    
    	bSieg=false;
    	while(bSieg==false)
    	{
    
    		feld_ausgeben(&(cSpielfeld[0][0]));
    		auswerten('o', &(cSpielfeld[0][0]));
    
    		if(bSieg==false)
    		{
    			feld_ausgeben(&(cSpielfeld[0][0]));
    			auswerten('x', &(cSpielfeld[0][0]));
    		}
    
    	}
    }
    
    void man()
    {
    	cout<<"Anleitung"<<endl;
    }
    
    void feld_ausgeben(char *pcFeld)
    {
        for(int i=1; i<43; pcFeld++, i++) //*pcFeld zeigt auf [0][0], wenn dies um 1(4 byte) erhöht wird, kommt man zum nächsten Speicherplatz des Arrays
        {
                cout<<*pcFeld<<" ";
                if(i%7==0) //immer bei 7 eine neue Zeile beginnen
                {
                    if(i==42)
                    {
                        cout<<endl; //bei 42 eine Leerzeile dazu
                    }
                    cout<<endl;
                }
        }
    }
    
    inline char auswerten(char zeichen, char *cSpielfeld)
    {
    	cin.ignore();
    	char cSpalte[9]={8};
    
    	if(zeichen=='o')
    	{
    		cout<<"Spieler1 ist am Zug:";
    		cin.get(cSpalte,8);
    	}
    	else if(zeichen=='x')
    	{
    		cout<<"Spieler2 ist am Zug:";
    		cin.get(cSpalte,8);
    	}
    	else
    	{
    		//ki();
    	}
    
    	int iSpalte=static_cast<int> (cSpalte[0]-49); //casten und von char in int umrechnen
    
    	cSpielfeld+=iSpalte;
    	if(iSpalte>6 || iSpalte<0 || *cSpielfeld=='o' || *cSpielfeld=='x')
    	{
    		cout<<"Ungueltige Eingabe"<<endl;
    		cSpielfeld-=iSpalte;
    		auswerten(zeichen, cSpielfeld);
    		return '0';
    	}
    	cSpielfeld-=iSpalte;
    	cout<<endl<<endl;
    
    	for(int iZeile=5; iZeile>=0; iZeile--)
    	{
    		cSpielfeld=cSpielfeld+(iZeile*7)+(iSpalte); //[0][0] für jede Zeile und das 7fache der gewünschten Zeile erhöhen und die Spalte dazuaddieren
    		if(*cSpielfeld=='-')
    		{
    			*cSpielfeld=zeichen;
    			iZeile=0; //um aus der oberen for-Schleife zu gelangen
    
    			// waagrecht nach rechts
    			for(int i=0; i<=4; cSpielfeld++, i++)
    			{
    				char j=*cSpielfeld;
    
    				if(i==4)
    				{
    					if(zeichen=='o')
    					{
    						cout<<"Spieler1 hat gewonnen!"<<endl;
    					}
    					else if(zeichen=='x')
    					{
    						cout<<"Spieler2 hat gewonnen!"<<endl;
    					}
    					else if(zeichen=='#')
    					{
    						cout<<"Computer hat gewonnen!"<<endl;
    					}
    					bSieg=true; //um das weiterspielen zu verhindern(siehe mpmode())
    					return '2';
    				}
    				else if(j!=zeichen)
    				{
    					//waagrecht nach links
    					for(cSpielfeld-=(i+1); i<=4; cSpielfeld--,i++)
    					{
    						j=*cSpielfeld;
    
    						if(i==4)
    						{
    							if(zeichen=='o')
    							{
    								cout<<"Spieler1 hat gewonnen!"<<endl;
    							}
    							else if(zeichen=='x')
    							{
    								cout<<"Spieler2 hat gewonnen!"<<endl;
    							}
    							else if(zeichen=='#')
    							{
    								cout<<"Computer hat gewonnen!"<<endl;
    							}
    							bSieg=true;
    							return '2';
    						}
    						else if(j!=zeichen)
    						{	
    							//abwaerts
    							for(cSpielfeld++,i=0; i<=4; cSpielfeld+=7, i++)
    							{
    								j=*cSpielfeld;
    
    								if(i==4)
    								{
    									if(zeichen=='o')
    									{
    										cout<<"Spieler1 hat gewonnen!"<<endl;
    									}
    									else if(zeichen=='x')
    									{
    										cout<<"Spieler2 hat gewonnen!"<<endl;
    									}
    									else if(zeichen=='#')
    									{
    										cout<<"Computer hat gewonnen!"<<endl;
    									}
    									bSieg=true;
    									return '2';
    								}
    								else if(j!=zeichen)
    								{
    									//diagonal rechts abwaerts
    									for(cSpielfeld-=7,i=0;i<=4;cSpielfeld+=8,i++)
    									{
    										j=*cSpielfeld;
    
    										if(i==4)
    										{
    											if(zeichen=='o')
    											{
    												cout<<"Spieler1 hat gewonnen!"<<endl;
    											}
    											else if(zeichen=='x')
    											{
    												cout<<"Spieler2 hat gewonnen!"<<endl;
    											}
    											else if(zeichen=='#')
    											{
    												cout<<"Computer hat gewonnen!"<<endl;
    											}
    											bSieg=true;
    											return '2';
    										}
    										else if(j!=zeichen)
    										{
    											//diagonal link aufwaerts
    											for(cSpielfeld-=(i*8); i<=4; cSpielfeld-=8, i++)
    											{
    												j=*cSpielfeld;
    
    												if(i==4)
    												{
    													if(zeichen=='o')
    													{
    														cout<<"Spieler1 hat gewonnen!"<<endl;
    													}
    													else if(zeichen=='x')
    													{
    														cout<<"Spieler2 hat gewonnen!"<<endl;
    													}
    													else if(zeichen=='#')
    													{
    														cout<<"Computer hat gewonnen!"<<endl;
    													}
    													bSieg=true;
    													return '2';
    												}
    												else if(j!=zeichen)
    												{
    													//diagonal links abwaerts
    													for(cSpielfeld+=8, i=0; i<=4; cSpielfeld+=6, i++)
    													{
    														j=*cSpielfeld;
    
    														if(i==4)
    														{
    															if(zeichen=='o')
    															{
    																cout<<"Spieler1 hat gewonnen!"<<endl;
    															}
    															else if(zeichen=='x')
    															{
    																cout<<"Spieler2 hat gewonnen!"<<endl;
    															}
    															else if(zeichen=='#')
    															{
    																cout<<"Computer hat gewonnen!"<<endl;
    															}
    															bSieg=true;
    															return '2';
    														}
    														else if(j!=zeichen)
    														{
    															//diagonal rechts aufwaerts
    															for(cSpielfeld-=(i*6); i<=4; cSpielfeld-=6, i++)
    															{
    																j=*cSpielfeld;
    
    																if(i==4)
    																{
    																	if(zeichen=='o')
    																		{
    																			cout<<"Spieler1 hat gewonnen!"<<endl;
    																		}
    																		else if(zeichen=='x')
    																		{
    																			cout<<"Spieler2 hat gewonnen!"<<endl;
    																		}
    																		else if(zeichen=='#')
    																		{
    																			cout<<"Computer hat gewonnen!"<<endl;
    																		}
    																		bSieg=true;
    																		return '2';
    																}
    																else if(j!=zeichen)
    																{
    																	i=5;
    																	break;
    																}
    															}
    														}
    													}
    												}
    											}
    										}
    									}
    								}
    							}
    						}	
    					}
    				}
    			}
    		}
    		cSpielfeld=cSpielfeld-(iZeile*7)-(iSpalte);
    	}
    	return '1';
    }
    

    Meine Frage ist nun wie ihr die Überpürfung gemacht hättet, um rauszufinden ob jmd 4 in einer Reihe hat. Btw Anleitung noch nicht geschrieben, und Einzelspielermodus mit KI auch noch nicht.

    Mein System erweißt sich als komplizierter als ich zuerst dachte, da ich jetzt auch noch das Problem habe das er beim eig. Ende des Spielfeldes auf die nächste Ebene geht, aufgrund dessen das der Speicherplatz der nächsten Stelle sich dort befindet.
    In "inline char auswerten(char zeichen, char *cSpielfeld)" gleich nach

    if(*cSpielfeld=='-')
    		{
    			*cSpielfeld=zeichen;
    

    beginnts.

    Natürlich hätte man das ganze in einzelne Funktionen packen können und in eine Header-Datei...aber da es sich sowieso noch in Test-Phase befindet tat ich mir das noch nicht an.

    Auf jeden Fall war dies eine gute Denkübung 😃 vielen Dank schonmal für eure Hilfe.



  • wer soll sich das denn durchlesen? wie waers, wenn du nur das stueckchen reinkopierst, von dem du wissen willst, ob es so vernuenftig ist? nach besser waere es in pseudocode, um von implementationsproblemen voellig zu abstrahieren.


Anmelden zum Antworten