1 #include <GL/glut.h>
2 #include <math.h>
3 #include <stdlib.h>
4 #include "Zeit.h"
5 #include "Namen.h"
6 #include "Kugel.h"
7 #include "Textfeld.h"
8 #include "Schild.h"
9 #include "Menu.h"
10 #include "SpielfeldAufbau.h"
11 
random(GLfloat Epsilon)12 GLfloat random(GLfloat Epsilon) {
13   return (Epsilon*(((rand()*2.0)/RAND_MAX)-1));
14 }
15 
SpielfeldAufbau()16 void SpielfeldAufbau() {
17   if (StateMaschin==BETRACHTEN||
18       StateMaschin==START||
19       StateMaschin==WEISSNEU||
20       StateMaschin==SCHIEDSRICHTER) {
21 
22     //Anfangsstoss=1;
23     //WeisseVersetzbar=1;
24 
25     LageVerbesserungKopffeld=1;
26 
27     GLfloat r=5.715;
28     GLfloat a=r+3*Epsilon;
29     GLfloat asw3=a*sqrt(3)/6;
30 
31     srand(Zeit());
32 
33     //Anzeige.AlleKugelnAusblenden();
34 
35     for (int i=0;i<16;i++) {
36       KugelnImSpiel[i]=0;
37       KugelnVersenkt[i]=0;
38     }
39 
40 
41     switch (Spiel) {        // Was f"ur ein Spiel?
42 
43     case 2: {               // Nur zwei Kugeln
44       Kugel[0].neuePositionCM(0.0,0.0);
45       Kugel[1].neuePositionCM(20.0,0.0);
46       for (int i=0;i<2;i++) {
47 	KugelnImSpiel[i]=1;
48       }
49       for (int j=2;j<16;j++) {
50 	Kugel[j].ausblenden();
51       }
52       break;
53     }
54 
55     case 8: {               // 8-Ball
56 
57       GLint plaziert[16];
58       GLint nummer[16];
59 
60       do {
61 	{
62 	  for (GLint i=0;i<16;i++) {
63 	    nummer[i]=0;
64 	    plaziert[i]=0;
65 	  }
66 	}
67 	nummer[0]=0;
68 	plaziert[0]=1;
69 	nummer[8]=8;
70 	plaziert[8]=1;
71 
72 	for (GLint pos=1; pos<16;pos++) {
73 	  while (!nummer[pos]) {
74 	    GLint kugel=(GLint) (rand()*16.0/RAND_MAX);
75 	    if (!plaziert[kugel]) {
76 	      nummer[pos]=kugel;
77 	      plaziert[kugel]=1;
78 	    }
79 	  }
80 	}
81       } while ((nummer[1]<8)&&(nummer[15]<8)||(nummer[1]>8)&&(nummer[15]>8));
82 
83       Kugel[nummer[0]].neuePositionCM(-63.5,0.0);
84       Kugel[nummer[1]].neuePositionCM(63.5+12*asw3+random(Epsilon),-2.0*a+random(Epsilon));
85       Kugel[nummer[2]].neuePositionCM(63.5+9*asw3+random(Epsilon),-1.5*a+random(Epsilon));
86       Kugel[nummer[3]].neuePositionCM(63.5+6*asw3+random(Epsilon),-1.0*a+random(Epsilon));
87       Kugel[nummer[4]].neuePositionCM(63.5+3*asw3+random(Epsilon),-0.5*a+random(Epsilon));
88       Kugel[nummer[5]].neuePositionCM(63.5+0*asw3+random(Epsilon),0.0+random(Epsilon));
89       Kugel[nummer[6]].neuePositionCM(63.5+12*asw3+random(Epsilon),-1.0*a+random(Epsilon));
90       Kugel[nummer[7]].neuePositionCM(63.5+9*asw3+random(Epsilon),-0.5*a+random(Epsilon));
91       Kugel[nummer[8]].neuePositionCM(63.5+6*asw3+random(Epsilon),0.0+random(Epsilon));
92       Kugel[nummer[9]].neuePositionCM(63.5+3*asw3+random(Epsilon),0.5*a+random(Epsilon));
93       Kugel[nummer[10]].neuePositionCM(63.5+12*asw3+random(Epsilon),0.0+random(Epsilon));
94       Kugel[nummer[11]].neuePositionCM(63.5+9*asw3+random(Epsilon),0.5*a+random(Epsilon));
95       Kugel[nummer[12]].neuePositionCM(63.5+6*asw3+random(Epsilon),1.0*a+random(Epsilon));
96       Kugel[nummer[13]].neuePositionCM(63.5+12*asw3+random(Epsilon),1.0*a+random(Epsilon));
97       Kugel[nummer[14]].neuePositionCM(63.5+9*asw3+random(Epsilon),1.5*a+random(Epsilon));
98       Kugel[nummer[15]].neuePositionCM(63.5+12*asw3+random(Epsilon),2.0*a+random(Epsilon));
99 
100       {
101 	for (int i=0;i<=15;i++) {
102 	  KugelnImSpiel[i]=1;
103 	}
104       }
105 
106       break;
107     }
108 
109     case 9: {               // 9-Ball
110 
111       GLint plaziert[10];
112       GLint nummer[10];
113 
114       {
115 	for (int i=0;i<10;i++) {
116 	  KugelnImSpiel[i]=1;
117 	  nummer[i]=0;
118 	  plaziert[i]=0;
119 	}
120       }
121       nummer[0]=0;
122       plaziert[0]=1;
123       nummer[3]=1;
124       plaziert[1]=1;
125       nummer[9]=9;
126       plaziert[9]=1;
127 
128       for (GLint pos=1; pos<10;pos++) {
129 	while (!nummer[pos]) {
130 	  GLint kugel=(GLint) (rand()*10.0/RAND_MAX);
131 	  if (!plaziert[kugel]) {
132 	    nummer[pos]=kugel;
133 	    plaziert[kugel]=1;
134 	  }
135 	}
136       }
137 
138       Kugel[nummer[0]].neuePositionCM(-63.5,0.0);
139       Kugel[nummer[1]].neuePositionCM(63.5+6*asw3+random(Epsilon),-1.0*a+random(Epsilon));
140       Kugel[nummer[2]].neuePositionCM(63.5+3*asw3+random(Epsilon),-0.5*a+random(Epsilon));
141       Kugel[nummer[3]].neuePositionCM(63.5+0*asw3+random(Epsilon),0.0+random(Epsilon));
142       Kugel[nummer[4]].neuePositionCM(63.5+3*asw3+random(Epsilon),0.5*a+random(Epsilon));
143       Kugel[nummer[5]].neuePositionCM(63.5+6*asw3+random(Epsilon),1.0*a+random(Epsilon));
144       Kugel[nummer[6]].neuePositionCM(63.5+9*asw3+random(Epsilon),0.5*a+random(Epsilon));
145       Kugel[nummer[7]].neuePositionCM(63.5+12*asw3+random(Epsilon),0.0+random(Epsilon));
146       Kugel[nummer[8]].neuePositionCM(63.5+9*asw3+random(Epsilon),-0.5*a+random(Epsilon));
147       Kugel[nummer[9]].neuePositionCM(63.5+6*asw3+random(Epsilon),0.0+random(Epsilon));
148 
149       {
150 	for (int i=10;i<16;i++) {
151 	  Kugel[i].ausblenden();
152 	}
153       }
154       break;
155     }
156 
157     case 7: {               // Zufalls-Belegung
158       {
159 	for (int i=0;i<=15;i++) {
160 	  KugelnImSpiel[i]=1;
161 	}
162       }
163       {
164 	for (int i=0;i<16;i++) {
165 	  GLfloat min,x,y;
166 	  do {
167 	    min=3000;
168 	    x=118*((((rand()+0.0)/RAND_MAX)*2)-1);
169 	    y= 59*((((rand()+0.0)/RAND_MAX)*2)-1);
170 	    for (int j=0;j<i;j++) {
171 	      GLfloat dx=x-Kugel[j].Pos_xCM();
172 	      GLfloat dy=y-Kugel[j].Pos_yCM();
173 	      GLfloat Abstand=sqrt(dx*dx+dy*dy);
174 	      if (Abstand<min) {min=Abstand;}
175 	    }
176 	  } while (min<7);
177 	  Kugel[i].neuePositionCM(x,y);
178 	}
179 	break;
180       }
181     }
182 
183     case 0: {               // Keine Kugeln
184       {
185 	for (int i=0;i<16;i++) {
186 	  Kugel[i].ausblenden();
187 	}
188       }
189       break;
190     }
191 
192     }
193   }
194 
195   Menu.NeuerMenuZustand();
196 
197 }
198