我的世界别墅制作教程五子棋AI怎么做 五子棋AI制作教程

[直播]Minecraft内五子棋AI VS 编程五子棋AI_minecraft吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,356,965贴子:
[直播]Minecraft内五子棋AI VS 编程五子棋AI
Minecraft内五子棋AI:EndRoad α0.7 (白)Author:@乾坤轩辕1(暂时未制作搜索功能,以后会加入)编程五子棋AI:Trendop五子棋软件(黑)Author:@MojeDes (限制棋力至一层搜索能力)直播间:第一局棋谱镇楼(EndRoad胜)
开播咯 5人回复开始下一波
1L祭度娘 苦力怕镇楼0.0...
Hello,大家好,欢迎来...
lz绝壁不会杀生,所以请...
RT,不发图知道你们不会...
大家好,我是xiaoxinlab...
自行车加盟,投资成本低,轻松盈利,小本创业,万元代理.
三楼感谢直播间提供者
第二局EndRoad胜利,但本人忙于发帖忘记截图2333
临赢智障效果还有么
抢到了五楼,ER加油!
缺牙要及时修复,揭秘种植牙如何做到几十年不掉?
智障乾坤下不过电脑
2:3(黑棋AI有禁手)
这是对战后台,左边是编程AI
怎么看都像是故意输得(顺便抢个前排)
3:4(黑棋三三禁手胜)
(据悉黑棋赢的前两局貌似都禁手233,但是没关注就算啦XD)
3:6(黑棋三三禁手)
3:7(黑棋三三禁手)
好了,一共下了10局,如果允许禁手,EndRoad胜3局负7局,如果不允许,EndRoad胜9局负1局(其实不能这么算233,但是在编程AI赢的7局中,6局走了禁手Orz)
而且大家注意,编程AI是使用深度搜索算法的(EndRoad我以后会加入),在这种情况下,ER还赢了3局,而编程AI取得的胜利7局中6局都是禁手,可见还有很大的发展空间
艾特大法好,天朝ER好
深度搜索的flag接好我觉得制作时间和debug时间得崩
lz 你的棋子是怎么做的
贴吧热议榜
使用签名档&&
保存至快速回贴→ 我的世界红石五子棋怎么做(我的世界红石五子棋教程)
三、xy定位
(1):做之前确定的事情:
1、除xy外还应该与黑棋白棋进行与运算。
2、因为锁存器黑棋白棋的2个输入是并列的,所以我们把(x和黑棋与)和(x和白棋与)的输出分别和y与做到定位。
3、因为需要15x15个4x4的点,所以电路传输部分很长,选用较为简单的电路摆在下面然后向上传输电路的方法制作。
4、把xy定位的输出接到锁存器的输入端。
5、保证xy定位器和锁存器的第二个输出端互不干扰。
(2):开始制作:
1、选用恰当的与门设计。
2、使用半砖(荧石)向上传输,并重复1的设计。
3、保证所有锁存器的输入都覆盖到。
4、理线,让x和y的线间距都为1,方便双向移位器布线。
四、双向移位器
这个不需要讲太多原理和输入输出需求,主要在存档里看怎么做。
1、当移位到尽头的时候就限制输入,不允许再向这个方向移位。
2、分清楚哪个是x哪个是y。
把黑棋的15x15个输出和白棋的输出分开,方便进行胜负判定。
制作方法看存档就可以看懂,非常简单的结构。
分页:2/3页&&2
相关文章:
猜你喜欢的游戏
游戏攻略分类
热门游戏专辑
独立游戏是相对于商业游戏制作而...
独立游戏是相对于商业游戏制作而存在的另一种游戏制作行为,这一...
有这么一种生物,他们吸食鲜血大...
有这么一种生物,他们吸食鲜血大多数长着尖牙与翅膀,标志是蝙蝠...
恋爱养成类游戏是一种造梦的游戏...
恋爱养成类游戏是一种造梦的游戏,玩家扮演大人养护孩子,你往往...
随着近年来游戏行业快速发展,我...
随着近年来游戏行业快速发展,我们似乎发现出现在外国游戏中的中...
棋盘游戏和牌类统称棋牌游戏。棋...
棋盘游戏和牌类统称棋牌游戏。棋牌类从明清开始一度兴盛,涉及赌...自己做的带AI五子棋 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 10时,
熬夜了一宿,总算写了个有点点像样的带AI五子棋,什么功能都没有加上去,只能简单的对战……
希望高手们板砖拍的轻一些阿……
代码片段(5)
AI.java&~&6KB&&&&
package FiveC
import java.util.LinkedL
import java.util.Q
import java.util.R
//1.五子:某一方形成五个相同颜色的棋子相连
//2.活四:形成四子相连,并且两端是都没有子的
//3.冲四:形成四子相连,并且有一端是有对方棋子或者是墙壁,而另一端是没有子的
//4.活三:形成三子相连,并且两端是都没有子的
//5.死三:形成三子相连,并且有一端是有对方棋子或者是墙壁,而另一端是没有子的
//6.活二:形成两子相连,并且两端是都没有子的
//7.死二:形成两子相连,并且有一端是有对方棋子或者是墙壁,而另一端是没有子的
//8.活单:一颗子,另一端两端没有子
//9.死单:一颗子,一端有子或墙壁,一端无子
public class AI {
MainFrm mf=new MainFrm();
private MyLinkedList keyPoint = new MyLinkedList();
//存放所有关键落子点
private int kind(int x,int y,int addX,int addY,int role){ //区分棋形种类
//X方向增加值
//Y方向增加值
int kind=10;
while(true){
if(x==15||y==15||x==-1||y==-1){
else if(mf.chessboard[x][y]==mf.AIflag&&role==mf.AIflag) kind-=2; //如果此处为AI的棋子而且正在计算AI的落子等级,则升高两级
else if(mf.chessboard[x][y]==mf.Userflag&&role==mf.AIflag){
//如果此处为用户的棋子而且正在计算AI的落子等级,则降低一级
//等级降低一级
//退出循环
else if(mf.chessboard[x][y]==mf.Userflag&&role==mf.Userflag) kind-=2; //如果此处为用户的棋子而且正在计算用户的落子等级,则升高两级
else if(mf.chessboard[x][y]==mf.AIflag&&role==mf.Userflag){
//如果此处为AI的棋子而且正在计算用户的落子等级,等级降低一级
//等级降低一级
//退出循环
else if(mf.chessboard[x][y]==-1){
//如果另一端无子
if((x+addX)&=0&&(y+addY)&=0&&(x+addX)&=14&&(y+addY)&=14&&mf.chessboard[x+addX][y+addY]==mf.AIflag&&role==mf.AIflag)
else if((x+addX)&=0&&(y+addY)&=0&&(x+addX)&=14&&(y+addY)&=14&&mf.chessboard[x+addX][y+addY]==mf.Userflag&&role==mf.Userflag)
//X方向增加值
//Y方向增加值
private int countDegree(int x,int y,char direction,int role){ //评价可落子点的等级
int degree=10;
switch(direction){
if(degree&=kind(x,y,0,1,role))
degree=kind(x,y,0,1,role);
case 'b': if(degree&=kind(x,y,1,1,role))
degree=kind(x,y,1,1,role);
case 'c': if(degree&=kind(x,y,1,0,role))
degree=kind(x,y,1,0,role);
if(degree&=kind(x,y,1,-1,role))
degree=kind(x,y,1,-1,role);
if(degree&=kind(x,y,0,-1,role))
degree=kind(x,y,0,-1,role);
if(degree&=kind(x,y,-1,-1,role))
degree=kind(x,y,-1,-1,role);
if(degree&=kind(x,y,-1,0,role))
degree=kind(x,y,-1,0,role);
if(degree&=kind(x,y,-1,1,role))
degree=kind(x,y,-1,1,role);
private void searchKeyPoint(){
for(int i=0;i&15;i++){
for(int j=0;j&15;j++){
if(mf.chessboard[i][j]!=-1){
//搜索到一处有棋子
if(j&=1&&mf.chessboard[i][j-1]==-1){
keyPoint.insNewLastNode(i, j-1, 'a', countDegree(i,j-1,'a',mf.chessboard[i][j]), mf.chessboard[i][j]);
if(i&=1&&j&=1&&mf.chessboard[i-1][j-1]==-1){
keyPoint.insNewLastNode(i-1, j-1, 'b', countDegree(i-1,j-1,'b',mf.chessboard[i][j]), mf.chessboard[i][j]);
if(i&=1&&mf.chessboard[i-1][j]==-1){
keyPoint.insNewLastNode(i-1, j, 'c', countDegree(i-1,j,'c',mf.chessboard[i][j]), mf.chessboard[i][j]);
if(i&=1&&j&=13&&mf.chessboard[i-1][j+1]==-1){
keyPoint.insNewLastNode(i-1, j+1, 'd', countDegree(i-1,j+1,'d',mf.chessboard[i][j]), mf.chessboard[i][j]);
if(j&=13&&mf.chessboard[i][j+1]==-1){
keyPoint.insNewLastNode(i, j+1, 'e', countDegree(i,j+1,'e',mf.chessboard[i][j]), mf.chessboard[i][j]);
if(i&=13&&j&=13&&mf.chessboard[i+1][j+1]==-1){
keyPoint.insNewLastNode(i+1, j+1, 'f', countDegree(i+1,j+1,'f',mf.chessboard[i][j]), mf.chessboard[i][j]);
if(i&=13&&mf.chessboard[i+1][j]==-1){
keyPoint.insNewLastNode(i+1, j, 'g', countDegree(i+1,j,'g',mf.chessboard[i][j]), mf.chessboard[i][j]);
if(j&=1&&i&=13&&mf.chessboard[i+1][j-1]==-1){
keyPoint.insNewLastNode(i+1, j-1, 'h', countDegree(i+1,j-1,'h',mf.chessboard[i][j]), mf.chessboard[i][j]);
private void choosePoint(){
int x = 0;
int y = 0;
if(keyPoint.length==0){
//如果没有任何合适位置——链表中没有可选位置
while(true){
Random r = new Random();
//产生随机数
int n1 = r.nextInt(10);
int n2 = r.nextInt(10);
n1 = Math.abs(r.nextInt() % 10);
//获取10以内整数
n2 = Math.abs(r.nextInt() % 10);
if(mf.chessboard[n1][n2]==-1){
//如果这个位置没有棋子
mf.bt[n1][n2].setColor(mf.AIflag);
mf.chessboard[n1][n2]=mf.AI
mf.bt[n1][n2].property=mf.AI //标记已有棋子
System.out.printf("%d,%d\n",n1+1,n2+1);
x=keyPoint.BestSearch(mf.AIflag).x;
y=keyPoint.BestSearch(mf.AIflag).y;
mf.bt[x][y].setColor(mf.AIflag);
mf.chessboard[x][y]=mf.AI
mf.bt[x][y].property=mf.AI
System.out.printf("%d,%d\n",x+1,y+1);
mf.win(x,y,mf.AIflag);
public AI(){
searchKeyPoint();
choosePoint();
keyPoint.print();
FivButton.java&~&2KB&&&&
package FiveC
import java.awt.B
import java.awt.C
import java.awt.event.ActionE
import java.awt.event.ActionL
public class FivButton extends Button implements ActionListener{
public int property=-1;
//标记按钮状态(无子-1,白子0,黑子1)
public int x=0;
//按钮位置
public int y=0;
MainFrm mf=new MainFrm();
public FivButton(int x,int y){
this.setBackground(Color.green);
//初始界面为绿色
this.addActionListener(this);
//注册事件监听
//设置按钮位置
public int getX(){
//获取按钮x轴位置
public int getY(){
//获取按钮y轴位置
public int getProperty(){
//获取按钮状态
public void setProterty(int property){
//设置按钮状态
this.property=
public void setColor(int flag){
if(flag==0)
this.setBackground(Color.white);
else if(flag==1)
this.setBackground(Color.black);
public void actionPerformed(ActionEvent e) { //按钮左键单击事件
// TODO Auto-generated method stub
if(mf.flag==1&&this.property==-1){
//如果为黑方落子而且该处无子
mf.flag=0;
this.setBackground(Color.black);
//设置背景为黑色
this.property=1;
//该按钮状态改为黑子
mf.chessboard[this.x][this.y]=1;
mf.win(this.x, this.y, mf.Userflag);
AI a=new AI();
//电脑AI落子
mf.flag=1;
MainFrm.java&~&3KB&&&&
package FiveC
import java.awt.BorderL
import java.awt.B
import java.awt.F
import java.awt.GridL
import java.awt.P
import java.awt.event.ActionE
import java.awt.event.ActionL
import java.awt.event.WindowA
import java.awt.event.WindowE
public class MainFrm extends Frame{
Frame frm=new Frame("五子棋,商煜制作");
Panel p1=new Panel();
//panel1,容纳其他信息
Panel p2=new Panel();
//panel2,容纳所有的按钮
public static FivButton[][] bt=new FivButton[15][15]; //所有的按钮
public static int flag=1; //标记目前轮到谁落子
public static int[][] chessboard=new int[15][15]; //记录整个棋盘情况
public int[][] direct={{0,1},{1,1},{1,0},{1,-1},{-1,0},{-1,-1},{-1,0},{-1,1}};
public int AIflag=0;
//AI的棋子颜色,0为白色
public int Userflag=1;
//用户棋子颜色,1为黑色
public void go(){
//chessboard初始化
for(int i=0;i&15;i++){
for(int j=0;j&15;j++){
chessboard[i][j]=-1;
p2.setLayout(new GridLayout(15,15));
//panel2为网格布局
for(int i=0;i&15;i++){
for(int j=0;j&15;j++){
bt[i][j]=new FivButton(i,j);
bt[i][j].setSize(30,30);
//按钮大小
p2.add(bt[i][j]);
p1.setSize(20,450);
//panel1大小
p2.setSize(450,450);
//panel2大小
frm.add("West",p1);
frm.add(p2);
frm.setSize(470,450);
//窗体大小
frm.setVisible(true);
//关闭按钮事件监听
frm.addWindowListener(new WindowAdapter()
public void windowClosing(WindowEvent e)
System.exit(0);
public int directSearch(int x,int y,int dx,int dy,int role){
//八个方向搜索
int length=1;
int x_=x;int y_=y;
//保存初始点位置
for(int i=1;i&=4;i++){
if(x==-1||y==-1||x==15||y==15)
//到达边界
if(chessboard[x][y]==role) length++;
else if(chessboard[x][y]!=role)
for(int i=1;i&=4;i++){
//反向搜索
if(x==-1||y==-1||x==15||y==15)
if(chessboard[x][y]==role) length++;
else if(chessboard[x][y]!=role)
public void win(int x,int y,int role){
//胜利条件
for(int i=0;i&8;i++){
if(directSearch(x,y,direct[i][0],direct[i][1],role)==5)
//连子数为5
if(role==AIflag)
System.out.println("电脑赢了!");
else if(role==Userflag)
System.out.println("你赢了!!");
* @param args
public static void main(String[] args) {
// TODO Auto-generated method stub
MainFrm mf=new MainFrm();
MyLinkedList.java&~&2KB&&&&
package FiveC
class MyLinkedList{
int length=0;
Node firstN
public int size(){
//public void insNewSecNode(int x,int y,char direction,int degree,int flag){
if(length==0)
Node newNode=new Node();
newNode.x=x;
newNode.y=y;
newNode.direction=
newNode.degree=
newNode.flag=
newNode.next=firstNode.
firstNode.next=newN
public Node BestSearch(int role){
best=firstN
while(N!=null){
if(best.degree&N.degree){
else if(best.degree==N.degree){
if(N.flag==role)
//public void deleteNode(int x,int y){
// Node N;
// N=firstN
// if(N.x==x&&N.y==y) N.next=firstN
// while(N.next.next!=null){
if(N.next.x==x&&N.next.y==y){
N.next=N.next.
public void insNewLastNode(int x,int y,char direction,int degree,int flag){
Node N=new Node();
N.direction=
if(firstNode==null){
firstNode=N;
Node P=firstN
while(P.next!=null){
public void print(){
System.out.print("(");
while(N!=null){
System.out.printf("%d,(%d,%d)",N.degree,N.x+1,N.y+1);
if(N!=null){
System.out.print(",");
System.out.println(")");
}//end class LinkedList
Node.java&~&159B&&&&
package FiveC
public class Node {
//谁的棋子
开源中国-程序员在线工具:
这个很不错呀.
另外, 关于AI这块, 你这个不太怎么样, 我有个建议就是看看alpha-beta算法, 然后就算写象棋AI也会难不到你了.
2楼:JohnnyCage 发表于
引用来自“Jack.arain”的评论这个很不错呀.
另外, 关于AI这块, 你这个不太怎么样, 我有个建议就是看看alpha-beta算法, 然后就算写象棋AI也会难不到你了.
受教了~谢谢阿那个AI模块我是参考网上的一个思路的,感觉是不太好
3楼:爱上绝对路径 发表于
这个AI很弱。。。不过凡事慢慢来嘛。
4楼:JohnnyCage 发表于
引用来自“尘絮缘”的评论这个AI很弱。。。不过凡事慢慢来嘛。
是的,还只能考虑一步……正在尝试用剪枝算法修改AI
5楼:爱上绝对路径 发表于
引用来自“JohnnyCage”的评论引用来自“尘絮缘”的评论这个AI很弱。。。不过凡事慢慢来嘛。
是的,还只能考虑一步……正在尝试用剪枝算法修改AI记得分享哟
6楼:JohnnyCage 发表于
引用来自“尘絮缘”的评论引用来自“JohnnyCage”的评论引用来自“尘絮缘”的评论这个AI很弱。。。不过凡事慢慢来嘛。
是的,还只能考虑一步……正在尝试用剪枝算法修改AI记得分享哟写出来一定分享~
7楼:HADB 发表于
NB!顶一个!
8楼:JohnnyCage 发表于
引用来自“肩膀有肉”的评论NB!顶一个!哈哈哈~怎么被你找到了
开源从代码分享开始
JohnnyCage的其它代码热门搜索:
当前位置:
我的世界红石五子棋教程
日 18:13&&&&&阅读(77)&&&&&来源:游戏堡&&&&&编辑:yxbao&&&&&
在《》中,很多玩家利用红石作机关做过门、楼梯等,那大家有用红石做过五子棋吗?下面就给大家带来红石五子棋的教程,大家可以学着做出来。
传奇最网页版,多人团战跨服竞技玩法冰火战场,十年最经典游戏,英雄合击,特效绚丽,赶紧注册试玩一下,
一、显示频
(1): 做之前确定的事情:
1、五子棋棋盘大小15x15。
2、需要能显示没有棋,黑棋,白棋3种状态。
3、电路可直接用//stack复制(可堆叠)。
4、一个点的大小。
①每个点需要最少2个锁存器,一个锁存器存储这个点是白色,另一个存储黑色,当2个都为0的时候则不显示(没有棋)。
②选择合适的锁存器,以确定点的大小。
③考虑美观优先选用正方形。
(2): 开始制作:
1、每个点需要2个锁存器,而锁存器的最简设计为3L2W2H,2个即4宽,所以确定每个点的大小宽为4,因为优先选用 正方形,以高也定为4。
2、宽4高4每个点,为了美观我们留出一排做间隔,也就是我们最终显示屏每个点显示⑨个灯。其余7个方块留空做间隔。
3、显示屏需要显示3种状态。
4、因为红石灯的性质,所以布线像这样即可点亮四个角,再这样添加一条线,就能显示3种状态了。
(1):做之前确定的事情:
1、锁存器:使用上图中的3W2W2H版本。
2、每个点需要2个锁存器。
3、每个锁存器需要2个输出一个输入以及一个清零。
4、保证高4可叠加。
(2): 开始制作:
1、叠加2个锁存器并输出给显示屏(图中只有显示屏的2个输入中继器,没有显示屏电路。)。
2、制作输入线(输入由接下来的xy定位输入。)。
3、拉出2个输出留给接下来的胜负判定。
4、拉一条清零线。
三、xy定位
(1):做之前确定的事情:
1、除xy外还应该与黑棋白棋进行与运算。
2、因为锁存器黑棋白棋的2个输入是并列的,所以我们把(x和黑棋与)和(x和白棋与)的输出分别和y与做到定位。
3、因为需要15x15个4x4的点,所以电路传输部分很长,选用较为简单的电路摆在下面然后向上传输电路的方法制作。
4、把xy定位的输出接到锁存器的输入端。
5、保证xy定位器和锁存器的第二个输出端互不干扰。
(2):开始制作:
1、选用恰当的与门设计。
2、使用半砖(荧石)向上传输,并重复1的设计。
3、保证所有锁存器的输入都覆盖到。
4、理线,让x和y的线间距都为1,方便双向移位器布线。
四、双向移位器
这个不需要讲太多原理和输入输出需求,主要在存档里看怎么做。
1、当移位到尽头的时候就限制输入,不允许再向这个方向移位。
2、分清楚哪个是x哪个是y。
把黑棋的15x15个输出和白棋的输出分开,方便进行胜负判定。
制作方法看存档就可以看懂,非常简单的结构。
六、胜负判定
这个教程的精髓部分
1、Minecraft中红石的信号只能传输15格。
2、与门原理。
4、卧槽楼上你真的不是开玩笑原理就这么简单?
5、↑是的。请看图:
图中有6个输入,分别取名ABCDEF。2个输出 CD。
要达成胜利,5连珠就必须是ABCDE或者BCDEF。
输入A的信号可以影响到B,C但是影响不到D。
输入B的信号可以影响到A,C,D但是影响不到E。
每个输入都可以影响在它左边的2个信号和在它右边的2个信号。
也就是说当ABCDE都有输入时,在输出C的火把会亮起来。而如果任意一个没有输入,就会影响到输出C。
这是一个五输入与门,并且可以很方便扩展。(布尔表达式为: outputC=A&B&C&D&E ; outputD =B&C&D&EF.)
1、因为我们2个输入宽高都是间隔3,所以我们输入的信号是9格长的。(A刚好能影响到C的程度)
2、斜的布线比横竖的复杂一些,要6格线能拉到下一个输入,而横的只需要4格,所以斜的判定输入信号是13格长的。(A刚好能影响到C的程度)
3、然后就是接线了,接线不困难也不涉及理论上的东西,这里就不多讲了,直接在存档里面就可以看到。
我的世界专区:
我的世界系列游戏下载
我的世界热门攻略
我的世界热门补丁
游戏标签:
游戏类别:
游戏平台:Vista/winXP/win7
游戏版本:中文版
开发商:Markus Perssor
发行时间:
相关阅读:
阅读(132)01-24
阅读(204)01-19
阅读(56)01-26
阅读(195)01-19
阅读(259)01-17
阅读(214)01-14
阅读(109)01-13
阅读(160)01-11
阅读(174)01-03
阅读(259)01-03
你可能感兴趣的游戏
一周热点攻略
口袋妖怪漆黑的魅影5.0是一款根据口袋妖怪改编的同人 ......
作品版权归作者所有,如果侵犯了您的版权,请联系我们,本站将在3个工作日内删除。
中国综合游戏门户之一,游戏堡网提供(,网络游戏,网页游戏,手机游戏等)资讯,攻略,下载,补丁 是您找游戏内容的最好选择。
All Rights Reserved 湘ICP备号-2
游戏堡网温馨提示:抵制不良游戏,拒绝盗版游戏,注意自我保护,谨防受骗上当,适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活!}

我要回帖

更多关于 我的世界mod制作教程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信