View difference between Paste ID: xqjLssPX and Ezs2dBJx
SHOW: | | - or go back to the newest paste.
1
; tries to evaluate the quality of a playfield , small numbers (variable c) mean few holes and a nice surface
2
; field is a 18 x 10 matrix, field[1,j] notes the bottom row, field[i,1] notes the left-most column
3
; field[i,j] = 0 -> empty cell in row i and column j , field[i,j] = 1 -> filled cell in row i and column j
4
penalty2( field )
5
{
6
	; surf is an array of length 10, a[i] represents the height of the i-th line, a[i]=0 means bottom
7
	; otherwise field(a[j],j) = 1 and field(a[j]+i,j) = 0 for every i > 0	
8
	surf := getSurface( field )
9
10
	; x1,y1 are the coordinates of the highest hole, x2,y2 are the coordinates of the second highest hole
11
	; hole = filled cell with empty cell below , holes corresponds to the number of holes
12
	holes := 0, x1 := 0, y1 := 0, x2:= 0, y2 := 0
13
	recalculate(field, surf, holes, x1, y1, x2, y2 ) 	
14
	;MsgBox % holes . " " . x1 . " " . y1 . " " . x2 . " " . y2
15
16
	return penalty( surf, holes, x1, y1, x2, y2 )	
17
}
18
19
20
; calculates the number of holes and the coordinates of the 2 highest holes
21
recalculate( field, surf, ByRef holes, ByRef x1, ByRef y1, ByRef x2, ByRef y2 )
22
{
23
	; hole = filled cell with empty cell below	
24
	
25
	;surf := getSurface( field )	
26
	;x1 := 0, y1 := 0 ; x,y coordinate of highest hole
27
	;x2 := 0, y2 := 0 ; x,y coordinate of second highest hole
28
	;holes := 0	
29
	
30
	j := 0
31
	while ( ++j <= 10 )
32
	{	
33
		i := 0
34
		while ( ++i < surf[j] )
35
		{
36
			if ( field[i,j] = 0 )
37
			{
38
				; hole found, count it as 2 if connected to a hole on the left and right, 3 if unconnected
39
				; add 0.5 if 2 fields deep, or deepness-1.5 if deeper
40
				connected := 0
41
				deepness := 0
42
				while ( field[i,j] = 0 )
43
				{
44
					deepness += 1				
45
					if ( j > 1 && i < surf[j-1] && field[i,j-1] = 0 )
46
							connected += 0.5 ; every connection is counted double, thus halve it
47
					if ( j < 10 && i < surf[j+1] && field[i,j+1] = 0 ) ; or else if?
48
						connected += 0.5
49
					i := i + 1	
50
				}
51
				holes += 3
52
				holes -= connected
53
				if ( deepness > 2 )
54
					holes += ( deepness - 1.5 )
55
				else if ( deepness = 2 )
56
					holes += 0.5			
57
				; highest 2 holes are stored in x1,y1 resp x2,y2
58
				if ( i > y1 )
59
				{
60
					x2 := x1, y2 := y1
61
					x1 := j, y1 := i
62
				}
63
				else if ( i > y2 )
64
				{
65
					x2 := j, y2 := i
66
				}
67
			}
68
		}
69
	}	
70
}
71
72
73
; a is an array which stands for the height of the surface in the corresponding column, columns are numbered from 1 to 10
74
penalty( a, holes, x1, y1, x2, y2 )
75
{
76
	;if ( holes - (holes * 10) // 10 != 0 )
77
	;{
78
	;	MsgBox % "#holes not integer: " . holes	. " " . x1 . " " . y1 . " " . x2 . " " . y2 . "`n" . ArrayToStr(a)
79
	;}
80
	
81
	c := 0 ; returned penalty	
82
	;MsgBox % "surface: " . arrayToStr(a) , q := 0
83
	
84
	; ###################### punish holes #######################
85
	; hole = filled cell with empty cell below
86
87
	; punish number of holes
88
	c += 4 * holes
89
	;MsgBox % c . " (+" . c-q . ") after counting holes"	, q := c
90
	
91
	; punish if highest hole is deeply covered
92
	if ( y2 > 0 )
93
	{
94
		if ( y1 > y2 )
95
			c += 3 * min(a[x1]-y1,3) + 1 * min( max(a[x2],a[x1])-y1 , 4 )
96
		else
97
			c += 2 * min(a[x1]-y1,3) + 2 * min(a[x2]-y2,3)
98
	}
99
	else if ( y1 > 0 )
100
	{
101
		c += 4 * min(a[x1]-y1,3)
102
	}
103
	;MsgBox % c . " (+" . c-q . ") after knowing how deep to dig"	, q := c
104
	
105
	; preperation: punish if surface near highest hole isn't flat
106
	c1 := 0
107
	if ( y1 > 0 )
108
	{
109
		if ( x1 = 1 )
110
		{
111
			d := ABS( a[x1+1] - a[x1] )
112
			if ( a[x1] > a[x1+1] )
113
				d -= 1
114
			if ( d > 1 )
115
				c1 := 6
116
			else if ( d = 1 )
117
				c1 := 2	
118
		}
119
		else if ( x1 = 10 )
120
		{
121
			d := ABS( a[x1-1] - a[x1] )
122
			if ( a[x1] > a[x1-1] )
123
				d -= 1
124
			if ( d > 1 )
125
				c1 := 6
126
			else if ( d = 1 )
127
				c1 := 2				
128
		}
129
		else
130
		{
131
			d1 := ABS( a[x1-1] - a[x1] )				
132
			d2 := ABS( a[x1+1] - a[x1] )
133
			if ( d1 < d2 )
134
			{
135
				; assure that d1 >= d2
136
				d := d1
137
				d1 := d2
138
				d2 := d				
139
			}
140
			if ( d2 > 1 )
141
				c1 := 6
142
			else if ( d1 > 1 && d2 = 1 )
143
				c1 := 4
144
			else if ( d1 > 1 && d2 = 0 )
145
				c1 := 2
146
			else if ( d2 = 1 )
147
			{
148
				if ( a[x1-1] < a[x1] && a[x1+1] < a[x1] )
149
					c2 := 3
150
				else
151
					c2 := 2
152
			}
153
			else if ( d1 = 1 )
154
				c1 := 1
155
		}	
156
	}
157
	c2 := 0
158
	if ( y2 > 0 )
159
	{
160
		; same code as above
161
		if ( x2 = 1 )
162
		{
163
			d := ABS( a[x2+1] - a[x2] )
164
			if ( d > 1 )
165
				c2 := 6
166
			else if ( d = 1 )
167
				c2 := 2	
168
		}
169
		else if ( x2 = 10 )
170
		{
171
			d := ABS( a[x2-1] - a[x2] )
172
			if ( d > 1 )
173
				c2 := 6
174
			else if ( d = 1 )
175
				c2 := 2				
176
		}
177
		
178
		else
179
		{
180
			d1 := ABS( a[x2-1] - a[x2] )				
181
			d2 := ABS( a[x2+1] - a[x2] )
182
			if ( d1 < d2 )
183
			{
184
				; assure that d1 >= d2
185
				d := d1
186
				d1 := d2
187
				d2 := d				
188
			}
189
			if ( d2 > 1 )
190
				c2 := 6
191
			else if ( d1 > 1 && d2 = 1 )
192
				c2 := 4
193
			else if ( d1 > 1 && d2 = 0 )
194
				c2 := 2
195
			else if ( d2 = 1 )
196
			{
197
				if ( a[x2-1] < a[x2] && a[x2+1] < a[x2] )
198
					c2 := 3
199
				else
200
					c2 := 2
201
			}
202
			else if ( d1 = 1 )
203
				c2 := 1
204
		}			
205
	}
206
	; execution: punish if surface near highest hole isn't flat		
207
	if ( y2 > 0 )
208
	{
209
		if ( y1 > y2 )
210
			c += 0.8 * c1 + 0.2 * c2
211
		else
212
			c += 0.5 * c1 + 0.5 * c2
213
	}
214
	else if ( y1 > 0 )
215
	{
216
		c += c1
217
	}	
218
		
219
	;MsgBox % c . " (+" . c-q . ") after checking surface near holes"	, q := c
220
	; ###################### evaluate surface #######################
221
222
	o := 0, s := 0, z := 0 ; number of spots for O, S, Z pieces
223
	
224
	min := 18, max := 0, sum := 0
225
	i:= 0
226
	while ( ++i <= 10 )
227
	{
228
		sum += a[i]
229
		if ( min > a[i] )
230
			min := a[i]
231
		if ( max < a[i] )
232
			max := a[i]		
233
	}
234
	c += 0.1 * sum ; too many filled cells penalty
235
	
236
	if ( max = 18 )
237
		c += 10
238
	else if ( max = 17 )
239
		c += 5  ; too high penalty
240
	
241
	if ( max - min > 7 )
242
		c += 0.1*( max - min - 7 )*( max - min - 6 ) ; too big global height difference penalty
243
	
244
	c += ( 1.5*a[4] + 1.5*a[5] + 1.5*a[6] + 1.5*a[7] - 2*a[1] - 2*a[10] - a[2] - a[9] ) / 10 ; hill in the middle penalty
245
	
246
	d := 0 ; number of wells
247
	if ( a[1] < a[2]+2 )	
248
		d += 1
249
	if ( a[9]+2 > a[10] )
250
		d += 1
251
	
252
	;if ( a[1] < a[2]+2 && a[9]+2 > a[10] )
253
	;	c += 3 ; 2 wells penalty
254
	;else if ( a[1] <= a[2]+2 && a[9]+2 >= a[10] )
255
	;	c += 1
256
	
257
	i := 0
258
	while ( ++i <= 8 )
259
	{
260
		if ( Abs( a[i+1] - a[i] ) > 2 && Abs( a[i+2] - a[i+1] ) > 2 )
261
		{
262
			if ( a[i] < a[i+1] && a[i+1] > a[i+2] )
263
				c += 2 ; obelisc penalty
264
			else if ( a[i] > a[i+1] && a[i+1] < a[i+2] )
265
			{
266
				c += 1 ; trench penalty
267
				d += 1				
268
			}
269
			else
270
				c += 1 ; cliff penalty
271
		}
272
	}
273
	
274
	if ( d = 1 )
275
		c += 2
276
	else if ( d = 2 )
277
		c += 5
278
	else if ( d > 2 )
279
		c += 5*d - 5 ; too many wells penalty
280
281
	i := 0
282
	while ( ++i <= 9 )
283
	{
284
		d := Abs( a[i+1] - a[i] )
285
		if ( d > 2 )
286
			c += d - 1 + (d-1)//2 ; local height difference penalty
287
		else if ( a[i+1] = a[i]-2 )
288
			c += 1
289
		else if ( a[i+1] = a[i]+2 )
290
			c += 1	
291
		else if ( a[i+1] = a[i]-1 )
292
			s += 1
293
		else if ( a[i+1] = a[i]+1 )
294
			z += 1
295
		else ; a[i] = a[i+1]
296
		{
297
			o += 1
298
			if ( i+2 <= 10 && a[i+2] = a[i]+1 )
299
				s += 1
300
			if ( i-1 >= 1 && a[i-1] = a[i]+1 )
301
				z += 1
302
		}			
303
	}
304
		
305
	if ( o = 0 )
306
		c += 5 ; no O spot penalty
307
	else if ( o = 1 )
308
		c += 2 ; just one O spot penalty
309
	else if ( o = 2 )
310
		c += 1 ; just two O spots penalty
311
	else if ( o = 3 )
312
		c += 0.5 ; just three O spots penalty
313
	if ( s = 0 )
314
		c += 4 ; no S spot penalty
315
	else if ( s = 1 )
316
		c += 1 ; just one S spot penalty		
317
	if ( z = 0 )
318
		c += 4 ; no Z spot penalty
319
	else if ( z = 1 )
320
		c += 1 ; just one Z spot penalty
321
322
	w := 0 ; number of white chess fields
323
	
324
	i := 0
325
	while ( ++i <= 10 )
326
	{
327
		w += Mod( i+a[i] , 2 )
328
	}
329
	if ( Abs( w - 5 ) >= 2 )
330
		c += 1 + 7 * ( Abs( w - 5 ) - 2 ) ; bad T placement penalty
331
	
332
	i := 0
333
	while ( ++i <= 6 )
334
	{
335
		w := 0
336
		w += Mod( i + a[i] , 2 )
337
		w += Mod( i+1 + a[i+1] , 2 )
338
		w += Mod( i+2 + a[i+2] , 2 )		
339
		w += Mod( i+3 + a[i+3] , 2 )		
340
		w += Mod( i+4 + a[i+4] , 2 )
341
		if ( w = 0 || w = 5 )
342
			c += 2 ; local imbalance penalty
343
		else if ( w = 1 || w = 4 )
344
			c += 1 
345
	}
346
	w := Mod( 1 + a[1] , 2 )
347
	w += Mod( 2 + a[2] , 2 )
348
	w += Mod( 3 + a[3] , 2 )
349
	w += Mod( 4 + a[4] , 2 )
350
	if ( w = 0 || w = 4 )
351
		c += 1 ; left side imbalance penalty
352
	w := Mod( 7 + a[7] , 2 )
353
	w += Mod( 8 + a[8] , 2 )
354
	w += Mod( 9 + a[9] , 2 )
355
	w += Mod( 10 + a[10] , 2 )
356
	if ( w = 0 || w = 4 )
357
		c += 1 ; right side imbalance penalty
358
359
	;aaMsgBox % c . " (+" . c-q . ") after parity"	, q := c
360
	return c
361
}