Ustawienie figur w losowych szachach nie jest oczywistym użyciem polecenia rand();

W niżej zaproponowanym programie można znaleźć tablicę globalną i polskie nazwy ponieważ program przeznaczony był na potrzeby platformy Arduino (wymaga przeróbek cout) dla pewnego kółka szachowego (gdzie łatwiej było wytłumaczyć polskimi nazwami).

DevC++:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef uint8_t byte;

byte losowanie[8];

#define BIERKA_WIEZA 2
#define BIERKA_KON 3
#define BIERKA_GONIEC 4
#define BIERKA_DAMA 5
#define BIERKA_KROL 6

unsigned int random(unsigned int x)
{
        return rand()%x;
}


void wstawLosowanie(byte miejsce, byte figura)
{
  byte i=0, i_puste=0;
  do
  {
        if (i_puste==0 && miejsce==0 && losowanie[i]==0)
        { //jeśli na początek wstawia do pierwszego pustego pola
            losowanie[i] = figura;
            break; //jesli wstawia w pierwsze miejsce to koniec petli
        }
    else
    {//wstawia gdzieś dalej poza pierwszym zerem
        if (losowanie[i]==0)  i_puste++;
        i++;
        }
  }
   while ((i_puste!=miejsce || losowanie[i]!=0) && i<7);
  losowanie[i] = figura;
}

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void randomFisher()
//losowanie figur Fishera
{
 // randomSeed(analogRead(0));
  srand( time( NULL ) );
 
 
  for (byte i=0; i<8; i++)
     losowanie[i]=0;
     
  //Losuj pozycje goncow:
  byte goniecBialopolowy = (byte) (random(4)*2);
  byte goniecCzarnopolowy = (byte) (random(4)*2 + 1);
 
  //                    cout << "czarnopolowy = " << (int) goniecCzarnopolowy << ", bialopolowy = " << (int)goniecBialopolowy << endl;


  losowanie[goniecBialopolowy] = BIERKA_GONIEC;
  losowanie[goniecCzarnopolowy] = BIERKA_GONIEC;
  byte krol = (byte)(random(4) + 1); //jedno z czterech pozostalych pol oprocz skrajnych (bo tam wieze) +1 ominiecie pierwszego pola
                //      cout << "krol = " <<(int) krol << endl;
  //odlicza i_puste (puste pola) dopoki nie doliczy do "krol", jak doliczy sprawdza jeszcze
  // czy to pole nie jest czasem różne od 0 jeśli jest to leci o 1 dalej
 
  wstawLosowanie(krol, BIERKA_KROL); //wstaw na miejscu krol do tablicy BIERKE_KROLA
 
  byte lewaWieza = random(krol); //losuj po lewej stronie krola  random(0,krol) - bez krola
  wstawLosowanie(lewaWieza, BIERKA_WIEZA);
  byte prawaWieza = random(5-krol);
/* Prawa wieza:
 1 4 krol=1 (pola po lewej 1 po prawej 4 wolne)
2 3 krol 2
3 2 krol 3
4 1 krol 4

radom(krol)  prawa wieza
random(5-krol) lewa wieza*/

        //              cout << "lewa wieza=" <<(int) lewaWieza << ",prawa = "<<(int) prawaWieza<<  endl;

  wstawLosowanie(prawaWieza+(krol-1), BIERKA_WIEZA); //+krol-1 bo pola puste po lewej trzeba dodać
 
  byte dama = random(3);
  wstawLosowanie(dama, BIERKA_DAMA);
  wstawLosowanie(0, BIERKA_KON);
  wstawLosowanie(0, BIERKA_KON);
  for (uint8_t i=0; i<8; i++)
   cout << (int) losowanie[i];
 
}

int main(int argc, char** argv) {
       
        randomFisher();
       
        return 0;
}
C