Subversion Repositories Kolibri OS

Rev

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