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