易码技术论坛

 找回密码
 加入易码
搜索
查看: 781113|回复: 21

[原创]AI游戏事例极限井字棋代码分析!

[复制链接]
发表于 2004-8-29 14:05:00 | 显示全部楼层
    应该说井字棋大家见多了,就是在9个格子中%#·¥%—~~不用在下说了,但是这样一次性结束实在不爽,大多数都是平局结束的,在下在初二的时候跟一位同学在上课的时候用纸团当作棋子,这样就可以自由移动了,每人3个棋子,竟然把这个游戏推向了极限,当然这种方法可能早就有人想到了,确实,这样的话就只有赢跟输,而不存在和局,最理想的就是存在这一种死棋,很好玩的,简单但是不会低能哦~~
    现在在下将方式总结了一下,实现人机对战,电脑智能基本上推到了极限,除非死棋,否则不会输掉~~
    只是个事例,没有去美化,棋盘左右都是空白区,其实那是分数榜样,准备采取积分制的,不过时间不允许所以特此贴出代码,有兴趣的朋友可以¥¥#……
    在下用WINIDE FOR CC800写的,爱好LAVA的朋友可以把轻松它移植~~
    很多注释得不是很清楚,大家可以以问答的方式来解决一些问题~~
    下楼已经整理成可以直接编译的工程了,可以下载去编译一下!
 楼主| 发表于 2004-8-29 14:15:00 | 显示全部楼层
完整代码:[attachment:9]
发表于 2004-8-29 14:19:00 | 显示全部楼层
嗯!好东西啊~来顶!可惜我目前没有CC800!~但还是死顶!!!!!
 楼主| 发表于 2004-8-29 16:14:00 | 显示全部楼层
在每方赢了之后加上下面代码:
  getchar();
  exit();
发表于 2004-8-29 16:59:00 | 显示全部楼层
Linux的开源精神~
大力提倡+支持!
我带头送一朵鲜花给你 :)
发表于 2004-8-29 18:36:00 | 显示全部楼层
我也送~~~
 楼主| 发表于 2004-8-30 23:19:00 | 显示全部楼层
谢谢鲜花,在下最喜欢鲜花了[em02]

在下自己玩到现在只赢过两局~~晕~~~下面是加了随机代码的,这样就不会出现多次出现同样的局面了,而且降低了难度~~
[attachment:45]

46_431_45.rar

8 KB, 下载次数: 307

发表于 2004-9-2 23:06:00 | 显示全部楼层
新来的,
第一贴就顶你了!
[em03]
发表于 2004-9-5 14:27:00 | 显示全部楼层
我来打击一下:
只要走法得当,先走的一定会赢!情况如下:
第一种情况:
┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓
┃   ┃ ┃□  ┃ ┃□ ■┃ ┃□ ■┃ ┃□ ■┃ ┃□ ■┃ ┃□■■┃
┃ ■ ┃→┃ ■ ┃→┃ ■ ┃→┃ ■ ┃→┃■■ ┃→┃■■□┃→┃■ □┃
┃   ┃ ┃   ┃ ┃   ┃ ┃□  ┃ ┃□  ┃ ┃□  ┃ ┃□  ┃
┗━━━┛ ┗━━━┛ ┗━━━┛ ┗━━━┛ ┗━━━┛ ┗━━━┛ ┗━━━┛
 ┏━━━┓ ┏━━━┓
 ┃ ■■┃ ┃■■■┃
→┃■ □┃→┃■ □┃
 ┃□ □┃ ┃□ □┃
 ┗━━━┛ ┗━━━┛
第二种情况:
┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓ ┏━━━┓
┃   ┃ ┃ □ ┃ ┃ □ ┃ ┃■□ ┃ ┃■□ ┃ ┃■□■┃ ┃■ ■┃
┃ ■ ┃→┃ ■ ┃→┃ ■■┃→┃□■■┃→┃□■■┃→┃□ ■┃→┃□ ■┃
┃   ┃ ┃   ┃ ┃   ┃ ┃   ┃ ┃  □┃ ┃  □┃ ┃□ □┃
┗━━━┛ ┗━━━┛ ┗━━━┛ ┗━━━┛ ┗━━━┛ ┗━━━┛ ┗━━━┛
 ┏━━━┓
 ┃■■■┃
→┃□ ■┃
 ┃□ □┃
 ┗━━━┛

以上是我在这个帖子上说的:
http://www.tgclc.com/BBS/dispbbs.asp?boardID=5&ID=279&star=2&page=2
可以去看看这个井字棋的规则是否和你编的一样?
 楼主| 发表于 2004-9-5 20:41:00 | 显示全部楼层
呵呵,确实有去研究,感谢您的反馈~~
但是,这些都在没有加随机代码之前是已经预料到的,不仅仅这样,而且当您用同样的方法下子的时候,电脑会走同样的,所以这样就会出现许多同样的局面~~
但是之后在下加了随机代码,让电脑随机,所以就解决了这个问题!
神秘客 朋友!在下虽然加了随机,但是电脑的中间格的优先被在下合并到边缘判断了,因为在下赢不了,所以用这样降低难度,您可以试一试把中间格的优先重新加上去然后试玩一玩,一天能赢10局,在下请吃饭哦(呵呵,说笑啦,在下没钱)
 楼主| 发表于 2004-9-5 20:53:00 | 显示全部楼层
    呵呵,在下看过您的帖子了,好象很久的,已经有240个阅读者了,但是在下更早哦,去年的7.24日,也就是在下刚买CC800的日子,就为了测试WQX的BAS写下了
这个井字棋,在下已经要将记忆弹出栈了:
    那时侯,刚进入WQXNET就发了第一个贴,询问兰色天使和SUN等大虾关于BAS的GOSUB漏洞问题,因为它在在下的BAS代码中体现了,那时候WQXNET是第5个版本,就是那时侯认识兰色天使的,呵呵,那个不尽人意的代码,在下还有哦~~如下:
0 GRAPHIM B(9)

1 BOX 1,0,155,75
2 BOX 155,8,160,79,1
3 BOX 8,75,160,79,1
4 LOCATE 3,4
5 PRINT "【极限井字棋】"
6 LOCATE 4,13
7 PRINT "-KONG"
8 IF ASC(INKEY$)=27 THEN END

11 I=1:CLS
12 IF M=0 THEN PRINT "模式:" ELSE PRINT "优先:"
13 CIRCLE 50,25,5:CIRCLE 50,55,5:CIRCLE 50,25,2,1
14 LOCATE 2,9:IF M=0 THEN PRINT "极限模式" ELSE PRINT "人先行"
15 LOCATE 4,9:IF M=0 THEN PRINT "传统模式" ELSE PRINT "电脑先"
16 K=ASC(INKEY$)
17 IF K=27 THEN END
18 IF K=20 THEN I=1:CIRCLE 50,25,2,1,1:CIRCLE 50,55,2,1,0
19 IF K=21 THEN I=2:CIRCLE 50,25,2,1,0:CIRCLE 50,55,2,1,1
20 IF K<>13 THEN 16
21 IF M=0 THEN M=I:GOTO 11 ELSE F=I

31 CLS
32 PRINT "人脑"OCATE 1,17RINT "电脑"
33 BOX 48,8,112,72:BOX 50,10,110,70
34 BOX 70,10,90,70:BOX 50,30,110,50
35 BOX 112,15,115,72,1:BOX 55,72,115,75,1
36 FOR I=1 TO 9:B(I)=0:NEXT I
37 IF M=1 THEN N=6 ELSE N=9
38 IF F=2 THEN END

100 FILL=0
110 K=ASC(INKEY$)
120 IF K=27 THEN END
130 IF K=98 THEN K=1:GOTO 220
140 IF K=110 THEN K=2:GOTO 220
150 IF K=109 THEN K=3:GOTO 220
160 IF K=103 THEN K=4:GOTO 220
170 IF K=104 THEN K=5:GOTO 220
180 IF K=106 THEN K=6:GOTO 220
190 IF K=116 THEN K=7:GOTO 220
200 IF K=121 THEN K=8:GOTO 220
210 IF K=117 THEN K=9 ELSE K=0
220 IF K=0 OR B(K)=2 THEN 110
230 GOSUB 1000
240 IF N=0 THEN IF H=0 THEN 260 ELSE 290
250 IF N<>0 THEN 290
260 IF B(K)=0 THEN 110
270 TYPE=0:H=K:GOSUB 3000
280 GOTO 110
290 IF B(K)=1 THEN 110
300 TYPE=1:GOSUB 3000
310 G=1:FNN=3:A=1:GOTO 2000
320 IF OK=1 THEN PRINT "赢!":END
330 IF N<>0 THEN N=N-1
340 IF K=H THEN H=0:GOTO 110 ELSE H=0

400 FILL=1
410 G=2:FNN=2:A=2:NA=0:GOTO 2000
420 IF OK=0 THEN 440
430 IF V<>0 THEN K=V:GOTO 550
440 G=3:FNN=2:A=1:NA=0:GOTO 2000
450 IF OK=0 THEN 470
460 IF V<>0 THEN K=V:GOTO 550
470 IF B(5)<>0 THEN 490
480 K=5:GOTO 550
490 FOR I=1 TO 9 STEP 2
500 IF B(I)=0 THEN K=I:GOTO 550
510 NEXT I
520 FOR I=2 TO 8 STEP 2
530 IF B(I)=0 THEN K=I:GOTO 550
540 NEXT I

550 R=K:GOSUB 1000
560 TYPE=2:GOSUB 3000
570 G=4:FNN=3:A=2:GOTO 2000
580 IF OK=1 THEN WIN=1
590 IF N=0 THEN GOSUB 4000
600 IF WIN=1 THEN WIN=0OCATE 3,17RINT "赢!":END
610 IF N<>0 THEN N=N-1
620 GOTO 100

1000 IF K=1 OR K=4 OR K=7 THEN X=60
1010 IF K=2 OR K=5 OR K=8 THEN X=80
1020 IF K=3 OR K=6 OR K=9 THEN X=100
1030 IF K=1 OR K=2 OR K=3 THEN Y=60
1040 IF K=4 OR K=5 OR K=6 THEN Y=40
1050 IF K=7 OR K=8 OR K=9 THEN Y=20
1060 RETURN

2000 OK=1
2010 F=0:V=0
2020 FOR I=1 TO 9 STEP 4
2030 IF B(I)=A THEN F=F+1
2040 IF B(I)=NA THEN V=I
2050 NEXT I
2060 IF F=FNN THEN 2500
2070 F=0:V=0
2080 FOR I=3 TO 7 STEP 2
2090 IF B(I)=A THEN F=F+1
2100 IF B(I)=NA THEN V=I
2110 NEXT I
2120 IF F=FNN THEN 2500
2130 F=0:V=0
2140 FOR I=1 TO 3
2150 IF B(I)=A THEN F=F+1
2160 IF B(I)=NA THEN V=I
2170 NEXT I
2180 IF F=FNN THEN 2500
2190 F=0:V=0
2200 FOR I=4 TO 6
2210 IF B(I)=A THEN F=F+1
2220 IF B(I)=NA THEN V=I
2230 NEXT I
2240 IF F=FNN THEN 2500
2250 F=0:V=0
2260 FOR I=7 TO 9
2270 IF B(I)=A THEN F=F+1
2280 IF B(I)=NA THEN V=I
2290 NEXT I
2300 IF F=FNN THEN 2500
2310 F=0:V=0
2320 FOR I=1 TO 7 STEP 3
2330 IF B(I)=A THEN F=F+1
2340 IF B(I)=NA THEN V=I
2350 NEXT I
2360 IF F=FNN THEN 2500
2370 F=0:V=0
2380 FOR I=2 TO 8 STEP 3
2390 IF B(I)=A THEN F=F+1
2400 IF B(I)=NA THEN V=I
2410 NEXT I
2420 IF F=FNN THEN 2500
2430 F=0:V=0
2440 FOR I=3 TO 9 STEP 3
2450 IF B(I)=A THEN F=F+1
2460 IF B(I)=0 THEN V=I
2470 NEXT I
2480 IF F=FNN THEN 2500
2490 OK=0
2500 IF G=1 THEN 320
2510 IF G=2 THEN 420
2520 IF G=3 THEN 450
2530 IF G=4 THEN 580
2540 IF G=5 THEN 4020

3000 CIRCLE X,Y,7,FILL,TYPE
3010 B(K)=TYPE
3020 RETURN

4000 G=5:FNN=2:A=1:NA=2:GOTO 2000
4010 IF OK=0 THEN K=0 ELSE K=V
4020 FOR I=1 TO 9
4030 IF K<>I AND R<>I AND B(I)=2 THEN K=I:GOTO 4050
4040 NEXT I
4050 GOSUB 1000
4060 TYPE=0:GOSUB 3000
4070 TYPE=2
4080 RETURN

看到了这个,以前在WQXNET的朋友们是否记得,恐怕没有几个人会象在下记住这些无聊的东西了,不过天使可能还记得~~
真怀念那时侯的WQXNET,在下感说那时侯只要在下在WQXNET呆过的日子,知道的事情到现在没有一件会忘记(虽然是个超级健忘)~~
5555~~~又回忆NET了~~~5555
还有一件可惜的事情,以前在去年在WQXNET和程序站中在下每个帖子都保存起来(当然除了水贴),足足要好几M,因为在下认为每一个都是好贴,一有时间就钻到谷底去翻老贴,保存~~~~~在硬盘的数据丢失后每多久,NET关了!您听到在下大哭了的声音了么~

[此贴子已经被作者于2004-9-5 21:09:51编辑过]

发表于 2004-9-22 18:15:00 | 显示全部楼层
C语言和GVBASIC的代码都出来了哦!不错!
不过GVBASIC的GOTO命令看的我头痛!
我讨厌这种结构!能不能改进下!少用点!
还是C语言的函数结构好!看着就舒服!
发表于 2004-9-23 16:34:00 | 显示全部楼层
汗……GOTO是个好东西。并不是所有的GOTO都是坏的。
人们竟然都对GOTO有着这么深刻的误解……
发表于 2004-9-24 23:28:00 | 显示全部楼层
//....
int CheckKey(int key)
{
switch(key)
{
  case 27: return 27;
  case 98: return 1;
  case 110: return 2;
  case 109: return 3;
  case 103: return 4;
  case 104: return 5;
  case 106: return 6;
  case 116: return 7;
  case 121: return 8;
  case 117: return 9;
  default: return 0;
}
}
LAVA支持switch??????????????????????????????????????
啊  闹了半天竟然不知道!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
哭!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[em06][em06]
 楼主| 发表于 2004-9-25 15:26:00 | 显示全部楼层
回第 13 楼:在下也是想尽量不用GOTO的,但是这样狂用是有它的原因的,因为GGV的GOSUB有BUG,所以~~~这个BAS代码是个垃圾,在下主要是想把效果作出来,不过还是失败,在下BAS太菜了~~
回第 15 楼:这个是C的,LAVA的在其他区中,在下记得原来的LAVA好象不支持switch,现在的不知道支不支持~~
发表于 2005-2-10 21:40:00 | 显示全部楼层
!·#¥%%%……—¥*%*#¥#%……#¥43
发表于 2005-2-10 21:50:00 | 显示全部楼层
lava木支持switch.zero也木支持
bitfly 该用户已被删除
发表于 2005-6-13 20:34:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
编程狂 该用户已被删除
发表于 2005-7-5 13:12:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2005-7-5 13:24:00 | 显示全部楼层
以前1020上就有个《超级井字棋》,规则是一样的。
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-27 09:58 , Processed in 0.015537 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表