Subversion Repositories Kolibri OS

Rev

Rev 1824 | Rev 3950 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1805 yogev_ezra 1
;http://sources.ru/pascal/gamestxt/go-moku.zip
2
 
3
N equ 19		; Size of the board
4
 
5
use32
6
	org	0x0
7
	db	'MENUET01'
8
	dd	0x1
9
	dd	START
10
	dd	I_END
11
	dd	(I_END+200+13*N*N) and not 3
12
	dd	(I_END+200+13*N*N) and not 3
13
	dd	0x0,0x0
14
 
1824 yogev_ezra 15
include '../../../macros.inc'
1805 yogev_ezra 16
include 'lang.inc'
17
 
18
AttackFactor dw 1	; Importance of attack (1..16)
19
 
20
START:
21
 
22
	mcall	40,100111b
23
	mcall	40,100111b
24
	mcall	3
25
	mov	[rsx1],ax
26
	shr	eax,16
27
	mov	[rsx2],ax
28
 
29
redraw_all:
2071 dunkaist 30
	mcall	9,proc_info,-1
31
	test	[proc_info.wnd_state], 0x04		; is rolled_up?
32
	jz	@f
33
	mcall	0,100*65536+(16*N+12),,0x34FFFFFF,,title
34
	jmp	still
35
  @@:
1805 yogev_ezra 36
	mcall	12,1
37
	mcall	48,4
38
	xchg	eax,ecx
39
	add	ecx,100*65536+(16*N+26)
40
	mcall	0,100*65536+(16*N+12),,0x34FFFFFF,,title
41
	mcall	38,2*65536+(16*N),20*65536+20,0x00a0a0a0;000000
42
	mov	edi,N
43
  @@:	add	ecx,16*65536+16
44
	mcall
45
	dec	edi
46
	jnz	@b
47
	push	cx
48
	mov	ecx,20*65536
49
	pop	cx
50
	mcall	,1*65536+1
51
	mov	edi,N
52
  @@:	add	ebx,16*65536+16
53
	mcall
54
	dec	edi
55
	jnz	@b
56
 
57
	mcall	8,3*65536+40,3*65536+12,2,0xFFFFFF
58
	mcall	,50*65536+40,,3,
59
	mcall	4,7*65536+5,0x80000000,txt_buttons
60
	mcall	12,2
61
 
62
 
63
draw_pole:
64
;	mcall	48,4
65
;	xchg	eax,ecx
66
;	add	ecx,100*65536+(16*N+26)
67
;	mcall	0,100*65536+(16*N+12),,0x74FFFFFF,,title
68
 
69
	mov	esi,Board
70
	mov	edi,N*N-N
71
	mov	ebp,N
72
	mov	ebx,(1+5)*65536+(21+5-1)
73
	call	print_board
74
	bt	[flags],0
75
	jnc	@f
76
	mcall	4,100*65536+6,0x800000ff,txt_go
77
@@:	bt	[flags],3
78
	jnc	@f
79
	mcall	4,100*65536+6,0x800000ff,txt_tie
80
	jmp	still
81
@@:
82
	bt	[flags],2
83
	jnc	still
84
	ret
85
still:
86
	mcall	10
87
 
88
	dec	al
89
	jz	redraw_all
90
	dec	al
91
	jz	key
92
	dec	al
93
	jz	button
94
	sub	al,3
95
	jz	mouse
96
	jmp	still
97
 
98
key:
99
	mcall	2
100
	btr	[flags],2
101
	cmp	ah,97
102
	jne	@f
103
.auto:	bts	[flags],2
104
	jmp	mouse.auto
105
@@:	cmp	ah,110
106
	je	button.new_game
107
	jmp	still
108
 
109
button:
110
	mcall	17
111
	cmp	ah,1
112
	jne	@f
113
	mcall	-1
114
@@:	cmp	ah,2
115
	jne	key.auto
116
.new_game:
117
	mov	[TotalLines],2 * 2 * (N * (N - 4) + (N - 4) * (N - 4))
118
	mov	[WinningLine],0x0
119
	mov	[X],(N + 1)/2
120
	mov	[Y],(N + 1)/2
121
	mov	[flags],0
122
	mov	edi,Board
123
	mov	ecx,(13*N*N/4)+1
124
	xor	eax,eax
125
	cld
126
@@:	stosd
127
	loop	@b
128
	jmp	redraw_all
129
 
130
print_board:
131
	cmp	byte [esi],0	;яєёЄю
132
	je	.null
133
	cmp	byte [esi],1	;X
134
	je	.one
135
	cmp	byte [esi],2	;O
136
	je	.two
137
	bts	[flags],4
138
	cmp	byte [esi],3	;╒ т√шуЁры
139
	je	.one
140
	jmp	.two		;0 т√шуЁры
141
 
142
.end:
143
	inc	esi
144
	dec	ebp
145
	jnz	print_board
146
	test	edi,edi
147
	jz	@f
148
	sub	edi,N
149
	mov	ebp,N
150
	add	ebx,-N*16*65536+16
151
	jmp	print_board
152
@@:	ret
153
 
154
.one:
155
	mov	ecx,0xd04ba010
156
	bt	[flags],4
157
	jnc	@f
158
	mov	ecx,0xd0ff0000
159
	btr	[flags],4
160
@@:	push	edi
161
	mcall	4,,,txt_x,,0xffffff
162
	pop	edi
163
.null:
164
	add	ebx,16*65536;+16
165
	jmp	.end
166
.two:
167
	mov	ecx,0xd000459a
168
	bt	[flags],4
169
	jnc	@f
170
	mov	ecx,0xd0ff0000
171
	btr	[flags],4
172
@@:	push	edi
173
	mcall	4,,,txt_o,,0xffffff
174
	pop	edi
175
	jmp	.null
176
 
177
 
178
draw_one_symbol:
179
	movzx	eax,[X]
180
	mov	ebx,16
181
	mul	ebx
182
	shl	eax,16
183
	add	eax,(1+5)*65536;
184
	mov	ax,[Y]
185
	mov	ecx,16
186
	mul	cx
187
	add	ax,(21+5-1)
188
	xchg	eax,ebx
189
 
190
	movzx	eax,[Y]
191
	push	ebx
192
	mov	ebx,N
193
	mul	bx
194
	mov	bx,[X]
195
	add	ax,bx
196
	pop	ebx
197
	mov	esi,Board
198
	add	esi,eax
199
	mov	edi,0
200
	mov	ebp,1
201
	call	print_board
202
ret
203
 
204
 
205
mouse:
206
	bt	[flags],5
207
	jc	still
208
	mcall	37,2
209
	test	eax,eax
210
	jz	still
211
	mcall	37,1
212
	mov	dx,ax
213
	shr	eax,16
214
	cmp	dx,20
215
	jbe	still
216
	cmp	dx,(16*N+20)
217
	jge	still
218
	cmp	ax,1
219
	jbe	still
220
	cmp	ax,(16*N)
221
	jge	still
222
 
223
	bt	[flags],0
224
	jc	still
225
	bt	[flags],3
226
	jc	still
227
	sub	ax,1
228
	push	dx
229
	xor	edx,edx
230
	mov	cx,16
231
	div	cx
232
	pop	dx
233
	mov	[X],ax
234
	push	ax
235
	sub	dx,20
236
	mov	ax,dx
237
	xor	dx,dx
238
	div	cx
239
	mov	[Y],ax
240
	xor	dx,dx
241
	mov	cx,N
242
	mul	cx
243
	pop	dx
244
	add	ax,dx
245
	cmp	ax,N*N
246
	jge	still
247
	mov	esi,Board
248
 
249
	cmp	byte [esi+eax],0
250
	jne	still
251
 
252
.auto:	bt	[flags],0
253
	jc	.end
254
	bt	[flags],3
255
	jc	.end
256
 
257
	btr	[flags],1	;0 - ход делает игрок
258
	bt	[flags],2
259
	jnc	@f
260
	call	FindMove
261
@@:	call	MakeMove
262
	call	draw_one_symbol
263
	bt	[flags],0
264
	jc	.end
265
 
266
	bts	[flags],1	;1 - ход делает cpu
267
	call	FindMove
268
	call	MakeMove
269
	call	draw_one_symbol
270
.end:	bt	[flags],0
271
	jnc	@f
272
	call	BlinkRow
273
	btr	[flags],2
274
@@:;	mcall	12,1
275
	bt	[flags],3
276
	jc	@f
277
	bt	[flags],2
278
	jnc	@f
279
	call	draw_pole
280
	jmp	.auto
281
@@:	jmp	draw_pole
282
 
283
 
284
 
285
 
286
winline: dw 1,0, 1,1, 1,-1, 0,1  ;X,Y
287
BlinkRow:
288
	movzx	ecx,[WinningLine]
289
	mov	eax,[winline+(ecx-1)*4]
290
	push	ax	;Dx
291
	shr	eax,16
292
	push	ax	;Dy
293
	movzx	eax,[Y]
294
	mov	si,N
295
	mul	si
296
	add	ax,[X]
297
	mov	cl,[Board+eax]
298
@@:	movzx	eax,[Y]
299
	add	ax,[esp]
300
	mov	[Y],ax
301
	test	eax,eax
302
	jz	.ret
303
	cmp	eax,N-1
304
	jg	.ret
305
	movzx	ebx,[X]
306
	add	bx,[esp+2]
307
	mov	[X],bx
308
	test	ebx,ebx
309
	jz	.ret
310
	cmp	ebx,N-1
311
	jg	.ret
312
	mov	si,N
313
	mul	si
314
	add	ax,bx
315
	cmp	byte [Board+eax],cl
316
	je	@b
317
 
318
.ret:	mov	edi,5
319
	mov	esi,N
320
@@:	movzx	eax,[Y]
321
	sub	ax,[esp]
322
	mov	[Y],ax
323
	mul	si
324
	movzx	ebx,[X]
325
	sub	bx,[esp+2]
326
	mov	[X],bx
327
	add	ax,bx
328
	cmp	byte [Board+eax],cl
329
	jne	.1
330
	add	byte [Board+eax],2
331
.1:	dec	edi
332
	jnz	@b
333
	add	esp,4
334
ret
335
 
336
 
337
 
338
Max dw ?
339
 
340
FindMove:
341
	mov	[Max],0
342
	mov	[X],((N+1) / 2)
343
	mov	[Y],((N+1) / 2)
344
	movzx	eax,[Y]
345
	mov	ah,N
346
	mul	ah
347
	add	ax,[X]
348
	cmp	byte [Board+eax],0
349
	jne	@f
350
	mov	[Max],4
351
@@:	xor	ecx,ecx
352
.loop:
353
	cmp	byte [Board+ecx],0
354
	jne	.check_loop
355
		movzx	eax, word [Value+ecx*2]
356
		bt	[flags],1
357
		jc	@f
358
		movzx	eax, word [Value+(N*N+ecx)*2]
359
		@@:
360
		mov	ebx,16
361
		add	bx,[AttackFactor]
362
		mul	bx
363
		shr	eax,4 ;div 16
364
		mov	bx,[Value+2*(N*N+ecx)]
365
		bt	[flags],1
366
		jc	@f
367
		mov	bx,[Value+2*(ecx)]
368
		@@:
369
		add	bx,ax
370
		mov	eax,4
371
		call	random
372
		add	bx,ax
373
		cmp	bx,[Max]
374
		jbe	.check_loop
375
			mov	[Max],bx
376
			xor	edx,edx
377
			mov	eax,ecx
378
			mov	ebx,N
379
			div	ebx
380
			mov	[X],dx
381
			mov	[Y],ax
382
.check_loop:
383
	inc	ecx
384
	cmp	ecx,N*N
385
	jb	.loop
386
ret
387
 
388
 
389
MakeMove:
390
	xor	eax,eax
391
	mov	esi,N
392
 
393
.1:	movzx	ecx,[X] ;ecx=X1, eax=K, edx=Y1
394
	inc	cl
395
	movzx	edx,[Y]
396
	inc	dl
397
	sub	cl,al
398
	xor	edi,edi
399
	test	ecx,ecx
400
	jz	.1_
401
	cmp	ecx,N-4
402
	jg	.1_
403
		dec	cl
404
		dec	dl
405
		push	eax edx
406
		mov	eax,edx
407
		mul	esi
408
		add	eax,ecx
409
		call	.Add
410
		bt	[flags],0
411
		jnc	.11
412
		cmp	[WinningLine],0x0
413
		jne	.11
414
		mov	[WinningLine],1
415
	.11:	mov	eax,[esp];edx
416
		mul	esi
417
		add	eax,ecx
418
		push	eax
419
		mov	eax,[esp+4];edx
420
		mul	esi
421
		add	eax,edi
422
		add	eax,ecx
423
		mov	ebx,eax
424
		pop	eax
425
		call	.Update
426
		inc	edi
427
		cmp	edi,4
428
		jbe	.11
429
		pop	edx eax
430
.1_:	inc	eax
431
	cmp	eax,4
432
	jbe	.1
433
 
434
	xor	eax,eax
435
 
436
.2:	movzx	ecx,[X]
437
	inc	cl
438
	movzx	edx,[Y]
439
	inc	dl
440
	xor	edi,edi
441
	sub	cl,al
442
	sub	dl,al
443
	test	ecx,ecx
444
	jz	.2_
445
	cmp	ecx,N-4
446
	jg	.2_
447
	test	edx,edx
448
	jz	.2_
449
	cmp	edx,N-4
450
	jg	.2_
451
		dec	cl
452
		dec	dl
453
		push	eax edx
454
		mov	eax,edx
455
		mul	esi
456
		add	eax,ecx
457
		add	eax,1*N*N
458
		call	.Add
459
		bt	[flags],0
460
		jnc	.21
461
		cmp	[WinningLine],0x0
462
		jne	.21
463
		mov	[WinningLine],2
464
	.21:	mov	eax,[esp];edx
465
		mul	esi
466
		add	eax,ecx
467
		add	eax,1*N*N
468
		push	eax
469
		mov	eax,[esp+4];edx
470
		add	eax,edi
471
		mul	esi
472
		add	eax,edi
473
		add	eax,ecx
474
		mov	ebx,eax
475
		pop	eax
476
		call	.Update
477
		inc	edi
478
		cmp	edi,4
479
		jbe	.21
480
		pop	edx eax
481
.2_:	inc	eax
482
	cmp	eax,4
483
	jbe	.2
484
 
485
	xor	eax,eax
486
 
487
.3:	movzx	ecx,[X]
488
	inc	cl
489
	movzx	edx,[Y]
490
	inc	dl
491
	xor	edi,edi
492
	add	cl,al
493
	sub	dl,al
494
	cmp	ecx,5
495
	jb	.3_
496
	cmp	ecx,N
497
	jg	.3_
498
	test	edx,edx
499
	jz	.3_
500
	cmp	edx,N-4
501
	jg	.3_
502
		dec	cl
503
		dec	dl
504
		push	eax edx
505
		mov	eax,edx
506
		mul	esi
507
		add	eax,ecx
508
		add	eax,3*N*N
509
		call	.Add
510
		bt	[flags],0
511
		jnc	.31
512
		cmp	[WinningLine],0
513
		jne	.31
514
		mov	[WinningLine],3
515
	.31:	mov	eax,[esp];edx
516
		mul	esi
517
		add	eax,ecx
518
		add	eax,3*N*N
519
		push	eax
520
		mov	eax,[esp+4];edx
521
		add	eax,edi
522
		mul	esi
523
		add	eax,ecx
524
		sub	eax,edi
525
		mov	ebx,eax
526
		pop	eax
527
		call	.Update
528
		inc	edi
529
		cmp	edi,4
530
		jbe	.31
531
		pop	edx eax
532
.3_:	inc	eax
533
	cmp	eax,4
534
	jbe	.3
535
 
536
	xor	eax,eax
537
 
538
.4:	movzx	ecx,[X]
539
	inc	cl
540
	movzx	edx,[Y]
541
	inc	dl
542
	xor	edi,edi
543
	sub	dl,al
544
	test	edx,edx
545
	jz	.4_
546
	cmp	edx,N-4
547
	jg	.4_
548
		dec	cl
549
		dec	dl
550
		push	eax edx
551
		mov	eax,edx
552
		mul	esi
553
		add	eax,ecx
554
		add	eax,2*N*N
555
		call	.Add
556
		bt	[flags],0
557
		jnc	.41
558
		cmp	[WinningLine],0
559
		jne	.41
560
		mov	[WinningLine],4
561
	.41:	mov	eax,[esp];edx
562
		mul	esi
563
		add	eax,ecx
564
		add	eax,2*N*N
565
		push	eax
566
		mov	eax,[esp+4];edx
567
		add	eax,edi
568
		mul	esi
569
		add	eax,ecx
570
		mov	ebx,eax
571
		pop	eax
572
		call	.Update
573
		inc	edi
574
		cmp	edi,4
575
		jbe	.41
576
		pop	edx eax
577
.4_:	inc	eax
578
	cmp	eax,4
579
	jbe	.4
580
 
581
	movzx	eax,[Y]
582
	mul	esi
583
	add	ax,[X]
584
	bt	[flags],1
585
	jc	@f
586
	mov	byte [Board+eax],1
587
	jmp	.end
588
@@:
589
	mov	byte [Board+eax],2
590
.end:	cmp	[TotalLines],0
591
	jne	@f
592
	bts	[flags],3
593
@@:
594
ret
595
 
596
.Add:
597
	bt	[flags],1
598
	jnc	.Add_player
599
	inc	byte [Line+eax]
600
	cmp	byte [Line+eax],1
601
	jne	@f
602
		dec	[TotalLines]
603
@@:	cmp	byte [Line+eax],5
604
	jb	@f
605
	bts	[flags],0	;игра окончена
606
@@:
607
ret
608
.Add_player:
609
	inc	byte [Line+eax+4*N*N]
610
	cmp	byte [Line+eax+4*N*N],1
611
	jne	@f
612
		dec	[TotalLines]
613
@@:	cmp	byte [Line+eax+4*N*N],5
614
	jb	@f
615
	bts	[flags],0	;игра окончена
616
@@:
617
ret
618
 
619
.Update:
620
;eax первый параметр, ebx второй
621
	push	edi
622
	bt	[flags],1
623
	jnc	.Update_player
624
	cmp	byte [Line+eax+4*N*N],0
625
	jne	.else_cpu
626
		push	eax
627
		movzx	edi, byte [Line+eax]
628
		mov	ax, word [edi*2+2+Weight]
629
		sub	ax, word [edi*2+Weight]
630
		add	[Value+ebx*2],ax
631
		pop	eax
632
	jmp	.Update_end
633
	.else_cpu:
634
	cmp	byte [Line+eax],1
635
	jne	.Update_end
636
		push	eax
637
		movzx	edi, byte [Line+eax+4*N*N]
638
		mov	ax, word [edi*2+2+Weight]
639
		sub	[Value+ebx*2+N*N*2],ax
640
		pop	eax
641
	jmp	.Update_end
642
.Update_player:
643
	cmp	byte [Line+eax],0
644
	jne	.else_player
645
		push	eax
646
		movzx	edi, byte [Line+eax+4*N*N]
647
		mov	ax, word [edi*2+2+Weight]
648
		mov	di, word [edi*2+Weight]
649
		sub	ax,di
650
		add	[Value+ebx*2+2*N*N],ax
651
		pop	eax
652
	jmp	.Update_end
653
	.else_player:
654
	cmp	byte [Line+eax+4*N*N],1
655
	jne	.Update_end
656
		push	eax
657
		movzx	edi, byte [Line+eax]
658
		mov	ax, word [edi*2+2+Weight]
659
		sub	[Value+ebx*2],ax
660
		pop	eax
661
.Update_end:
662
	pop	edi
663
ret
664
 
665
 
666
align 4
667
rsx1 dw ?;0x4321
668
rsx2 dw ?;0x1234
669
random: 	; из ASCL
670
	push ecx ebx edi edx
671
	mov cx,ax
672
	mov ax,[rsx1]
673
	mov bx,[rsx2]
674
	mov si,ax
675
	mov di,bx
676
	mov dl,ah
677
	mov ah,al
678
	mov al,bh
679
	mov bh,bl
680
	xor bl,bl
681
	rcr dl,1
682
	rcr ax,1
683
	rcr bx,1
684
	add bx,di
685
	adc ax,si
686
	add bx,0x62e9
687
	adc ax,0x3619
688
	mov [rsx1],bx
689
	mov [rsx2],ax
690
	xor dx,dx
691
	cmp ax,0
692
	je nodiv
693
	cmp cx,0
694
	je nodiv
695
	div cx
696
nodiv:
697
	mov ax,dx
698
	pop edx edi ebx ecx
699
	and eax,0000ffffh
700
ret
701
 
702
 
703
 
704
txt_x db 'X',0
705
txt_o db 'O',0
706
if lang eq ru
707
title db 'Гомоку',0
708
txt_buttons db 'Новая   Авто',0
709
txt_go db 'Игра окончена',0
710
txt_tie db 'Нет ходов',0
711
else
712
title db 'Gomoku',0
713
txt_go db 'Game over',0
714
txt_tie db 'Tie game',0
715
txt_buttons db 'New     Auto',0
716
endf
717
 
718
 
719
Weight dw 0,0,4,20,100,500,0
720
 
721
 
722
WinningLine db 0
723
TotalLines dw 0
724
 
725
X dw 0
726
Y dw 0
727
 
728
flags rw 1
729
;бит 0: игра окончена
730
;1: 0-ход игрока, 1-цпу
731
;2: autoplay
732
;3: ходы исчерпаны
733
;4: в print_board - выделение красным цветом 5-ти в ряд клеток
734
 
2071 dunkaist 735
proc_info process_information	; it should be after I_END, but i'm afraid of lines 11-12. dunkaist
1805 yogev_ezra 736
I_END:
737
align 16
738
Board	rb N*N
739
Value	rw N*N*2	;первая половина - для компа, вторая - для игрока
740
Line	rb 4*N*N*2
741