五子棋

[size=small;] 做了那么久的五子棋,到今天终于可以差不多结束啦!虽然说我做的有一点点小问题,貌似还是比较大的,从个人的角度来说,我满意就行啦。在判断那什么加权值的上面有一点问题,所以电脑在自己下棋的时候把握不了自己真正要下的地方,有的时候看上去很傻。还有加了人机对战之后,判断输赢变得比较迟钝或者说是有的时候赢了它不会判断。有了这些“小小”的误差后,还是需要时间调试,不能说自己完全完成了五子棋。就像孙中山先生说的“革命尚未成功,同志仍需努力”。所以还是需要后来的调式啊,还有貌似很漫长的路要走的。说实话,我收回我先前说的“我比较满意”。[/size]

[size=small;]有些小问题还需要调试。下面是没有调式有些问题的代码,如下:[/size]

package cn.hsm.java;


import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class FiveChessTest extends JFrame
{
public static void main(String[] args)
{
FiveChessTest fc = new FiveChessTest();
fc.showUI();
}

private int[][] location = new int[Name.HEIGHT + 1 ][Name.WIDTH];
private Graphics g;

public void showUI()
{
this.setTitle("hsm的五子棋···");
this.setSize(900, 750);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
this.setVisible(true);

Graphics g = getGraphics();
MouseListenerImpl mouseListener = new MouseListenerImpl(g ,location);
this.addMouseListener(mouseListener);
}
/*
* 重写paint函数
*/
public void paint(Graphics g)
{
super.paint(g);

//画棋盘的横线
for(int i = 0; i <= Name.HEIGHT; i++) {
g.drawLine(Name.X0, Name.Y0+ Name.CELL_SIZE *i, Name.X0+Name.WIDTH*Name.CELL_SIZE , Name.Y0+ Name.CELL_SIZE *i);
}
//画棋盘的纵线
for(int j = 0; j <= Name.WIDTH; j++) {
g.drawLine(Name.X0 + Name.CELL_SIZE *j , Name.Y0, Name.X0 + Name.CELL_SIZE *j, Name.Y0 +Name.HEIGHT*Name.CELL_SIZE);
}
//绘制图片
//g.drawImage(back.getImage(), Name.X0,Name.Y0,Name.X0+Name.WIDTH*Name.CELL_SIZE , Name.Y0 +Name.HEIGHT*Name.CELL_SIZE, null );
int x0;
int y0;
//重绘棋子
for (int a = 0; a < Name.WIDTH; a++)
{
for (int b = 0; b < Name.HEIGHT; b++)
{
if(location[a][b] ==-1)
{
g.setColor(Color.WHITE);
x0 = Name.X0 + a * Name.CELL_SIZE;
y0 = Name.Y0 + b * Name.CELL_SIZE;
g.fillOval(x0 - Name.CHESS_SIZE/2, y0 - Name.CHESS_SIZE/2, Name.CHESS_SIZE, Name.CHESS_SIZE);
}
else if(location[a][b] ==1)
{
g.setColor(Color.BLACK);
x0 = Name.X0 + a * Name.CELL_SIZE;
y0 = Name.Y0 + b * Name.CELL_SIZE;
g.fillOval(x0 - Name.CHESS_SIZE/2, y0 - Name.CHESS_SIZE/2, Name.CHESS_SIZE, Name.CHESS_SIZE);
}
}
}
}

//定义获得图片路径的方法
// private String imageBack = "images/1.jpg";
private ImageIcon back = new ImageIcon("images/1.jpg");

}


--------------------------------------------------------------

package cn.hsm.java;

import java.awt.Color;
import java.awt.Dialog;
import java.awt.Graphics;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class MouseListenerImpl extends MouseAdapter
{
private Graphics g;
private int x1,y1;
private int choose = 1;
private int[][] location;
public MouseListenerImpl(Graphics g ,int[][] location)
{
this.g =g;
this.location = location;
}

public void mouseReleased(MouseEvent e)
{
//鼠标点击的位置
x1 = e.getX();
y1 = e.getY();
int x0; //棋盘交叉点的x坐标
int y0; //棋盘交叉点的y坐标
for (int a = 0; a < Name.WIDTH; a++)
{
for (int b = 0; b < Name.HEIGHT; b++)
{
x0 = Name.X0 + a * Name.CELL_SIZE;
y0 = Name.Y0 + b * Name.CELL_SIZE;
if((Math.abs(x1 - x0) < Name.CELL_SIZE / 2) && (Math.abs(y1 - y0) < Name.CELL_SIZE / 2) &&location[a][b] == 0)
{
//画出棋子,且分出颜色:1为黑色,-1为白色;判断当前画的棋子颜色,并将其存储到二维数组中

g.setColor(Color.BLACK);
choose = 1;
g.fillOval(x0 - Name.CHESS_SIZE/2, y0 - Name.CHESS_SIZE/2, Name.CHESS_SIZE, Name.CHESS_SIZE);
win01Ways(a, b, choose);
win02Ways(a, b, choose);
win03Ways(a, b, choose);
location[a][b] = 1;

robertchoose(a,b);
return;
/* if (choose == -1)
{
g.setColor(Color.WHITE);
g.fillOval(x0 - Name.CHESS_SIZE/2, y0 - Name.CHESS_SIZE/2, Name.CHESS_SIZE, Name.CHESS_SIZE);
location[a][b] = -1;
win01Ways(a, b, choose);
win02Ways(a, b, choose);
win03Ways(a, b, choose);
choose = 1 ;
System.out.println("white");
}
*/
}
}
}
}


/**
* 机器选择最佳位置下棋
* @param a
* @param b
*/
private void robertchoose(int a,int b)
{
int x0; //棋盘交叉点的x坐标
int y0; //棋盘交叉点的y坐标
int m;
int n ;

/* 计算可以下棋的位置的权值 */
for( m = 0;m < Name.HEIGHT;m++)
{
for( n =0;n < Name.WIDTH;n++)
{
if(location[m][n] == 0 )
{
theBestChooseBlack();
theBestChooseWhite();
}
}
}
/* 判断最大值 */
roberDawn();

for( m = 0;m < Name.HEIGHT;m++)
{
boolean next = false;
for( n =0;n < Name.WIDTH;n++)
{
if(location[m][n] == 0 )
{
theBestChooseBlack();
theBestChooseWhite();
next = true;
break;
}
}
if(next)
{
break;
}
}
}

//判断黑色最大值,确定机器人下棋子的位置
private void theBestChooseBlack()
{
for(int x = 0;x<Name.HEIGHT;x++)
{
for(int y = 0;y<Name.WIDTH;y++)
{
int count = 0;
//横向的黑色棋子
if(location[x][y] == 0)
{
for(int i = 1; (x-i)>=0&&i < 5; i++)
{
if(location[x-i][y] == 1)
{
count++;
}else
{
break;
}
}
for(int j = 1; ((x+j)>=Name.CELL_SIZE*Name.WIDTH)&&j < 5; j++)
{
if(location[x+j][y] == 1)
{
count++;
}else
{
break;
}
}
choose = 1;
}

if(count ==4)
{
Name.robertChoose1[x][y] += 22;
}
if(count ==3)
{
Name.robertChoose1[x][y] += 16;
}
if(count ==2)
{
Name.robertChoose1[x][y] += 3;
}
if(count ==1)
{
Name.robertChoose1[x][y] += 1;
}
count = 0;
//纵向的黑色棋子
if(location[x][y] == 0)
{
for(int i = 1; (y-i)>=0&&i < 5; i++)
{
if(location[x][y-i] == 1)
{
count++;
}else
{
break;
}
}
for(int j = 1; ((y+j)>=Name.CELL_SIZE*Name.HEIGHT)&&j < 5; j++)
{
if(location[x][y+j] == 1)
{
count++;
}else
{
break;
}
}
choose = 1;
}
if(count ==4)
{
Name.robertChoose1[x][y] += 22;
}
if(count ==3)
{
Name.robertChoose1[x][y] += 16;
}
if(count ==2)
{
Name.robertChoose1[x][y] += 3;
}
if(count ==1)
{
Name.robertChoose1[x][y] += 1;
}
//切向的黑色棋子

count = 0;
if(location[x][y] == 0)
{
for(int i = 1; (y-i)>=0&&(x-i)>=0&&i < 5; i++)
{
if(location[x-i][y-i] == 1)
{
count++;
}else
{
break;
}
}
for(int j = 1; ((y+j)>=Name.CELL_SIZE*Name.HEIGHT)&&((x+j)>=Name.CELL_SIZE*Name.WIDTH)&&(x-j)>=0&&j < 5; j++)
{
if(location[x+j][y+j] == 1)
{
count++;
}else
{
break;
}
}
choose = 1;
}
if(count ==4){
Name.robertChoose1[x][y] += 22;
}
if(count ==3){
Name.robertChoose1[x][y] += 16;
}
if(count ==2){
Name.robertChoose1[x][y] += 3;
}
if(count ==1){
Name.robertChoose1[x][y] += 1;
}
}
}
}


//判断白色最大值,确定机器人下棋子的位置
public void theBestChooseWhite()
{
for(int x = 0;x<Name.HEIGHT;x++)
{
for(int y = 0;y<Name.WIDTH;y++)
{
int count = 0;
//横向的白色棋子
if(location[x][y] == 0)
{
for(int i = 1; (x-i)>=0&&i < 5; i++)
{
if(location[x-i][y] == -1)
{
count++;
}else
{
break;
}
}
for(int j = 1; ((x+j)>=Name.CELL_SIZE*Name.WIDTH)&&j < 5; j++)
{
if(location[x+j][y] == -1)
{
count++;
}else
{
break;
}
}
}
if(count ==4){
Name.robertChoose2[x][y] += 35;
}
if(count ==3){
Name.robertChoose2[x][y] += 20;
}
if(count ==2){
Name.robertChoose2[x][y] += 5;
}
if(count ==1){
Name.robertChoose2[x][y] += 1;
}
count = 0;
//纵向的白色棋子
if(location[x][y] == 0)
{
for(int i = 1; (y-i)>=0&&i < 5; i++)
{
if(location[x][y-i] == -1)
{
count++;
}else
{
break;
}
}
for(int j = 1; ((y+j)>=Name.CELL_SIZE*Name.HEIGHT)&&j < 5; j++)
{
if(location[x][y+j] == -1)
{
count++;
}else
{
break;
}
}
}
if(count ==4){
Name.robertChoose2[x][y] += 35;
}
if(count ==3){
Name.robertChoose2[x][y] += 20;
}
if(count ==2){
Name.robertChoose2[x][y] += 5;
}
if(count ==1){
Name.robertChoose2[x][y] += 1;
}
count = 0;
//切向的白色棋子
if(location[x][y] == 0)
{
for(int i = 1; (y-i)>=0&&(x-i)>=0&&i < 5; i++)
{
if(location[x-i][y-i] == -1)
{
count++;
}else
{
break;
}
}
for(int j = 1; ((y+j)>=Name.CELL_SIZE*Name.HEIGHT)&&((x+j)>=Name.CELL_SIZE*Name.WIDTH)&&(x-j)>=0&&j < 5; j++)
{
if(location[x+j][y+j] == -1)
{
count++;
}else
{
break;
}
}
}
if(count ==4){
Name.robertChoose2[x][y] += 35;
}
if(count ==3){
Name.robertChoose2[x][y] += 20;
}
if(count ==2){
Name.robertChoose2[x][y] += 5;
}
if(count ==1){
Name.robertChoose2[x][y] += 1;
}
}
}
}


private void roberDawn() {
int max = -1;
int max_a = 0;
int max_b = 0;
for(int a = 0;a < Name.HEIGHT; a++)
{
for(int b = 0; b< Name.WIDTH; b++)
{
//使机器人下的棋子下在空位上
Name.robertChoose[a][b] = Name.robertChoose1[a][b] + Name.robertChoose2[a][b];
if(Name.robertChoose[max_a][max_b] == 0)
{
if(Name.robertChoose[a][b] > max)
{
max = Name.robertChoose[a][b];
max_a = a;
max_b = b;
}
}
Name.robertChoose[a][b] = 0;
Name.robertChoose1[a][b] = 0;
Name.robertChoose2[a][b] = 0;
}
}
int x0; //棋盘交叉点的x坐标
int y0; //棋盘交叉点的y坐标
x0 = Name.X0 + max_a * Name.CELL_SIZE;
y0 = Name.Y0 + max_b * Name.CELL_SIZE;
g.setColor(Color.WHITE);
if(Name.robertChoose[max_a][max_b] == 0)
{
g.fillOval(x0 - Name.CHESS_SIZE/2, y0 - Name.CHESS_SIZE/2, Name.CHESS_SIZE, Name.CHESS_SIZE);
choose = -1;
win01Ways(max_a, max_b, choose);
win02Ways(max_a, max_b, choose);
win03Ways(max_a, max_b, choose);
}
location[max_a][max_b] =-1;

}


private void win01Ways(int x, int y, int choose)
{
int count = 1;
//判断横向是否连珠
if(choose == 1) {
for(int i = 1; (x-i)>=0&&i < 5; i++)
{
if(location[x-i][y] == 1)
{
count++;
}else
{
break;
}
}
for(int j = 1; ((x+j)>=Name.CELL_SIZE*Name.WIDTH)&&j < 5; j++)
{
if(location[x+j][y] == 1)
{
count++;
}else
{
break;
}
}
}else {
for(int i = 1; (x-i)>=0&&i < 5; i++)
{
if(location[x-i][y] == -1)
{
count++;
}else
{
break;
}
}
for(int j = 1; ((x+j)>=Name.CELL_SIZE*Name.WIDTH)&&j < 5; j++)
{
if(location[x+j][y] == -1)
{
count++;
}else
{
break;
}
}
}
if (count > 4)
{
//System.out.println("有人获胜啦!!");
javax.swing.JOptionPane ip1 = new javax.swing.JOptionPane();
ip1.showMessageDialog(null, "有人获胜了");
}
}

private void win02Ways(int x, int y, int choose)
{
int count = 1;
//判断纵向是否连珠
if(choose == 1) {
for(int i = 1; (y-i)>=0&&i < 5; i++)
{
if(location[x][y-i] == 1)
{
count++;
}else{
break;
}
}
for(int j = 1; ((y+j)>=Name.CELL_SIZE*Name.HEIGHT)&&j < 5; j++)
{
if(location[x][y+j] == 1)
{
count++;
}else{
break;
}
}
}else {
for(int i = 1; (y-i)>=0&&i < 5; i++)
{
if(location[x][y-i] == -1)
{
count++;
}else{
break;
}
}
for(int j = 1; ((y+j)>=Name.CELL_SIZE*Name.HEIGHT)&&j < 5; j++)
{
if(location[x][y+j] == -1)
{
count++;
}else{
break;
}
}
}
if (count > 4)
{
javax.swing.JOptionPane ip2 = new javax.swing.JOptionPane();
ip2.showMessageDialog(null, "有人获胜了");
}
}

private void win03Ways(int x, int y, int choose)
{
int count = 1;
//判断45度向是否连珠
if(choose == 1) {
for(int i = 1; (y-i)>=0&&(x-i)>=0&&i < 5; i++)
{
if(location[x-i][y-i] == 1)
{
count++;
}else{
break;
}
}
for(int j = 1; ((y+j)>=Name.CELL_SIZE*Name.HEIGHT)&&((x+j)>=Name.CELL_SIZE*Name.WIDTH)&&j < 5; j++)
{
if(location[x+j][y+j] == 1)
{
count++;
}else{
break;
}
}
}else {
for(int i = 1; (y-i)>=0&&(x-i)>=0&&i < 5; i++)
{
if(location[x-i][y-i] == -1)
{
count++;
}else{
break;
}
}
for(int j = 1; ((y+j)>=Name.CELL_SIZE*Name.HEIGHT)&&((x+j)>=Name.CELL_SIZE*Name.WIDTH)&&(x-j)>=0&&j < 5; j++)
{
if(location[x+j][y+j] == -1)
{
count++;
}else{
break;
}
}
}
if (count > 4)
{
javax.swing.JOptionPane ip3 = new javax.swing.JOptionPane();
ip3.showMessageDialog(null, "有人获胜了");
// JDialog dialog = new JDialog();
// dialog.setSize(200, 100);
// dialog.setTitle("有人获胜啦");
// dialog.setLocationRelativeTo(null);
// dialog.add(new JLabel("有人获胜啦!!"));
// dialog.setVisible(true);
}
}
}



--------------------------------------------------------------------
我刚刚退出来一看,既然有580行,哈哈,好有成就感。
--------------------------------------------------------------------

package cn.hsm.java;

public class Name
{
public static int X0 = 50; //横坐标的偏移量
public static int Y0 = 50; //纵坐标的偏移量
public static int CELL_SIZE= 50; // 方格的大小
public static int HEIGHT = 14; //高的数目
public static int WIDTH = 14; //宽的数目
public static int CHESS_SIZE = 40; //棋子的大小
public static int[][] robertChoose1= new int[HEIGHT][WIDTH];//定义一个看机器人下黑棋子的权值
public static int[][] robertChoose2 = new int[HEIGHT][WIDTH];//定义一个看机器人下白棋子的权值
public static int[][] robertChoose = new int[HEIGHT][WIDTH];//定义一个看机器人下棋子的权值
}


package cn.hsm.java;   

import java.awt.Color;
import java.awt.Dialog;
import java.awt.Graphics;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class MouseListenerImpl extends MouseAdapter
{
private Graphics g;
private int x1,y1;
private int choose = 1;
private int[][] location;
private boolean play = false;
public MouseListenerImpl(Graphics g ,int[][] location)
{
this.g =g;
this.location = location;
}

public void mouseReleased(MouseEvent e)
{
if(play) {
return;
}
//鼠标点击的位置
x1 = e.getX();
y1 = e.getY();
int x0; //棋盘交叉点的x坐标
int y0; //棋盘交叉点的y坐标
for (int a = 0; a < Name.WIDTH; a++)
{
for (int b = 0; b < Name.HEIGHT; b++)
{
x0 = Name.X0 + a * Name.CELL_SIZE;
y0 = Name.Y0 + b * Name.CELL_SIZE;
if((Math.abs(x1 - x0) < Name.CELL_SIZE / 2) && (Math.abs(y1 - y0) < Name.CELL_SIZE / 2) &&location[a][b] == 0)
{
//画出棋子,且分出颜色:1为黑色,-1为白色;判断当前画的棋子颜色,并将其存储到二维数组中

g.setColor(Color.BLACK);
g.fillOval(x0 - Name.CHESS_SIZE/2, y0 - Name.CHESS_SIZE/2, Name.CHESS_SIZE, Name.CHESS_SIZE);
choose = 1;
win01Ways(a, b, choose);
win02Ways(a, b, choose);
win03Ways(a, b, choose);
location[a][b] = 1;
robertchoose(a,b);
return;
/* if (choose == -1)
{
g.setColor(Color.WHITE);
g.fillOval(x0 - Name.CHESS_SIZE/2, y0 - Name.CHESS_SIZE/2, Name.CHESS_SIZE, Name.CHESS_SIZE);
location[a][b] = -1;
win01Ways(a, b, choose);
win02Ways(a, b, choose);
win03Ways(a, b, choose);
choose = 1 ;
System.out.println("white");
}
*/
}
}
}
}


/**
* 机器选择最佳位置下棋
* @param a
* @param b
*/
private void robertchoose(int a,int b)
{
int x0; //棋盘交叉点的x坐标
int y0; //棋盘交叉点的y坐标
int m;
int n ;

/* 计算可以下棋的位置的权值 */
for( m = 0;m < Name.HEIGHT;m++)
{
for( n =0;n < Name.WIDTH;n++)
{
if(location[m][n] == 0 )
{
theBestChooseBlack();
theBestChooseWhite();
}
}
}
/* 判断最大值 */
roberDawn();

for( m = 0;m < Name.HEIGHT;m++)
{
boolean next = false;
for( n =0;n < Name.WIDTH;n++)
{
if(location[m][n] == 0 )
{
theBestChooseBlack();
theBestChooseWhite();
next = true;
break;
}
}
if(next)
{
break;
}
}
}

//判断黑色最大值,确定机器人下棋子的位置
private void theBestChooseBlack()
{
for(int x = 0;x<Name.HEIGHT;x++)
{
for(int y = 0;y<Name.WIDTH;y++)
{
int count = 0;
//横向的黑色棋子
if(location[x][y] == 0)
{
for(int i = 1; (x-i)>=0&&i < 5; i++)
{
if(location[x-i][y] == 1)
{
count++;
}else
{
break;
}
}
for(int j = 1; ((x+j)>=Name.CELL_SIZE*Name.WIDTH)&&j < 5; j++)
{
if(location[x+j][y] == 1)
{
count++;
}else
{
break;
}
}
choose = 1;
}

if(count ==4)
{
Name.robertChoose1[x][y] += 22;
}
if(count ==3)
{
Name.robertChoose1[x][y] += 16;
}
if(count ==2)
{
Name.robertChoose1[x][y] += 3;
}
if(count ==1)
{
Name.robertChoose1[x][y] += 1;
}
count = 0;
//纵向的黑色棋子
if(location[x][y] == 0)
{
for(int i = 1; (y-i)>=0&&i < 5; i++)
{
if(location[x][y-i] == 1)
{
count++;
}else
{
break;
}
}
for(int j = 1; ((y+j)>=Name.CELL_SIZE*Name.HEIGHT)&&j < 5; j++)
{
if(location[x][y+j] == 1)
{
count++;
}else
{
break;
}
}
choose = 1;
}
if(count ==4)
{
Name.robertChoose1[x][y] += 22;
}
if(count ==3)
{
Name.robertChoose1[x][y] += 16;
}
if(count ==2)
{
Name.robertChoose1[x][y] += 3;
}
if(count ==1)
{
Name.robertChoose1[x][y] += 1;
}
//切向的黑色棋子

count = 0;
if(location[x][y] == 0)
{
for(int i = 1; (y-i)>=0&&(x-i)>=0&&i < 5; i++)
{
if(location[x-i][y-i] == 1)
{
count++;
}else
{
break;
}
}
for(int j = 1; ((y+j)>=Name.CELL_SIZE*Name.HEIGHT)&&((x+j)>=Name.CELL_SIZE*Name.WIDTH)&&(x-j)>=0&&j < 5; j++)
{
if(location[x+j][y+j] == 1)
{
count++;
}else
{
break;
}
}
choose = 1;
}
if(count ==4){
Name.robertChoose1[x][y] += 22;
}
if(count ==3){
Name.robertChoose1[x][y] += 16;
}
if(count ==2){
Name.robertChoose1[x][y] += 3;
}
if(count ==1){
Name.robertChoose1[x][y] += 1;
}
}
}
}


//判断白色最大值,确定机器人下棋子的位置
public void theBestChooseWhite()
{
for(int x = 0;x<Name.HEIGHT;x++)
{
for(int y = 0;y<Name.WIDTH;y++)
{
int count = 0;
//横向的白色棋子
if(location[x][y] == 0)
{
for(int i = 1; (x-i)>=0&&i < 5; i++)
{
if(location[x-i][y] == -1)
{
count++;
}else
{
break;
}
}
for(int j = 1; ((x+j)>=Name.CELL_SIZE*Name.WIDTH)&&j < 5; j++)
{
if(location[x+j][y] == -1)
{
count++;
}else
{
break;
}
}
}
if(count ==4){
Name.robertChoose2[x][y] += 35;
}
if(count ==3){
Name.robertChoose2[x][y] += 20;
}
if(count ==2){
Name.robertChoose2[x][y] += 5;
}
if(count ==1){
Name.robertChoose2[x][y] += 1;
}
count = 0;
//纵向的白色棋子
if(location[x][y] == 0)
{
for(int i = 1; (y-i)>=0&&i < 5; i++)
{
if(location[x][y-i] == -1)
{
count++;
}else
{
break;
}
}
for(int j = 1; ((y+j)>=Name.CELL_SIZE*Name.HEIGHT)&&j < 5; j++)
{
if(location[x][y+j] == -1)
{
count++;
}else
{
break;
}
}
}
if(count ==4){
Name.robertChoose2[x][y] += 35;
}
if(count ==3){
Name.robertChoose2[x][y] += 20;
}
if(count ==2){
Name.robertChoose2[x][y] += 5;
}
if(count ==1){
Name.robertChoose2[x][y] += 1;
}
count = 0;
//切向的白色棋子
if(location[x][y] == 0)
{
for(int i = 1; (y-i)>=0&&(x-i)>=0&&i < 5; i++)
{
if(location[x-i][y-i] == -1)
{
count++;
}else
{
break;
}
}
for(int j = 1; ((y+j)>=Name.CELL_SIZE*Name.HEIGHT)&&((x+j)>=Name.CELL_SIZE*Name.WIDTH)&&(x-j)>=0&&j < 5; j++)
{
if(location[x+j][y+j] == -1)
{
count++;
}else
{
break;
}
}
}
if(count ==4){
Name.robertChoose2[x][y] += 35;
}
if(count ==3){
Name.robertChoose2[x][y] += 20;
}
if(count ==2){
Name.robertChoose2[x][y] += 5;
}
if(count ==1){
Name.robertChoose2[x][y] += 1;
}
}
}
}


private void roberDawn() {
int max = -1;
int max_a = 0;
int max_b = 0;
for(int a = 0;a < Name.HEIGHT; a++)
{
for(int b = 0; b< Name.WIDTH; b++)
{
//使机器人下的棋子下在空位上
Name.robertChoose[a][b] = Name.robertChoose1[a][b] + Name.robertChoose2[a][b];
if(Name.robertChoose[max_a][max_b] == 0)
{
if(Name.robertChoose[a][b] > max)
{
max = Name.robertChoose[a][b];
max_a = a;
max_b = b;
}
}
Name.robertChoose[a][b] = 0;
Name.robertChoose1[a][b] = 0;
Name.robertChoose2[a][b] = 0;
}
}
int x0; //棋盘交叉点的x坐标
int y0; //棋盘交叉点的y坐标
x0 = Name.X0 + max_a * Name.CELL_SIZE;
y0 = Name.Y0 + max_b * Name.CELL_SIZE;
g.setColor(Color.WHITE);
if(Name.robertChoose[max_a][max_b] == 0)
{
g.fillOval(x0 - Name.CHESS_SIZE/2, y0 - Name.CHESS_SIZE/2, Name.CHESS_SIZE, Name.CHESS_SIZE);
choose = -1;
win01Ways(max_a, max_b, choose);
win02Ways(max_a, max_b, choose);
win03Ways(max_a, max_b, choose);
}
location[max_a][max_b] =-1;

}


private void win01Ways(int x, int y, int choose)
{
int count = 1;
//判断横向是否连珠
if(choose == 1)
{
System.out.println("下黑子了...");
for(int i = 1; (x-i)>=0&&i < 5; i++)
{
if(location[x-i][y] == 1)
{
count++;
}else
{
// System.out.println("下黑子了..."+count);
break;
}
}
for(int j = 1; ((x+j)<=Name.CELL_SIZE*Name.WIDTH)&&j < 5; j++)
{
if(location[x+j][y] == 1)
{
count++;
}else
{
System.out.println("下黑子了..."+count);
break;
}
}
}else {
for(int i = 1; (x-i)>=0&&i < 5; i++)
{
if(location[x-i][y] == -1)
{
count++;
}else
{
break;
}
}
for(int j = 1; ((x+j)<=Name.CELL_SIZE*Name.WIDTH)&&j < 5; j++)
{
if(location[x+j][y] == -1)
{
count++;
}else
{
break;
}
}
}
if (count > 4)
{
System.out.println("有人获胜啦!!:"+choose);
javax.swing.JOptionPane ip1 = new javax.swing.JOptionPane();
ip1.showMessageDialog(null, "有人获胜了");
play =true;
}
}

private void win02Ways(int x, int y, int choose)
{
int count = 1;
//判断纵向是否连珠
if(choose == 1)
{
for(int i = 1; (y-i)>=0&&i < 5; i++)
{
if(location[x][y-i] == 1)
{
count++;
}else{
break;
}
}
for(int j = 1; ((y+j)<=Name.CELL_SIZE*Name.HEIGHT)&&j < 5; j++)
{
if(location[x][y+j] == 1)
{
count++;
}else{
break;
}
}
}else {
for(int i = 1; (y-i)>=0&&i < 5; i++)
{
if(location[x][y-i] == -1)
{
count++;
}else{
break;
}
}
for(int j = 1; ((y+j)<=Name.CELL_SIZE*Name.HEIGHT)&&j < 5; j++)
{
if(location[x][y+j] == -1)
{
count++;
}else{
break;
}
}
}
if (count > 4)
{
javax.swing.JOptionPane ip2 = new javax.swing.JOptionPane();
ip2.showMessageDialog(null, "有人获胜了");
play =true;
}
}

private void win03Ways(int x, int y, int choose)
{
int count = 1;
//判断45度向是否连珠
if(choose == 1) {
for(int i = 1; (y-i)>=0&&(x-i)>=0&&i < 5; i++)
{
if(location[x-i][y-i] == 1)
{
count++;
}else{
break;
}
}
for(int j = 1; ((y+j)<=Name.CELL_SIZE*Name.HEIGHT)&&((x+j)>=Name.CELL_SIZE*Name.WIDTH)&&j < 5; j++)
{
if(location[x+j][y+j] == 1)
{
count++;
}else{
break;
}
}
}else {
for(int i = 1; (y-i)>=0&&(x-i)>=0&&i < 5; i++)
{
if(location[x-i][y-i] == -1)
{
count++;
}else{
break;
}
}
for(int j = 1; ((y+j)<=Name.CELL_SIZE*Name.HEIGHT)&&((x+j)>=Name.CELL_SIZE*Name.WIDTH)&&(x-j)>=0&&j < 5; j++)
{
if(location[x+j][y+j] == -1)
{
count++;
}else{
break;
}
}
}
if (count > 4)
{
javax.swing.JOptionPane ip3 = new javax.swing.JOptionPane();
ip3.showMessageDialog(null, "有人获胜了");
play =true;
}
}
}
本项目构建于RASA开源架构之上,旨在实现一个具备多模态交互能力的智能对话系统。该系统的核心模块涵盖自然语言理解、语音转文本处理以及动态对话流程控制三个主要方面。 在自然语言理解层面,研究重点集中于增强连续对话中的用户目标判定效能,并运用深度神经网络技术提升关键信息提取的精确度。目标判定旨在解析用户话语背后的真实需求,从而生成恰当的反馈;信息提取则专注于从语音输入中析出具有特定意义的要素,例如个体名称、空间位置或时间节点等具体参数。深度神经网络的应用显著优化了这些功能的实现效果,相比经典算法,其能够解析更为复杂的语言结构,展现出更优的识别精度与更强的适应性。通过分层特征学习机制,这类模型可深入捕捉语言数据中隐含的语义关联。 语音转文本处理模块承担将音频信号转化为结构化文本的关键任务。该技术的持续演进大幅提高了人机语音交互的自然度与流畅性,使语音界面日益成为高效便捷的沟通渠道。 动态对话流程控制系统负责维持交互过程的连贯性与逻辑性,包括话轮转换、上下文关联维护以及基于情境的决策生成。该系统需具备处理各类非常规输入的能力,例如用户使用非规范表达或对系统指引产生歧义的情况。 本系统适用于多种实际应用场景,如客户服务支持、个性化事务协助及智能教学辅导等。通过准确识别用户需求并提供对应信息或操作响应,系统能够创造连贯顺畅的交互体验。借助深度学习的自适应特性,系统还可持续优化语言模式理解能力,逐步完善对新兴表达方式与用户偏好的适应机制。 在技术实施方面,RASA框架为系统开发提供了基础支撑。该框架专为构建对话式人工智能应用而设计,支持多语言环境并拥有活跃的技术社区。利用其内置工具集,开发者可高效实现复杂的对话逻辑设计与部署流程。 配套资料可能包含补充学习文档、实例分析报告或实践指导手册,有助于使用者深入掌握系统原理与应用方法。技术文档则详细说明了系统的安装步骤、参数配置及操作流程,确保用户能够顺利完成系统集成工作。项目主体代码及说明文件均存放于指定目录中,构成完整的解决方案体系。 总体而言,本项目整合了自然语言理解、语音信号处理与深度学习技术,致力于打造能够进行复杂对话管理、精准需求解析与高效信息提取的智能语音交互平台。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值