Subversion Repositories Kolibri OS

Rev

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