import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* @author 管超
* 2009年8月26日
* tips:算法并非尽善尽美,有待改进的地方还有很多
*/
public class Test090826 extends Applet implements ActionListener,MouseListener
{
String str="人机对弈的五子棋游戏";
Dimension currentPos=new Dimension();//用于后来计算x、y的值
int chessBoard[][]=new int[15][15];//存储棋局的数组以0、1、2分别别代表空格、我方棋子、敌方棋子
int x=20,y=20;//由鼠标监视器返回值计算得到的坐标
int valueOfPresent[][]=new int[15][15];//保存每个点的当前值,再在其中选取最大值落点
int presentStatus[][][][]=new int[15][15][4][2];//当前状态记录 4 个方向 同色棋子的数目及是否被堵死
int locationX, locationY;//下一步落点的坐标
boolean finish1=false,finish2=false;//判断是否结束
int numOfLeft , leftBarrier , leftBlank;
int numOfRight , rightBarrier , rightBlank;
int numOfUp , upBarrier , upBlank;
int numOfDown , downBarrier , downBlank;
int numOfLu , luBarrier , luBlank;
int numOfLd , ruBarrier , ruBlank;
int numOfRu , ldBarrier , ldBlank;
int numOfRd , rdBarrier , rdBlank;
public void init()
{
addMouseListener(this);
for(int i=0;i<=14;i++)
{
for(int j=0;j<=14;j++)
chessBoard[i][j]=0;
}
}
public static void main(String[] args)
{
JFrame frame=new JFrame("人机对弈的五子棋游戏");
Test090826 applet=new Test090826();
frame.getContentPane().add(applet,BorderLayout.CENTER);
applet.init();
applet.start();
frame.setVisible(true);
}
public void paint(Graphics g)
{
int x0=30,y0=50,dx=30,dy=30,N=14,M=14;
int x1,y1,x2,y2;
g.setColor(Color.black);
y1=y0;
y2=y0+M*dy;
for(int i=0;i<=N;i++)
{
x1=x0+i*dx;
g.drawLine(x1,y1,x1,y2);
}
g.setColor(Color.black);
x1=x0;
x2=x0+N*dx;
for(int j=0;j<=M;j++)
{
y1=y0+j*dy;
g.drawLine(x1,y1,x2,y1);
}
g.setColor(Color.black);
g.setFont(new Font("TimesRoman",Font.BOLD,25));
g.drawString(str,120,30);
g.setColor(Color.red);
g.fillOval(600,60,20,20); g.drawString(" : 我棋子的颜色",610,80);
g.setColor(Color.blue);
g.fillOval(600,100,20,20); g.drawString(" : 您棋子的颜色",610,120);
if(finish2)
{
if(!finish1)
{
g.setColor(Color.red);
g.drawString("你赢了!恭喜你!",150,550);
}
}
if(finish1)
{
g.setColor(Color.red);
g.drawString("你输了,再接再厉吧",150,550);
}
for(int i=0;i<=14;i++)
for(int j=0;j<=14;j++)
{
if(chessBoard[i][j]==1)
{
g.setColor(Color.red);
g.fillOval(20+i*30,40+j*30,20,20);
}
if(chessBoard[i][j]==2)
{
g.setColor(Color.blue);
g.fillOval(20+i*30,40+j*30,20,20);
}
}
}
public void actionPerformed(ActionEvent e)
{
}
public void mouseClicked(MouseEvent e)
{
currentPos.width=e.getX();
currentPos.height=e.getY();
if(currentPos.width>15¤tPos.width<485¤tPos.height>35¤tPos.height<485) //15*15的画布中
{
x=y=20;
for(int i=0;i<=14;i++)
{
for(int j=0;j<=14;j++)
{
if(currentPos.width<=(45+i*30)¤tPos.width>=(15+i*30))
x=i;
if(currentPos.height<=(65+j*30)¤tPos.height>=(35+j*30))
y=j;
}
}
if(x!=20&&y!=20)
if(chessBoard[x][y]==0)
chessBoard[x][y]=2;
repaint();
preset();
getStatus(1);//我方搜索
getStatus(2);//对手搜索
getLoc();
repaint();
}
}
public void mousePressed(MouseEvent e)
{ }
public void mouseReleased(MouseEvent e)
{ }
public void mouseEntered(MouseEvent e)
{ }
public void mouseExited(MouseEvent e)
{ }
//每一次搜索执行前均需初始化数组
public void preset()
{
for (int i=0;i<15;i++)
{
for (int j=0;j<15;j++)
valueOfPresent[i][j]=0;
}
}
//逐点搜索,并且确定该点的权值
public void getStatus(int side)
{
int sum=0;
for (int i=0;i<15;i++)
{
for (int j=0;j<15;j++)
{
numOfLeft=0; leftBarrier=0; leftBlank=0;
numOfRight=0; rightBarrier=0; rightBlank=0;
numOfUp=0; upBarrier=0; upBlank=0;
numOfDown=0; downBarrier=0; downBlank=0;
numOfLu=0; luBarrier=0; luBlank=0;
numOfLd=0; ldBarrier=0; ldBlank=0;
numOfRu=0; ruBarrier=0;ruBlank=0;
numOfRd=0; rdBarrier=0; rdBlank=0;
sum=0;
if ( chessBoard[i][j]==0)
{
for (int k=1;k<5;k++)
{
//横向检查
if ( (leftBarrier==0) && (leftBlank==0))
{
if( (j-k)>=0 )
{
if (chessBoard[i][j-k]==side) numOfLeft++;
else if (chessBoard[i][j-k]==0)leftBlank=1;
else leftBarrier=1;
}
else leftBarrier=1;
}
if ( (rightBlank==0) && (rightBarrier==0))
{
if ((j+k)<15)
{
if (chessBoard[i][j+k]==side ) numOfRight ++;
else if (chessBoard[i][j+k]==0) rightBlank=1;
else rightBarrier=1;
}
else rightBarrier =1;
}
//斜向检查
if ( (luBlank==0) && (luBarrier==0) )
{
if ((i-k)>=0 && (j-k)>=0)
{
if ( chessBoard[i-k][j-k]==side) numOfLu++;
else if ( chessBoard[i-k][j-k]==0) luBlank=1;
else luBarrier=1;
}else luBarrier=1;
}
if ( (rdBlank==0) && (rdBarrier==0))
{
if ((i+k)<15 && (j+k)<15)
{
if (chessBoard[i+k][j+k]==side ) numOfRd++;
else if ( chessBoard[i+k][j+k]==0) rdBlank=1;
else rdBarrier=1;
}
else rdBarrier =1;
}
// 竖直方向检查
if ( (upBlank==0) && (upBarrier==0))
{
if ((i-k)>=0)
{
if (chessBoard[i-k][j]==side) numOfUp++;
else if ( chessBoard[i-k][j]==0) upBlank=1;
else upBarrier=1;
}
else upBarrier =1;
}
if ( ( downBlank==0)&& (downBarrier==0) )
{
if ((i+k)<15)
{
if (chessBoard[i+k][j]==side)numOfDown++;
else if ( chessBoard[i+k][j]==0) downBlank=1;
else downBarrier=1;
}
else downBarrier =1;
}
//斜向检查
if ( ( ldBlank==0)&& (ldBarrier==0))
{
if ((i+k)<15 && (j-k)>=0)
{
if (chessBoard[i+k][j-k]==side) numOfLd++;
else if ( chessBoard[i+k][j-k]==0) ldBlank=1;
else ldBarrier =1;
}
else ldBarrier=1;
}
if ( (ruBlank==0)&& (ruBarrier==0))
{
if ( (i-k)>=0 && (j+k)<15 )
{
if (chessBoard[i-k][j+k]==side) numOfLd++;
else if (chessBoard[i-k][j+k]==0) ruBlank=1;
else ruBarrier=1;
}
else ruBarrier =1;
}
}//end for (k)
/*以下为估值部分*/
presentStatus[i][j][0][0]=numOfLeft+numOfRight;
presentStatus[i][j][0][1]=leftBarrier+rightBarrier;
presentStatus[i][j][1][0]=numOfLu+numOfRd;
presentStatus[i][j][1][1]=luBarrier+rdBarrier;
presentStatus[i][j][2][0]=numOfUp+numOfDown;
presentStatus[i][j][2][1]=upBarrier+downBarrier;
presentStatus[i][j][3][0]=numOfRu+numOfLd;
presentStatus[i][j][3][1]=ruBarrier+ldBarrier;
for ( int k=0;k<4;k++)
{
switch (presentStatus[i][j][k][0])//以一个方向上的棋子数目来判定
{
case 1:
{
if (presentStatus[i][j][k][1]==1)
{
if (side==2)valueOfPresent[i][j]=1+valueOfPresent[i][j];
else valueOfPresent[i][j]=5+valueOfPresent[i][j];
}
else if(presentStatus[i][j][k][1]==0)
{
if ( side==2)valueOfPresent[i][j]=21+valueOfPresent[i][j];
else valueOfPresent[i][j]=23+valueOfPresent[i][j];
}
break;
}//case 1
case 2:
{
if (presentStatus[i][j][k][1]==1)
{
if (side==2)valueOfPresent[i][j]=93+valueOfPresent[i][j];
else valueOfPresent[i][j]=valueOfPresent[i][j]+138;
}
else if(presentStatus[i][j][k][1]==0)
{
if ( side==2)valueOfPresent[i][j]=valueOfPresent[i][j]+553;
else valueOfPresent[i][j]=valueOfPresent[i][j]+555;
}break;
}//case 2
case 3:
{
if (presentStatus[i][j][k][1]==1)
{
if (side==2)valueOfPresent[i][j]=valueOfPresent[i][j]+580;
else valueOfPresent[i][j]=valueOfPresent[i][j]+600;
}
else if(presentStatus[i][j][k][1]==0)
{
if ( side==2)valueOfPresent[i][j]=valueOfPresent[i][j]+2221;
else valueOfPresent[i][j]=valueOfPresent[i][j]+5000;
}break;
}//case 3
case 4:
{
sum++;
if (side==1)finish1=true;
else if (sum>=2) finish2=true;
if (side==2) valueOfPresent[i][j]=valueOfPresent[i][j]+30000;
else valueOfPresent[i][j]=valueOfPresent[i][j]+40000;break;
}//case 4
} //end swtich
}//end for (k)
}// end if
}// end for (j)
}//end for(i)
}
/*获取计算机的落子点*/
public void getLoc()
{
int temp=-1;
for (int i=0; i<15;i++)
{
for (int j=0;j<15;j++)
{
if (valueOfPresent[i][j]>=temp)
{
temp = valueOfPresent[i][j];
locationX=j;
locationY=i;
}
}
}
if (temp==0)
{
locationX=6;
locationY=7;
}
chessBoard[locationY][locationX]=1;
}
}
分享到:
相关推荐
4. **人工智能算法**:Minimax算法是五子棋AI的常见实现,它基于深度优先搜索,通过预测对手的最优走法来决定自己的最优走法。Alpha-Beta剪枝则可以进一步优化搜索效率,减少不必要的计算。 5. **博弈树**:理解...
博弈,尤其是棋类游戏,被视为检验人工智能水平的重要试验场,它涉及到推理技术、搜索方法和决策规划等关键AI技术。本文聚焦于五子棋这一传统棋类游戏,旨在通过人工智能技术,设计并实现一个能够与人类玩家进行高效...
在本文中,我们将深入探讨如何使用C#编程语言来实现一个基于遗传算法的五子棋游戏AI。五子棋是一种简单但策略性丰富的二人对弈游戏,因此它为初学者和高级开发者提供了一个理想的平台来实践游戏AI的设计。Visual ...
详情介绍:https://www.yuque.com/sxbn/ks/100010174 使用 yolov5 实现对五子棋的目标识别,使用编写的五子棋界面生成训练和测试数据。下载预训练模型后,进行迁移学习,训练得到识别黑白棋的模型。
要理解这个人工智能课程设计报告,我们首先从五子棋的基本概念入手。五子棋是一种源自中国的传统棋类游戏,目标是使自己的棋子在棋盘上形成五个连续的棋子,无论是横向、纵向还是对角线。游戏通常在15x15的棋盘上...
3. **人工智能(AI)**:如果程序包含单人模式,那么需要一个AI对手。简单的AI可以使用固定模式或基于规则的系统,更高级的AI则可能涉及到机器学习,如Minimax算法配合Alpha-Beta剪枝。 4. **数据结构**:棋盘状态...
微信小程序五子棋AI篇是关于如何在微信小程序平台上实现一个具有人工智能对弈功能的五子棋游戏。在这个项目中,开发者需要结合编程技术与算法设计,为用户提供一个可以与智能计算机对战的五子棋体验。以下是这个主题...
人工智能学习总结成果,希望可以帮到大家,有疑问欢迎随时沟通~ 人工智能学习总结成果,希望可以帮到大家,有疑问欢迎随时沟通~ 人工智能学习总结成果,希望可以帮到大家,有疑问欢迎随时沟通~ 人工智能学习总结...
《杭电人工智能导论——五子棋》课程是针对人工智能领域的一个实践教学项目,通过学习,我们可以深入了解如何利用计算机编程实现人工智能在游戏策略中的应用。在这个项目中,五子棋作为一个经典的二人对弈游戏,被选...
人工智能课程设计,包含报告、代码及程序,五子棋程序仅有人机对弈部分,已经vs调试可运行。欢迎下载。
- **回溯算法**:为了提供AI(人工智能)对手,可能采用回溯算法来模拟对手的走法,尝试所有可能的走法,选取最佳路径。 4. **用户交互**: - **游戏界面**:界面应清晰易用,显示棋盘、当前玩家信息、提示信息等...
4. AI算法:如果存在人工智能模式,还需要实现简单的AI策略,如最小最大搜索、启发式算法等。 三、背景音乐类——music.java 背景音乐类`music.java`负责加载和播放游戏的背景音乐,提升用户体验。Java中可以使用...
【标题】"Android4项目实战--五子棋"是一个针对Android平台开发的五子棋游戏应用的实战教程,旨在帮助开发者提升在Android 4.x版本系统上的应用开发技能,特别是游戏编程方面。在这个项目中,你将学习如何利用...
在这个项目中,学生可能需要利用人工智能算法来创建一个能够玩五子棋的智能对手,以此来理解和应用AI的基本原理。 描述中的“可用于人工智能大作业、毕业设计、课程设计学习交流使用”表明这个资源不仅适用于同济...
五子棋是起源于中国古代的传统黑白棋种之一,是种训练人逻辑思维严密性的游戏。该设计以五子棋游戏业务为背景,设计、开发一套“五子棋游戏”软件。通过该题目的设计过程,可以提高基本编程能力和游戏开发的技巧,...
强化学习是人工智能的一个重要分支,它通过让智能体与环境交互,不断试错并学习最优策略来提升性能。在这个项目中,我们将关注以下几个核心知识点: 1. **强化学习的基本概念**:强化学习的核心在于智能体(Agent)...
QT小游戏--五子棋.zip是一个基于QT框架开发的五子棋游戏项目。QT是一个流行的开源C++图形用户界面应用程序开发框架,它提供了丰富的库和工具,使得开发者可以方便地创建跨平台的应用程序,包括桌面应用、移动应用...
北京理工大学人工智能大作业-五种方式实现人与机械臂的五子棋对弈+源代码+文档说明 - 小白不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,...
- **棋局评估函数**:用于评估当前棋局对每个玩家的有利程度,是人工智能决策的基础。 - **胜负判断算法**:检查棋盘上是否有连续的五个相同颜色的棋子,形成横向、纵向或对角线的连线。 4. **用户交互**:C语言...
这个项目的名称是“五子棋AI人工智能(网页版)”,它结合了编程语言HTML以及AI算法,为用户提供了一个与智能计算机对战的平台。下面将详细介绍其中涉及的关键知识点。 首先,我们要理解的是博弈树的概念。博弈树是...