Gra planszowa – rozpoczęcie po wyrzuceniu 4 i 1 w dwóch rzutach

0

Hej
Mam następujące zadanie - czterech graczy gra w grę planszową, zaczynają oni od pola zero. W grze jest X pól. X jest liczbą podawaną przez użytkownika. Gdy jeden z graczy osiągnie ostatnie pole to gra się kończy i wyświetlany jest komunikat "koniec gry". Mój kod:


#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
	int poleg1 = 0;  /* zmienne okreslajace aktualne miejsca graczy*/
	int poleg2 = 0;
	int	poleg3 = 0;
	int	poleg4 = 0;
	int X;     /* X - ilość pól  */
	int M;     /* M - kazdorazowy wynik rzutu kostka*/
	cout << "Podaj ilosc pol: ";
	cin >> X;
	
	for (int i = 0; ; i++) {
		cout << "Podaj wyniki rzutow: " << endl;
		cin >> M;
		poleg1 = poleg1 + M;
		cin >> M;
		poleg2 = poleg2 + M;
		cin >> M;
		poleg3 = poleg3 + M;
		cin >> M;
		poleg4 = poleg4 + M;

		cout << poleg1 << "_" << poleg2 << "_" << poleg3 << "_" << poleg4 << endl;  /* wyswietlanie stanu gry po kazdej kolejce*/
		 if ( poleg1 >= X || poleg2 >= X || poleg3 >= X || poleg4 >= X)   
		{
			cout << "THE END OF GAME" << endl;
			break;
		}
	}
    return 0; }

Teraz jak to przerobić, jeśli chcemy aby gracze zaczynali dopiero po wyrzuceniu najpierw 4, a potem 1 (czyli jeśli nie wyrzucą w dwóch kolejnych rzutach 4 oraz 1, to stoją na zero)

1

Popatrz na to inaczej. Czy gdyby graczy mogło być 1000 albo w ogóle jakieś nieustalone k to czy ten kod sensownie byłoby napisać tak jak teraz? Nie? Co można zmienić? Napisz ten kod jeszcze raz, tym razem dla k graczy i problem sam się rozwiąże, bo nagle pojawi ci sie zupełnie oddzielna logika obsługi ruchu jednego gracza.
Co więcej proponowałbym jednak zrobić klasę która przechowuje stan jednego gracza, bo teraz stanem nie jest już prosta zmienna określająca numer pola, ale także informacja czy wylosowano 1 i 4.

0
#include <iostream>
#include <vector>
using namespace std;

class Player {
public:
  int field;
  
  Player() 
  {
  	field = 0; // tutaj powinienes uzyc listy inicjalizacyjnej, ale ze pewnie nie miales klas uzylem prostszej konstrukcji
  }
};

int main()
{
	vector<Player> players;
	int numberOfPlayers = 0;
	cout << "Ile graczy bedzie uczestniczyc?\n";
	cin >> numberOfPlayers;
	
	for (int i = 0; i < numberOfPlayers; i++)
	{
		Player newPlayer;
		players.push_back(newPlayer);
	}
	
    int numberOfFields;   
    int diceRoll;    
    cout << "Podaj ilosc pol: ";
    cin >> numberOfFields;
    
    bool gameIsOn = true;
 
    while (gameIsOn) {
        cout << "Podaj wyniki rzutow: " << endl;
        
        for (auto player : players)
        {
        	cin >> diceRoll;
        	player.field += diceRoll;
        }
        
        for (auto player : players)
        {
        	cout << player.field << "_";
        }
        
        cout << '\n';
        
        
        for (auto player : players)
        {
        	cout << player.field << "_";
        }  
        
        for (auto player : players)
        {
        	if (player.field > numberOfFields)
        	{
        		cout << "THE END OF GAME\n";
        		gameIsOn = false;
        	}
        } 

    }
    return 0; 
	
}

pisane szybko na kolanie. Ulepszylem troszke Twoj kod zeby mozna bylo go rozwijac bez problemow
Teraz najszybszym (ale nie najlepszym) sposobem bedzie dodanie dwoch pol do klasy bool hadFourRolled = false; (analogicznie do jedynki) i przy dodawaniu do field sprawdzasz dwie rzeczy

if (player.hadFourRolled && player.hadOneRolled)
{
  //wtedy tutdaj dodajesz do field playera
}

Wczesniej, musisz jeszcze sprawdzic aktualny rzut

if (!player.hadFourRolled || !player.hadOneRolled)
{
  if (diceRoll == 4) 
  { 
    player.hadFourRolled = true;
  }
  if (diceRoll == 1)  // tutaj opcjonalnie if (diceRoll == 1 && player.hadFourRolled)
  { 
    player.hadOneRolled = true;
  }
}

To bylby najszybszy (ale nie najladniejszy) sposob jak to zrobic.

  1. Unikaj magic stringow (ja wyzej uzylem dla przykladu)
  2. DRY

jezeli chcesz by to zostalo zrobione ze najpierw 4 a pozniej 1 to musisz zmienic delikatnie warunek na ustawianie tych flag (nie mozesz ustawic jedynki gdy czworka nie jest ustawiona)

0
Shalom napisał(a):

Popatrz na to inaczej. Czy gdyby graczy mogło być 1000 albo w ogóle jakieś nieustalone k to czy ten kod sensownie byłoby napisać tak jak teraz? Nie? Co można zmienić? Napisz ten kod jeszcze raz, tym razem dla k graczy i problem sam się rozwiąże, bo nagle pojawi ci sie zupełnie oddzielna logika obsługi ruchu jednego gracza.
Co więcej proponowałbym jednak zrobić klasę która przechowuje stan jednego gracza, bo teraz stanem nie jest już prosta zmienna określająca numer pola, ale także informacja czy wylosowano 1 i 4.

Ma to być konkretnie dla 4 graczy. Nie da się tego zrobić bez tych klas?

1 użytkowników online, w tym zalogowanych: 0, gości: 1