三目並べ2題


21.三目並べ
100 rem 971207,9,10 sanmoku 990518,990606
110 rem a is original, b is for work
120 dim a(5,5),b(5,5),kei(10),jun(30)
130 randomize timer
140 rem 0 -> +, 1 -> 0 -> -> p1 -> Black, 10 -> 8 ->p2 -> White
150 n = 1 : p1 = 1 : pp1 = 3 : p2 = 10 : pp2 = 30
160 gosub 660 : rem display 
170 rem
180 gosub 590 : rem dainyu a -> b
190 input "auto(1) or CMP vs MAN(2) ";am
200 rem
210 if (n mod 2) = 1 then p = p1 : pp = pp1 : rem Black
220 if (n mod 2) = 0 then p = p2 : pp = pp2 : rem White
230 gosub 370 : rem te
240 jun(n) = k*10+l
250 a(k,l) = localp
260 gosub 660 : rem display
270 n = n+1
280 if kachi = 0 and owari = 1 then goto 200
290 if kachi = 0 and owari = 0 then print " Draw." : goto 330
300 if p = p1 then print " Black won."
310 if p = p2 then print " White won."
320 print
330 for i = 1 to n-1
340   print "n=";i,jun(i)
350 next i
360 end
370 rem te
380 print "n=";n
390 if am = 1 then gosub 780 : goto 420
400 if (n mod 2) = 1 then input " Black's Tate, Yoko(1 - 3)  ";k,l :  else gosub 780
410 rem uteruka?
420 localp = p : localpp = pp
430   if b(k,l) <> 0 then print "again" : goto 390
440   b(k,l) = localp
450   gosub 470 : rem Kachi-Make keisan 
460 return
470 rem Kachi-Make keisan
480 kachi = 0
490 for i = 1 to 3
500   kei(i) = b(i,1)+b(i,2)+b(i,3)
510   kei(i+3) = b(1,i)+b(2,i)+b(3,i)
520  next i
530 kei(7) = b(1,1)+b(2,2)+b(3,3)
540 kei(8) = b(3,1)+b(2,2)+b(1,3)
550 for i = 1 to 8
560   if kei(i) = localpp then kachi = 1
570 next i
580 return
590 rem dainyu a -> b
600 for i = 1 to 3
610   for j = 1 to 3
620     b(i,j) = a(i,j)
630   next j
640 next i
650 return
660 rem display
670 owari = 0
680 for i = 1 to 3
690   for j = 1 to 3
695 print "  ";
700     if a(j,i) = 0 then owari = 1 : print "+";
710     if a(j,i) = 1 then print "B";
720     if a(j,i) = 10 then print "W";
730   next j
740 print
750 next i
760 print
770 return
780 rem pasocon te
790 nte = 0
800 rem i
810 k = int(rnd(3))+1
820 l = int(rnd(3))+1
830 if b(k,l) <> 0 then 800
840 localp = p : localpp = pp
850 b(k,l) = localp
860   gosub 470 : rem Kachi-Make keisan 
870 nte = nte+1
880 if kachi = 0 and nte < 13 then b(k,l) = 0 : goto 800
890 b(k,l) = 0
900 if kachi = 0 then gosub 940
910 if p = p2 then print "White Tate, Yoko",k,l
920 if p = p1 then print "Black Tate, Yoko",k,l
930 return
940 rem pasocon make no te
950 nmakete = 0
960 if p = p1 then p = p2 : pp = pp2 :  else p = p1 : pp = pp1
970 rem i
980 k = int(rnd(3))+1
990 l = int(rnd(3))+1
1000 if b(k,l) <> 0 then 970
1010 localp = p : localpp = pp
1020 b(k,l) = localp
1030   gosub 470 : rem Kachi-Make keisan 
1040 nmakete = nmakete+1
1050 if kachi = 0 and nmakete < 15 then b(k,l) = 0 : goto 970
1060 b(k,l) = 0
1070 if p = p2 then p = p1 : pp = pp1 :  else p = p2 : pp = pp2
1080 return

解説)
昔懐かしい三目並べプログラムです。
子供用に作りましたので強くありません。言うなれば1手だけ先を読みます。つまり、
次の手で自分が勝つか、あるいは負けるかだけを判断しています。絶対手だけを見て
いるわけです。ただ、その絶対手も乱数で対応していますので、打たないこともあり
ます。(そうしないと子供がやらなくなるので。)
手は、1,3(リターン)のように入れて下さい。
それと、言い訳させていただきますと、余分なことをやっているなと思えるところも
あるかと思いますが、将来の拡張を考えての事ですので勘弁して下さい。

22.三目半並べ
100 rem 971207,9,10 sanmoku 990518,990606
110 rem a is original, b is for work
120 dim a(5,5),b(5,5),kei(10),junk(50),junl(50)
130 randomize timer
140 rem 0 -> +, 1 -> 0 -> -> p1 -> Black, 10 -> 8 ->p2 -> White
150 n = 1 : p1 = 1 : pp1 = 3 : p2 = 10 : pp2 = 30
160 gosub 660 : rem display 
170 rem
180 gosub 590 : rem dainyu a -> b
190 input "auto(1) or CMP vs MAN(2) ";am
200 rem
205 if n > 7 then a(junk(n-7),junl(n-7)) = 0 : b(junk(n-7),junl(n-7)) = 0
208 if n > 7 then gosub 660 : rem display
210 if (n mod 2) = 1 then p = p1 : pp = pp1 : rem Black
220 if (n mod 2) = 0 then p = p2 : pp = pp2 : rem White
230 gosub 370 : rem te
240 junk(n) = k : junl(n) = l
250 a(k,l) = localp
260 gosub 660 : rem display
270 n = n+1
280 if kachi = 0 and owari = 1 then goto 200
290 if kachi = 0 and owari = 0 then print " Draw." : goto 330
300 if p = p1 then print " Black won."
310 if p = p2 then print " White won."
320 print
330 for i = 1 to n-1
340   print "n=";i,junk(i);"  ";junl(i)
350 next i
360 end
370 rem te
380 print "n=";n
390 if am = 1 then gosub 780 : goto 420
400 if (n mod 2) = 1 then input " Black's Tate, Yoko(1 - 3)  ";k,l :  else gosub 780
410 rem uteruka?
420 localp = p : localpp = pp
430   if b(k,l) <> 0 then print "again" : goto 390
440   b(k,l) = localp
450   gosub 470 : rem Kachi-Make keisan 
460 return
470 rem Kachi-Make keisan
480 kachi = 0
490 for i = 1 to 3
500   kei(i) = b(i,1)+b(i,2)+b(i,3)
510   kei(i+3) = b(1,i)+b(2,i)+b(3,i)
520  next i
530 kei(7) = b(1,1)+b(2,2)+b(3,3)
540 kei(8) = b(3,1)+b(2,2)+b(1,3)
550 for i = 1 to 8
560   if kei(i) = localpp then kachi = 1
570 next i
580 return
590 rem dainyu a -> b
600 for i = 1 to 3
610   for j = 1 to 3
620     b(i,j) = a(i,j)
630   next j
640 next i
650 return
660 rem display
670 owari = 0
680 for i = 1 to 3
690   for j = 1 to 3
695 print "  ";
700     if a(j,i) = 0 then owari = 1 : print "+";
710     if a(j,i) = 1 then print "B";
720     if a(j,i) = 10 then print "W";
730   next j
740 print
750 next i
760 print
770 return
780 rem pasocon te
790 nte = 0
800 rem i
810 k = int(rnd(3))+1
820 l = int(rnd(3))+1
830 if b(k,l) <> 0 then 800
840 localp = p : localpp = pp
850 b(k,l) = localp
860   gosub 470 : rem Kachi-Make keisan 
870 nte = nte+1
880 if kachi = 0 and nte < 13 then b(k,l) = 0 : goto 800
890 b(k,l) = 0
900 if kachi = 0 then gosub 940
910 if p = p2 then print "White Tate, Yoko",k,l
920 if p = p1 then print "Black Tate, Yoko",k,l
930 return
940 rem pasocon make no te
950 nmakete = 0
960 if p = p1 then p = p2 : pp = pp2 :  else p = p1 : pp = pp1
970 rem i
980 k = int(rnd(3))+1
990 l = int(rnd(3))+1
1000 if b(k,l) <> 0 then 970
1010 localp = p : localpp = pp
1020 b(k,l) = localp
1030   gosub 470 : rem Kachi-Make keisan 
1040 nmakete = nmakete+1
1050 if kachi = 0 and nmakete < 15 then b(k,l) = 0 : goto 970
1060 b(k,l) = 0
1070 if p = p2 then p = p1 : pp = pp1 :  else p = p2 : pp = pp2
1080 return

解説)
前のゲームを少し変えたものです。常に盤面の石が六個しかないようにしてあり
ます。つまり、7個目を打ったら、以前の手が消えます。強さは前のゲームと一
緒のはずですが、人間にはけっこうしんどいことになりますので、ただの三目並
べよりはかなり楽しめます。前のプログラムと行番号は変えてありませんので、
変えたところがすぐ分かるようになっています。


戻る