文档库 最新最全的文档下载
当前位置:文档库 › 具有难度等级的五子棋

具有难度等级的五子棋

具有难度等级的五子棋
具有难度等级的五子棋

//Java编程:五子棋游戏源代码

package FiveChess;

import java.awt.*;

import java.awt.event.*;

//import java.applet.*;

import javax.swing.*;

//import java.io.PrintStream;

//import javax.swing.JComponent;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

/*

*main方法创建了ChessFrame类的一个实例对象(cf),

*并启动屏幕显示显示该实例对象。

**/

public class FiveChessAppletDemo {

@SuppressWarnings("deprecation")

public static void main(String args[]){

ChessFrame cf = new ChessFrame();

cf.show();

}

}

/*

*类ChessFrame主要功能是创建五子棋游戏主窗体和菜单

**/

class ChessFrame extends JFrame implements ActionListener {

/**

*

*/

private static final long serialVersionUID = 1L;

private String[] strsize={"20x15","30x20","40x30"};

private String[] strmode={"人机对弈","人人对弈"};

private String[] strmode1={"初级","高级"};

public static boolean iscomputer=true,checkcomputer=true,isAdvanced=false; private int width=20,height=15;

private ChessModel cm;

private MainPanel mp;

//构造五子棋游戏的主窗体

public ChessFrame() {

this.setTitle("五子棋游戏");

cm=new ChessModel(1);

mp=new MainPanel(cm);

Container con=this.getContentPane();

con.add(mp,"Center");

this.setResizable(false);

this.addWindowListener(new ChessWindowEvent());

MapSize(20,15);

JMenuBar mbar = new JMenuBar();

this.setJMenuBar(mbar);

JMenu gameMenu = new JMenu("游戏");

mbar.add(makeMenu(gameMenu, new Object[] {

"开局", "棋盘","模式", null, "退出"

}, this));

JMenu lookMenu =new JMenu("视图");

mbar.add(makeMenu(lookMenu,new Object[] {

"Metal","Motif","Windows"

},this));

JMenu setMenu = new JMenu("设置");

mbar.add(makeMenu(setMenu, new Object[] {

"电脑先下","人先下"

}, this));

JMenu helpMenu = new JMenu("帮助");

mbar.add(makeMenu(helpMenu, new Object[] {

"关于"

}, this));

}

//构造五子棋游戏的主菜单

public JMenu makeMenu(Object parent, Object items[], Object target){ JMenu m = null;

if(parent instanceof JMenu)

m = (JMenu)parent;

else if(parent instanceof String)

m = new JMenu((String)parent);

else

return null;

for(int i = 0; i < items.length; i++)

if(items[i] == null)

m.addSeparator();

else if(items[i] == "棋盘"){

JMenu jm = new JMenu("棋盘");

ButtonGroup group=new ButtonGroup();

JRadioButtonMenuItem rmenu;

for (int j=0;j

rmenu=makeRadioButtonMenuItem(strsize[j],target);

if (j==0)

rmenu.setSelected(true);

jm.add(rmenu);

group.add(rmenu);

}

m.add(jm);

}else if(items[i] == "模式"){

JMenu jm = new JMenu("模式");

ButtonGroup group=new ButtonGroup();

JRadioButtonMenuItem rmenu;

for (int h=0;h

rmenu=makeRadioButtonMenuItem(strmode[h],target);

if(h==0)

rmenu.setSelected(true);

jm.add(rmenu);

group.add(rmenu);

}

m.add(jm);

}else

m.add(makeMenuItem(items[i], target));

return m;

}

//构造五子棋游戏的菜单项

public JMenuItem makeMenuItem(Object item, Object target){ JMenuItem r = null;

if(item instanceof String)

r = new JMenuItem((String)item);

else if(item instanceof JMenuItem)

r = (JMenuItem)item;

else

return null;

if(target instanceof ActionListener)

r.addActionListener((ActionListener)target);

return r;

}

//构造五子棋游戏的单选按钮式菜单项

public JRadioButtonMenuItem makeRadioButtonMenuItem( Object item, Object target){

JRadioButtonMenuItem r = null;

if(item instanceof String)

r = new JRadioButtonMenuItem((String)item);

else if(item instanceof JRadioButtonMenuItem)

r = (JRadioButtonMenuItem)item;

else

return null;

if(target instanceof ActionListener)

r.addActionListener((ActionListener)target);

return r;

}

public void MapSize(int w,int h){

setSize(w * 20+50 , h * 20+100 );

if(ChessFrame.checkcomputer==true)

ChessFrame.iscomputer=true;

else

ChessFrame.iscomputer=false;

mp.setModel(cm);

mp.repaint();

}

public boolean getiscomputer(){

return ChessFrame.iscomputer;

}

public void restart(){

int modeChess = cm.getModeChess();

MainPanel.lostorwin=true;

if(modeChess <= 3 && modeChess >= 1){

cm = new ChessModel(modeChess);

MapSize(cm.getWidth(),cm.getHeight());

}else{

System.out.println("\u81EA\u5B9A\u4E49");

}

}

public void actionPerformed(ActionEvent e){

String arg=e.getActionCommand();

try{

if (arg.equals("Windows"))

UIManager.setLookAndFeel(

"com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

else if(arg.equals("Motif"))

UIManager.setLookAndFeel(

"com.sun.java.swing.plaf.motif.MotifLookAndFeel");

else

UIManager.setLookAndFeel(

"javax.swing.plaf.metal.MetalLookAndFeel" );

}catch(Exception ee){}

if(arg.equals("20x15")){

this.width=20;

this.height=15;

cm=new ChessModel(1);

MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this);

}

if(arg.equals("30x20")){

this.width=30;

this.height=20;

cm=new ChessModel(2);

MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this);

}

if(arg.equals("40x30")){

this.width=40;

this.height=30;

cm=new ChessModel(3);

MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this);

}

if(arg.equals("人机对弈")){

Object set = JOptionPane.showInputDialog(null, "选择难度等级","setting...",

JOptionPane.QUESTION_MESSAGE,null,

strmode1,strmode1[0]);

if(set.toString().equals("高级")){

ChessFrame.isAdvanced = true;

}

else

ChessFrame.isAdvanced = false; ChessFrame.checkcomputer=true; ChessFrame.iscomputer=true;

cm=new ChessModel(cm.getModeChess()); MapSize(cm.getWidth(),cm.getHeight()); SwingUtilities.updateComponentTreeUI(this);

}

if(arg.equals("人人对弈")){

ChessFrame.checkcomputer=false; ChessFrame.iscomputer=false;

cm=new ChessModel(cm.getModeChess()); MapSize(cm.getWidth(),cm.getHeight());

}

if(arg.equals("开局")){

restart();

}

if(arg.equals("电脑先下"))

{

//this.iscompfirst=false;

cm.isOdd=false;

cm.play(this.width/2,this.height/2);

mp.repaint();

}

/*if(arg.equals("人先下"))

{

this.iscompfirst=false;

}*/

if(arg.equals("关于"))

JOptionPane.showMessageDialog(this, "五子棋游戏测试版本", "关于", 0);

if(arg.equals("退出"))

System.exit(0);

}

}

/*

*类ChessModel实现了整个五子棋程序算法的核心

*/

class ChessModel {

//棋盘的宽度、高度、棋盘的模式(如20×15)

private int width,height,modeChess;

//棋盘方格的横向、纵向坐标

private int x=0,y=0;

//棋盘方格的横向、纵向坐标所对应的棋子颜色,

//数组arrMapShow只有3个值:1,2,3,-5,

//其中1代表该棋盘方格上下的棋子为黑子,

//2代表该棋盘方格上下的棋子为白子,

//3代表为该棋盘方格上没有棋子,

//-5代表该棋盘方格不能够下棋子

private int[][] arrMapShow;

//交换棋手的标识,棋盘方格上是否有棋子的标识符

private final int O2O = 50; //黑白白空权值50 private final int O2 = 100; //空白白空权值100 private final int O3O = 500; //黑白白白空权值50 private final int O3 = 1000; //空白白白空权值1000 private final int O4O = 5000; //黑白白白白空权值5000 private final int O4 = 10000; //空白白白白空权值10000

private final int O5 = 100000; //白白白白白权值100000 public boolean isOdd,isExist;

public ChessModel() {}

//该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘

public ChessModel(int modeChess){

this.isOdd=true;

if(modeChess == 1){

PanelInit(20, 15, modeChess);

}

if(modeChess == 2){

PanelInit(30, 20, modeChess);

}

if(modeChess == 3){

PanelInit(40, 30, modeChess);

}

}

//按照棋盘模式构建棋盘大小

private void PanelInit(int width, int height, int modeChess){

this.width = width;

this.height = height;

this.modeChess = modeChess;

arrMapShow = new int[width+2][height+2];

for(int i = 0; i <= width; i++){

for(int j = 0; j <= height; j++){

arrMapShow[i][j] = -5;

}

}

}

//获取是否交换棋手的标识符

public boolean getisOdd(){

return this.isOdd;

}

//设置交换棋手的标识符

public void setisOdd(boolean isodd){

if(isodd)

this.isOdd=true;

else

this.isOdd=false;

}

//获取某棋盘方格是否有棋子的标识值

public boolean getisExist(){

return this.isExist;

}

//获取棋盘宽度

public int getWidth(){

return this.width;

}

//获取棋盘高度

public int getHeight(){

return this.height;

}

//获取棋盘模式

public int getModeChess(){

return this.modeChess;

}

//获取棋盘方格上棋子的信息

public int[][] getarrMapShow(){

return arrMapShow;

}

//判断下子的横向、纵向坐标是否越界

private boolean badxy(int x, int y){

if(x >= width+20 || x < 0)

return true;

return (y >= height+20|| y<0);

}

//计算棋盘上某一方格上八个方向棋子的最大值,

//这八个方向分别是:左、右、上、下、左上、左下、右上、右下public boolean chessExist(int i,int j){

if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2)

return true;

return false;

}

//判断该坐标位置是否可下棋子

public void readyplay(int x,int y){

if(badxy(x,y))

return;

if (chessExist(x,y))

return;

this.arrMapShow[x][y]=3;

}

//在该坐标位置下棋子

public void play(int x,int y){

if(badxy(x,y))

return;

if(chessExist(x,y)){

this.isExist=true;

return;

}else

this.isExist=false;

if(getisOdd()){

setisOdd(false);

this.arrMapShow[x][y]=1;

}else{

setisOdd(true);

this.arrMapShow[x][y]=2;

}

}

//计算机走棋

/*

*说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数,

*最后得出棋子数最大值的坐标,下子

**/

public void computerDo(int width,int height){//初级玩法,这是利用穷举法判断下棋的位置的int max_black,max_white,max_temp,max=0;

setisOdd(true);

// System.out.println("计算机走棋...");

for(int i = 0; i <= width; i++){

for(int j = 0; j <= height; j++){

if(!chessExist(i,j)){//算法判断是否下子

max_white=checkMax(i,j,2);//判断白子的最大值

max_black=checkMax(i,j,1);//判断黑子的最大值

max_temp=Math.max(max_white,max_black);

if(max_temp>max){

max=max_temp;

this.x=i;

this.y=j;

}

}

}

}

setX(this.x);

setY(this.y);

this.arrMapShow[this.x][this.y]=2;

}

public void computerAdvanced(int width,int height)//高级玩法,采用评分规则(每种状况赋不同的权值)

{

int qheigh=0;//存储最大权值

int qhere;

setisOdd(true);

for(int i = 0;i <= width;i++)

for(int j = 0;j<=height;j++)

if(!chessExist(i,j))

{//算法判断是否下子

if((qhere = getQuan(i,j)) > qheigh)

{

qheigh=qhere;

this.x=i;

this.y=j;

}

}

setX(this.x);

setY(this.y);

this.arrMapShow[this.x][this.y] = 2;

}

private int getQuan(int i,int j)//记录当前假定的落子点

//求当前位置的权值

{

int q=0;

q += getQuan0(i,j);

q += getQuan90(i,j);

q += getQuan135(i,j);

q += getQuan45(i,j);

return q;

}

private int getQuan0(int i,int j)

//水平权值

{

int samechessNumS = 0;//相同棋子的个数

int samechessNumF = 0;

int blankNumS = 0;

int blankNumF = 0;

int q = 0,qS = 0,qF = 0;

int [][]ij0 = new int[2][2];

ij0[0][1] = i;

ij0[0][0] = i;

ij0[1][1] = j;

ij0[1][0] = j;

samechessNumS=getsamechessNum0(ij0,2); //得到白子数目

if(ij0[1][0] >= 0)

{

if(!chessExist(ij0[0][0],ij0[1][0]))

{

blankNumS++;

}

}

if(ij0[1][1]

{

if(!chessExist(ij0[0][1],ij0[1][1]))

{

blankNumS++;

}

}

qS=getQuanpart(samechessNumS,blankNumS); //得到速胜权值

ij0[0][1] = i;

ij0[0][0] = i;

ij0[1][1] = j;

ij0[1][0] = j;

samechessNumF=getsamechessNum0(ij0,1); //得到黑子数目

if(ij0[1][0] >= 0)

{

if(!chessExist(ij0[0][0],ij0[1][0]))

{

blankNumF++;

}

}

if(ij0[1][1]

{

if(!chessExist(ij0[0][1],ij0[1][1]))

{

blankNumF++;

}

}

qF=getQuanpart(samechessNumF,blankNumF);

//得到堵敌权值

q=qS+qF;

return q;

}

private int getQuan90(int i,int j)

//垂直权值

{

int samechessNumS = 0;//相同棋子的个数

int samechessNumF = 0;

int blankNumS = 0;

int blankNumF = 0;

int q = 0,qS = 0,qF = 0;

int [][]ij0 = new int[2][2];

ij0[0][1] = i;

ij0[0][0] = i;

ij0[1][1] = j;

ij0[1][0] = j;

samechessNumS=getsamechessNum90(ij0,2);

//得到白子数目

if(ij0[0][0] >= 0)

{

if(!chessExist(ij0[0][0],ij0[1][0]))

{

blankNumS++;

}

}

if(ij0[0][1]

{

if(!chessExist(ij0[0][1],ij0[1][1]))

{

blankNumS++;

}

}

qS=getQuanpart(samechessNumS,blankNumS);

//得到速胜权值

ij0[0][1] = i;

ij0[0][0] = i;

ij0[1][1] = j;

ij0[1][0] = j;

samechessNumF=getsamechessNum90(ij0,1);

//得到黑子数目

if(ij0[0][0] >= 0)

{

if(!chessExist(ij0[0][0],ij0[1][0]))

{

blankNumF++;

}

}

if(ij0[0][1]

{

if(!chessExist(ij0[0][1],ij0[1][1]))

{

blankNumF++;

}

}

qF=getQuanpart(samechessNumF,blankNumF);

//得到堵敌权值

q=qS+qF;

return q;

}

private int getQuan135(int i,int j)

//135度权值

{

int samechessNumS = 0;//相同棋子的个数

int samechessNumF = 0;

int blankNumS = 0;

int blankNumF = 0;

int q = 0,qS = 0,qF = 0;

int [][]ij0 = new int[2][2];

ij0[0][1] = i;

ij0[0][0] = i;

ij0[1][1] = j;

ij0[1][0] = j;

samechessNumS=getsamechessNum135(ij0,2);

//得到白子数目

if(ij0[1][0] >= 0&&ij0[0][0] >= 0)

{

if(!chessExist(ij0[0][0],ij0[1][0]))

{

blankNumS++;

}

}

if(ij0[1][1] < width&&ij0[0][1] < height)

{

if(!chessExist(ij0[0][1],ij0[1][1]))

{

blankNumS++;

}

}

qS=getQuanpart(samechessNumS,blankNumS);

//得到速胜权值

ij0[0][1] = i;

ij0[0][0] = i;

ij0[1][1] = j;

ij0[1][0] = j;

samechessNumF=getsamechessNum135(ij0,1);

//得到黑子数目

if(ij0[1][0] >= 0&&ij0[0][0] >= 0)

{

if(!chessExist(ij0[0][0],ij0[1][0]))

{

blankNumF++;

}

}

if(ij0[1][1] < width&&ij0[0][1] < height)

{

if(!chessExist(ij0[0][1],ij0[1][1]))

{

blankNumF++;

}

}

qF=getQuanpart(samechessNumF,blankNumF);

//得到堵敌权值

q=qS+qF;

return q;

}

private int getQuan45(int i,int j)

//45度权值

{

int samechessNumS = 0;//相同棋子的个数

int samechessNumF = 0;

int blankNumS = 0;

int blankNumF = 0;

int q = 0,qS = 0,qF = 0;

int [][]ij0 = new int[2][2];

ij0[0][1] = i;

ij0[0][0] = i;

ij0[1][1] = j;

ij0[1][0] = j;

samechessNumS=getsamechessNum45(ij0,2); //得到白子数目

if(ij0[1][0] = 0)

{

if(!chessExist(ij0[0][0],ij0[1][0]))

{

blankNumS++;

}

}

if(ij0[1][1] >= 0&&ij0[0][1] < height)

{

if(!chessExist(ij0[0][1],ij0[1][1]))

{

blankNumS++;

}

}

qS=getQuanpart(samechessNumS,blankNumS); //得到速胜权值

ij0[0][1] = i;

ij0[0][0] = i;

ij0[1][1] = j;

ij0[1][0] = j;

samechessNumF=getsamechessNum45(ij0,1); //得到黑子数目

if(ij0[1][0] = 0)

{

if(!chessExist(ij0[0][0],ij0[1][0]))

{

blankNumF++;

}

}

if(ij0[1][1] >= 0&&ij0[0][1] < height)

{

if(!chessExist(ij0[0][1],ij0[1][1]))

{

blankNumF++;

}

}

qF=getQuanpart(samechessNumF,blankNumF); //得到堵敌权值

q=qS+qF;

return q;

}

private int getsamechessNum0(int [][]qij,int chessID)

//得到水平方向的同子数目

{

int num = 1;

qij[1][0]--;

while(qij[1][0] >= 0&&num < 5)

{

if(arrMapShow[qij[0][0]][qij[1][0]] != chessID) break;

num++;

qij[1][0]--;

}

qij[1][1]++;

while(qij[1][1] < width &&num < 5)

{

if(arrMapShow[qij[0][1]][qij[1][1]] != chessID) break;

num++;

qij[1][1]++;

}

return num;

}

private int getsamechessNum90(int qij[][],int chessID)

//得到垂直方向的同子数目

{

int num=1;

qij[0][0]--;

while(qij[0][0] >= 0&&num < 5)

{

if(arrMapShow[qij[0][0]][qij[1][0]] != chessID) break;

num++;

qij[0][0]--;

}

qij[0][1]++;

while(qij[0][1] < height&&num < 5)

{

if(arrMapShow[qij[0][1]][qij[1][1]] != chessID) break;

num++;

qij[0][1]++;

}

return num;

}

private int getsamechessNum135(int qij[][],int chessID)

//得到135度方向的同子数目

{

int num=1;

qij[0][0]--;

qij[1][0]--;

while(qij[0][0] >=0&&qij[1][0] >= 0&&num < 5)

{

if(arrMapShow[qij[0][0]][qij[1][0]] != chessID) break;

num++;

qij[0][0]--;

qij[1][0]--;

}

qij[0][1]++;

qij[1][1]++;

while(qij[0][1] < height&&qij[1][1] < width&&num < 5)

{

if(arrMapShow[qij[0][1]][qij[1][1]] != chessID) break;

num++;

qij[0][1]++;

qij[1][1]++;

}

return num;

}

private int getsamechessNum45(int qij[][],int chessID)

//得到45度方向的同子数目

{

int num=1;

qij[0][0]--;

qij[1][0]++;

while(qij[0][0] >= 0&&qij[1][0] < width&&num < 5)

{

if(arrMapShow[qij[0][0]][qij[1][0]] != chessID) break;

num++;

qij[0][0]--;

qij[1][0]++;

}

qij[0][1]++;

qij[1][1]--;

while(qij[0][1] < height&&qij[1][1] >= 0&&num < 5)

{

if(arrMapShow[qij[0][1]][qij[1][1]] != chessID) break;

num++;

qij[0][1]++;

qij[1][1]--;

}

return num;

}

private int getQuanpart(int samechessNum,int blankNum)

{

if(samechessNum == 2&&blankNum == 1) return O2O;

else if(samechessNum == 2&&blankNum == 2) return O2;

else if(samechessNum == 3&&blankNum == 1) return O3O;

else if(samechessNum == 3&&blankNum == 2) return O3;

else if(samechessNum == 4&&blankNum == 1) return O4O;

else if(samechessNum == 4&&blankNum == 2) return O4;

else if(samechessNum == 5) return O5;

else return 0;

}

//记录电脑下子后的横向坐标

public void setX(int x){

this.x=x;

}

//记录电脑下子后的纵向坐标

public void setY(int y){

this.y=y;

}

//获取电脑下子的横向坐标

public int getX(){

return this.x;

}

//获取电脑下子的纵向坐标

public int getY(){

return this.y;

}

//计算棋盘上某一方格上八个方向棋子的最大值,

//这八个方向分别是:左、右、上、下、左上、左下、右上、右下public int checkMax(int x, int y,int black_or_white){

int num=0,max_num,max_temp=0;

int x_temp=x,y_temp=y;

int x_temp1=x_temp,y_temp1=y_temp;

//judge right

for(int i=1;i<5;i++){

x_temp1+=1;

if(x_temp1>this.width)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

//judge left

x_temp1=x_temp;

for(int i=1;i<5;i++){

x_temp1-=1;

if(x_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

if(num<5)

max_temp=num;

//judge up

x_temp1=x_temp;

y_temp1=y_temp;

num=0;

for(int i=1;i<5;i++){

y_temp1-=1;

if(y_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

//judge down

y_temp1=y_temp;

for(int i=1;i<5;i++){

y_temp1+=1;

if(y_temp1>this.height)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

if(num>max_temp&&num<5)

max_temp=num;

//judge left_up

x_temp1=x_temp;

y_temp1=y_temp;

num=0;

for(int i=1;i<5;i++){

x_temp1-=1;

y_temp1-=1;

if(y_temp1<0 || x_temp1<0)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

//judge right_down

x_temp1=x_temp;

y_temp1=y_temp;

for(int i=1;i<5;i++){

x_temp1+=1;

y_temp1+=1;

if(y_temp1>this.height || x_temp1>this.width)

break;

if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;

else

break;

}

if(num>max_temp&&num<5)

max_temp=num;

//judge right_up

x_temp1=x_temp;

y_temp1=y_temp;

num=0;

for(int i=1;i<5;i++){

x_temp1+=1;

y_temp1-=1;

if(y_temp1<0 || x_temp1>this.width)

五子棋的基本下法

五子棋的基本下法 五子棋简单趣味,容易上手,一直深受欢迎。下面是小编收集整理的五子棋的下法介绍,希望对您有所帮助! 1.五子棋的下法 (1)猜先。有各种猜法:如猜一把棋的单双数,或由一方手握黑(或白)让对方猜等。猜中者决定是否持黑。 (2)持黑一方将第一手棋落在棋盘的中央交叉点上即天元位置。 (3)持白一方将盘面的第二手棋选择在黑棋周围的交叉点上,即直止或斜止。 (4)第三手棋黑方落子必须在以天元为中心的5X5=25个交叉点上,从而构成国际上通用的某一开局。此时白方如感觉黑方棋形很厉害,可提出交换,即持白的一方变为持黑棋,持黑的一方变为持白棋。三手交换与否,是白方的权利。 (5)第四手白方落子,此时没有任何限制,白方可在盘面任意点落子。 (6)黑方第五手必须连下两着棋。然后早白方在这两着棋中任选一着留下。再接着下棋。这种规定,称之为五手两打。 (7)此后双方轮流落子,直至分出胜负。 2.五子棋的比赛规则: (1)黑先、白后,从天元点开始开始相互顺序落子于15X15的专用棋盘的交叉点上。

(2)最先在棋盘横向、竖向、斜向形成连续的相同色五个棋子的一方为胜。 (3)黑棋禁手判负,白棋无禁手。黑棋禁手包括三、三,四、四,长连。黑方只能四、三取胜。 (4)如分不出胜负,则定为平局(和棋)。 (5)以局中拨子、中途退场均判为负。 (6)五连与禁手同时形成,先五为胜。 (7)黑方禁手形成时,白方应立即指出。若立方发现后仍继续应子走棋,则不能判黑方禁手负。 (8)白方走出长连也算胜。白方亦可自由地走三、三、四、四或 四、三等。 (9)对局中掉子(棋子掉落在棋盘上)的一方判负。如遇推子或蹭子,以盘面第一落点为准。用手将棋子扶正不算违规。 (10)比赛时间,分为15分钟、半小时、1小时、90分钟、2小时、5小时等几个等级标准,超时判负。 3.五子棋技巧 先手要攻,后手要守 这句话的表面意思应该很容易理解,先手当然应该进攻,不要贻误时机。但有些时候局面并不是一边倒的形势,这就需要认真判断自己到底是不是真正的先手,如果前途暗淡,而对方也有些手段,就要小心了,冒然进攻,用完了自己的力量,再去防守对手,就成了彻底的后手。

五子棋禁手和开局

五子棋26种开局助记图 一、直指开局(左右对称) 二、斜指开局(对角线对称) 1寒星局2溪月局3疏星局4花月局5残月局6雨月局;1长星局2峡月局3恒星局4水月局5流星局6云月局;7金星局8松月局9丘月局10新月局11瑞星局12山月局;7浦月局8岚月局9银月局10明星局11斜月局12名月局13游星局13彗星局 五子棋开局命名规则: 桂:桂马打,黑1、黑3成马步,“日”字形,以“月”命名。 如直指的:“溪月”、“残月”、“新月”、“山月”; 如斜指的:“峡月”、“水月”、“岚月”、“名月”。 间:间打,黑1、黑3在一条直线上或一条斜线上,间隔一点,以“星”命名。 如直指的:“寒星”、“疏星”、“金星”、“游星”、“瑞星”; 如斜指的:“长星”、“恒星”、“流星”、“明星”、“彗星”。 连:连打,黑1、黑3在一条直线上或一条斜线上,无间隔,以“月”命名。 如直指的:“花月”、“雨月”、“丘月”、“松月”; 如斜指的:“云月”、“浦月”、“银月”、“斜月”。 附上彭建国编写的《彭氏口诀》: 寒星溪月疏星首,花残二月并白莲, 雨月金星追黑玉,松丘新宵瑞山腥。 星月长峡恒水流,白莲垂俏云浦岚, 黑玉银月倚明星,斜月名月堪称朋。 二十六局先弃二,直指游星斜彗星。 溪峡雨云形相似,子序不同略有别。

五子棋禁手规则简单图解及一些复杂禁手判断的分析讨论 黑先、白后,从天元开始相互顺序落子。 最先在棋盘横向、竖向、斜向形成连续的相同色五个棋子的一方为胜。 禁手是指对局中禁止使用的战术或被判为负的行棋手段。黑棋禁手判负,白棋无禁手,黑棋禁手包括“三三”,“四四”,“长连”。黑方只能“四三”胜。 三三:当黑方落下一子后,同时形成两个活三。 四四:当黑方落下一子后,同时形成两个四。 长连:相同颜色的连续形成六子或六子以上。 此外:四三三也属于禁手。 请参看下图禁手图解: 下面是李老师刚发给我的帮助理解复杂禁手判断的图解分析:

五子棋需求分析报告

中国矿业大学 应用系统开发实践 设计题目:基于VC的五子棋游戏软件的设计与开发指导教师:

学生: 专业: 计算机科学与技术09-1班 2012年5月 目录 1 引言 (2) 2 系统需求分析 (2) 2.1系统需求 (2) 2.2功能需求 (2) 2.3系统运行环境 (2) 3 五子棋算法分析 (3) 3.1五子棋的发展 (3) 3.2五子棋的规则 (3) 3.3具体算法分析 (4) 3.3.1 棋盘局势状态表示 (4) 3.3.2棋盘中下棋的顺序表示 (5) 3.3.3具体算法 (5) 4 系统流程 (7) 5 系统功能实现 (8)

5.1窗口设计 (9) 5.2棋盘设计 (9) 5.3按钮功能的实现 (10) 5.4胜负判断 (11) 6 系统测试与分析 (13) 7 结论 (17)

1.引言 目前网络上有很多五子棋子游戏,玩法简单,娱乐性也很高。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。通过对五子棋的设计与开发,了解和掌握游戏开发的原理与方法。让电脑像人脑一样思考,一直是人工智能发展的最终目标。作为一门边缘学科,它有诸多的研究领域,博弈即为其中之一。博弈的参加者可以是个人、集体、某种生物或机器,他们都力图用自己的“智力”去击败对手。博弈为人工智能提供了一个极好的试验场所,人工智能中的许多概念和方法都是从博弈程序中提炼出来的,人工智能中大多以下棋为例来研究博弈规律。本文以五子棋为入口,设计了一个五子棋双人对战和人机对弈系统,以实现人和人,人和计算机的博弈,最终的目的是为了建立一个有具体规则的五子棋平台。 2.需求分析 目前网络上有很多五子棋子游戏,玩法简单,娱乐性也很高。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。通过对五子棋的设计与开发,了解和掌握游戏开发的原理与方法。让电脑像人脑一样思考,一直是人工智能发展的最终目标。作为一门边缘学科,它有诸多的研究领域,博弈即为其中之一。博弈的参加者可以是个人、集体、某种生物或机器,他们都力图用自己的“智力”去击败对手。人机对弈程序的要点,至少应具备以下4个部分:(1) 状态表示:某种在机器中表示棋局的方法,能够让程序知道博弈的状态。(2) 走法产生:产生合法走法的规则,以使博弈公正地进行,并可判断对手是否乱走。(3)搜索技术:从所有合法的走法中选择最佳的走法技术。(4) 对弈界面。

26种五子棋开局

五子棋技巧大全 中国现代连珠五子棋的开拓者那威九段,多年钻研五子棋,潜心发掘五子棋的中国民间阵法,他总结了五子棋行棋的要领和临阵对局的经验,得出一套 “ 秘诀 ” ,谓之《那氏五子兵法》: 先手要攻,后手要守,以攻为守,以守待攻。攻守转换,慎思变化, 先行争夺,地破天惊。守取外势,攻聚内力,八卦易守,成角易攻。 阻断分隔,稳如泰山,不思争先,胜如登天。初盘争二,终局抢三, 留三不冲,变化万千。多个先手,细算次先,五子要点,次序在前。 斜线为阴,直线为阳,阴阳结合,防不胜防。连三连四,易见为明, 跳三跳四,暗剑深藏。己落一子,敌增一兵,攻其要点,守其必争。 总结: 1、留三不冲四,保留变化 2、防守活三时防在对方攻势强的方向 3、八卦马步是强防守,但不提倡用纯色八卦阵,尤其黑子,禁手制下八卦必败 4、布局时斜行、成角为强攻 5、开局时争活二,自己多做二,挡住对方的活二,并且往往挡对方的活二先,不必攻急 6、下子时考虑对方会怎么走,你再往下一子该怎么走 7、开黑优局要尽快建立棋子间的联系,即“攻聚内力” 开白优局时参照5的后半句,封锁对方行为,抢外围优势 五子棋技巧图解 安东是公认的世界上五子棋棋力最强的棋手,他有一套成熟的五子棋技巧理论,非常实用,本文就是这套五子棋技巧理论的图解,由五子茶馆站长雪飞翻译。 五子棋技巧之一:该进攻时,不要防守。 法则:越是积极的进攻,越容易获得取胜的机会。 当你的对手走棋不积极时,你不必跟着他走棋,而 是要考虑自己的棋是否可以进攻。如图1,白10形成眠三,看起来为下一步进攻做好了准备;但如果你仔细计算,会发现白棋的进攻并没有连续性。因此,我们认为白棋并不积极,黑棋可以落子11形成攻击。有很多棋手会跟着挡在11-C ,虽然这不是坏着,但在当前情况下,完全没有必要,这个时候,你应该去进攻而不是防守。 白10应该走A 或B 点,这样的行棋会更加积极,如此,黑棋就不能走11位攻击了,而是要跟着白棋去防守。 五子棋技巧之二:进攻始于活二,要尽可能的利用好棋盘上的每一个子,多形成活二。 图1

五子棋禁手全解(借鉴材料)

五子棋禁手全解 什么是禁手? 五子棋禁手,是指执黑一方,某些点是禁止落子的,如果落在这些点上,会被判禁手告负。 这些点包括:三三、四四或者长连。 禁手的定义 黑棋一子落下,同时形成三三、或者四四、或者长连,且没有形成五连。那么,这个点就是禁手点,黑棋判负。白棋没有禁手。 禁手的类型 禁手包括三类:三三禁手、四四禁手和长连禁手。 一、三三禁手 三三禁手,是禁手的一种,是指黑棋一子落下,同时形成两个或者两个以上的活三,且没有形成五连。 要注意的是: 1、三三禁手中的“三”,是指“活三”。 2、至少要形成两个活三,如果形成两个以上,也归在三三禁手这一类。 如图:A 、B 、C 点为三三禁手;D 点为三 三三禁手;E 、F 点为三三禁手(各有两个跳活三);G 点为四三三禁手点。 禁手的图例 三三禁手的图例

二、四四禁手 四四禁手,是禁手的一种,是指黑棋一子落下,同时形成两个或者两个以上的可以成五的四,且没有形成五连。 要注意的是: 1、四四禁手中的“四”,是指“能成五的四”,包括冲四和活四。 2、至少要形成两个“能成五的四”,如果形成两个以上,也归在四四禁手这一类。 如图:A 点是四四禁手;B 点是四四四禁手;C 、D 、E 、F 点是横线上特殊形状的四四禁手点,俗称扁担阵。 三、长连禁手 长连禁手,是禁手的一种,是指黑棋一子落下,形成六个或者六个以上的同色连续棋子,且没有形成五连。 从理论层面,长连禁手包括六长连,七长连,八长连和九长连四种。 最长的长连是九长连,十长连是无法形成的。 如图:A 点是六长连;B 点是七长连;C 点是八长连;D 点一子落下,同时形成九长连和六长连两个长连。 为什么要规定禁手? 这是因为黑方先行,有着先行的极大优势,黑方可先五而胜,白方随后连五,却只算黑胜,不算白胜。从这点看,毫无疑问对白方是不公平的。因此只有通过对黑方实行规则上的限制,才能遏制其先行的优势,从而真正达到棋局平衡的目的。五子棋禁手的产生正基于此。 另外,设置禁手规则之后,可以说大大丰富了五子棋的玩法,黑白双方围绕禁手展开的系列战术,给五子棋平添了盎然生趣。 禁手的演变历史 四四禁手的图例 长连禁手的图例

五子棋基本技巧

五子棋基本技巧 基本技巧 一、四种摆放(形象的叫法): 二、最常见的取胜法:一子双杀,既落下一个子,同时形成两条棋路,使对手封住一条,就来不及封住另一条,从而取胜。 三、不堵情况下,一子双杀的十大基本棋路: 两头空边二空跳二空中二空两头空图1 图2 图3 图4 边二空图2 图5 图6 图7 跳二空图3 图6 图8 图9 中二空图4 图7 图9 图10 图示说明: 圆形图标:表示已经落下的棋子。 十字图标:之后落下的棋子,同时形成两条棋路,使对手堵住其中一路,就来不及去堵另一路。 图1:两头空-两头空图2:两头空-边二空

图3:两头空-跳二空图4:两头空-中二空 图5:边二空-边二空 图6:边二空-跳二空 图7:边二空-中二空图8:跳二空-跳二空 图9:跳二空-中二空图10:中二空-中二空

四、一头被堵情况下,一子双杀的八大基本棋路。 一头被堵情况下,落下一个子,形成两条棋路,使一头被堵的那条棋路形成四个连子,没有被堵的那条棋路,形成三个子的棋路,可以是两头空、边二空、跳二空、中二空,从而使对手堵住一路,就来不及堵另一路。 两头空边二空跳二空中二空 内插连四图1 图2 图3 图4 外插连四图5 图6 图7 图8 分为两种情况: 1.从被堵棋路的内部形成四颗子: 图1:内插连四-两头空图2:内插连四-边二空 图3:内插连四-跳二空图4:内插连四-中二空

2.从被堵棋路的外部形成四颗子: 图5:外插连四-两头空图6:外插连四-边二空 图7:外插连四-跳二空图8:外插连四-中二空 开局技巧 五子棋的开局也称布局,一般在3~7手左右完成。五子棋的开局是十分重要的。一般情况下,一局五子棋的着数在20至40着之间,因此,它的开局阶段是非常短暂的,大约在七八着至十几着之间。在这一阶段的争夺中,双方的布局、应答将对以后的胜负起着关键的作用。一般来说,黑棋以攻为主,而白棋则以防为主。

五子棋初学者大全

五子棋初学技巧:方法一:开局。万事开头难,五子棋的开局也不例外。很多棋迷朋友第一步下的往往都是在天元位置(即五子棋最中间黑点),然后白子下第一步。白子下的位置有很多种,比如相邻,对角线上等等,每一种下法对后来都是有影响的 方法二:进攻。五子棋分两种:禁手和无禁手(关于两者的区别小编将在后续经验中详细解释)。小编在此处以无禁手为例。无禁手的话黑方的获胜概率就很大了。五子棋众多前辈早就已经验证过:在双方实力差距很小的情况下,一般都是黑棋必胜。这时黑子要从第一个落子开始就不断进攻,要努力连成更多的活2,活3(活子的概念小编也将在之后相继解释)。 方法三:防守。一局五子棋中我们往往很难一直做到进攻,这时我们就需要去防守了。还有就是当棋子盘面处于劣势的情况下,防守就是最好的进攻,从对手的进攻下寻找破绽,然后一举将对方击破。防守对方的时候我们往往都有几个选择,要想一想每个选择所带来的后果。 方法四:中后期策略。当我们和对手一路厮杀到中后期棋盘都快覆盖了,这时候考验我们的就是耐心了。谁先静不下来,往往就是谁先输。棋子多的时候往往对手会放下警惕,这也是迅速找到翻盘点的机会。 五子棋的一些必胜技巧,你知道哪些?五子首先是思路问题。要了解先手的情况下如何把握和扩大优势,同时理解后手的各种强防思路,要知道在什么局面下,你该做什么,怎么做。下棋,掌握思路和棋理是最重要的。棋理是可操作的技术指南,而不是空泛的说教。单纯的了解和记忆棋谱、变化没有意义。五子棋是比较休闲益智的棋类,老少皆宜,它的下发多种多样,我的棋技不算高超,但有几个必胜技巧还是有用的,下面我给大家分享一下吧,不当之处烦请高手多多指教。必胜技巧:连接着同类棋子的交汇处,是制胜的一步。如图,假如你是白棋,在箭头所指处放上白棋后,白棋必胜无疑了,因为横着竖着都是三个白子,对手堵住一头,另一头可以联成五子棋。但刚开始一般对方都可以看出来,下图只是个比方,但如果在满盘都是棋的情况下,对方无暇顾及时你可以使用这一战术。 如图,箭头所指的黑子是致胜的一步棋。这之前对方不容易觉察到这一步,你一定要看仔细,两根蓝线是指都能连成五子棋,无论对方挡哪都无济于事了。

五子棋禁手详解(附件)

首先,基本概念(仅供参考) 参看《中国五子棋竞赛规则》,得到如下四个基本概念: 禁手的定义:对局中如果使用将被判负的行棋手段 禁手的分类:三三禁手(黑棋一子落下同时形成两个或两个以上的活三,此子必须为两个活三共同的构成子)、四四禁手(黑棋一子落下同时形成两个或两个以上的冲四或活四)、长连禁手(黑棋一子落下形成一个或一个以上的长连)。 构成禁手的基本子力要素:活三(本方再走一着可以形成活四的三)、活四(有两个点可以成五的四)、冲四(只有一个点可以成五的四)、长连(在棋盘上的阳线和阴线任意一条线上,形成的5个以上同色棋子不间隔的相连)关于禁手的规定:黑方五连与禁手同时形成,禁手失效,黑方胜 第二、基本子力要素的判断 (1)长连:在棋盘上的阳线和阴线任意一条线上,形成的5个以上同色棋子不间隔的相连 如图:黑子的连接数目都超过了5个,都是长连,六连、七连、八连、最长可以达到九子连。图中字母A标示的两个长连基于一身,“×”标示的是最长的九子连,只能以“×”位置为最后落子才能形成 (2)活四:有两个点可以成五的四

如图:黑棋下一手可以在A、B、C、D四处形成五连而取胜,且每个四都有两个点可以成五取胜。因而,这两个都是活四 (3)冲四:只有一个点可以成五的四 如图:黑棋下一手可在矩形标记处形成五连而取胜,且每个四都有且只有一个点可以成五取胜。因而,这里都是冲四

(4)活三:本方再走一着可以形成活四的三 如图:下一手黑棋可在所有“〇”处形成活四,因而这里的四个都真活三 (5)假活三:这是判断复杂禁手的最重要的环节,几乎所有“似是而非、似非而是”的禁手都是假活三在捣乱(详见复杂禁手的判断),下图几个典型的假活三一定要牢记在心 如图:所有“×”标示的均因对手棋子(棋盘边缘,俗称“盘端”,因棋子

五子棋棋谱——经典的开局方式、开局口诀及心得

五子棋棋谱 五子棋开局棋分为两种:直止、斜止。 寒星溪月疏星首,花残二月并白莲,雨月金星追黑玉,松丘新宵瑞山腥。星月长峡恒水流,白莲垂俏云浦岚,黑玉银月倚明星,斜月名月堪称朋。口诀中前四句为直止,五至八句为斜止。 浦月:白16冲是妙手。到白18时,黑棋在I5点三三禁手负。 浦月是先手必胜的珠形。白4是不太好的防守,最强的防守点是5、7、11、9等位置。以下黑棋走了5、7、9的位置,非常痛快,对于白10的防守,黑11活三相当棒。 对于白12的防守,黑13是败着,因白棋有反先手,以下形成反先手的再反先手的争夺。黑13不如在14的位置走跳三效果好,走完跳三后将来一定会形成连攻胜。白14和黑15 互相反先手后,下一手白16冲四是高着,黑17只能防守,于是,下一手白18一落盘即定了胜负。 花月:白22时,黑棋在F9点长连禁手负。

花月属先手必胜的开局。白4在此开局是强防之一,另外还有12的位置和I7的位置也是强防。黑5是定式,白6是很有意思的防守方法,此时如果把黑7走在22或者17的位置上,则形成白棋必胜。 黑7、黑9布阵是好棋,以下白棋即便有白10、白12的进攻,但黑11、13防守后黑棋还不错,对于白14的强防,黑15拓展棋路后黑棋形成必胜形。 白16是一手奇特的防守,黑17的活三走到了白棋的射程以内,白18、白20跳冲四后,白22跳三,黑棋被夹攻形成长连。 从以上情况看,黑17应该走F5点为好。 新月:白10、白12设法反攻后,黑棋投子认负。

新月是黑棋容易走的珠形。白4是强防,黑5也可以走,但不如走在8的位置好。 白6也是强防,对于白8的防守,黑9是败着。另外黑9改走11的位置防守也不是好棋,因为以下白有作战的棋路拓展。 白10跳三是好棋,黑11是最佳的防守,白12是绝妙的一手棋,至此,白棋已经形成胜势。 水月:黑19时,白棋投子认负。 对于水月开局,白4是强的应着。如果白8改在9的位置防守是强防。 白10的防守有点太贪心,白10此时应该是反向防守于14的位置,由于这一点的失误,以下让黑棋连续攻击取得了胜利。 但是,黑13的四三做杀不算好手,在此,如果按黑14、黑13、黑15的顺序进攻的话,黑棋很简单地就能获胜了。 由于黑19这手棋,黑棋以下有H11、E8或者K9、H6、G7的两路连攻胜,因此,黑棋胜定。如果此时白棋在E9点防守,则黑棋走J10点后连续两手冲四胜。

五子棋需求分析说明书

五子棋需求分析说明书 1. 引言 1.1 编写目的 (1)为了更好的了解软件的需求。该文档可供用户浏览,了解开发内容和各部分模块所列功能。 (2)为了使开发更具有目的性。开发人员需要对需求进行深度了解,该文档可供代码编写人员浏览,使开发过程不离主线,更完整地看到各模块间的数据流通。 (3)为了方便整体维护;开发管理者需要整体把握软件各模块功能的实现与测试,该文档可供开发管理人员浏览,对其内容进行动态调整。 1.2 背景 1) 软件系统名称:五子棋。 任务开发者:DTO小组。

用户:玩家。 1.3 参考资料 《五子棋》软件设计报告杭州电子科技大学胡峰令1. 4 关于五子棋的资料 五子棋是起源于中国古代的传统黑白棋种之一。亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格” 等多种称谓。 玩家根据自身等级和习惯,可以自由选择不同的游戏房间。其游戏规则也有所不同。详细分为三种棋室:普通棋室、国标棋室、职业棋室。其中普通棋室不受任何规则限制;国标棋室有禁手规则限制;而职业棋室则在国标棋室的基础上增加“三手交换”和“五手两打”两项规则。(三手交换:是指黑棋下盘面第3着棋后,白方在应白④之前,如感觉黑方棋形不利于己方,可提出交换,即执白棋一方变为执黑棋一方,而黑方不可以不换。五手两打:是指黑棋在下盘面上关键的第5手棋时,必须下两步棋,让白棋在这两步棋中任选一步,然后再继续对弈。 国际比赛规则规定:对局中如黑方出现禁手,白方应立即

指出禁手点,黑方即负。如白方在黑方出现禁手后,又落一步白子,黑棋禁手则不成立了。所以在"有禁手"的房间里,如果黑方出现禁手,白方应立即按下"禁手"按钮。 程序会判黑方负。如果这时白方又在棋盘上落一子,黑棋禁手则不成立了。为了简化用户对"禁手"按钮的使用,也有"走禁手就输"和"禁手不能落子"规则的房间,顾名思义不多介绍。虽然采取了禁手的限制,黑棋先行仍有优势,黑棋仍可以必胜。所以如果用户是高段位的棋手,或者想成为高手一定要选择国际上比赛选用的比赛标准,即“三手交换,五手两打”。 2任务概述 2.1目标 该软件是根据五子棋而开发的小游戏。可以提供玩家和玩家,玩家和电脑下五子棋。 2.2用户的特点 本软件的最终用户是会下五子棋的玩家。不需要特别的技术要求,只要能操作简单的界面。

五子棋开局技巧大全

五子棋技巧大全 国民间阵法,他总结了五子棋行棋的要领和临阵对局的经验,得出一套“秘诀”,谓之《那氏五子兵法》: 先手要攻,后手要守,以攻为守,以守待攻。攻守转换,慎思变化, 先行争夺,地破天惊。守取外势,攻聚内力,八卦易守,成角易攻。 阻断分隔,稳如泰山,不思争先,胜如登天。初盘争二,终局抢三, 留三不冲,变化万千。多个先手,细算次先,五子要点,次序在前。 斜线为阴,直线为阳,阴阳结合,防不胜防。连三连四,易见为明, 跳三跳四,暗剑深藏。己落一子,敌增一兵,攻其要点,守其必争。 总结: 1、留三不冲四,保留变化 2、防守活三时防在对方攻势强的方向 3、八卦马步是强防守,但不提倡用纯色八卦阵,尤其黑子,禁手制下八卦必败 4、布局时斜行、成角为强攻 5、开局时争活二,自己多做二,挡住对方的活二,并且往往挡对方的活二先,不必攻急 6、下子时考虑对方会怎么走,你再往下一子该怎么走 7、开黑优局要尽快建立棋子间的联系,即“攻聚内力” 开白优局时参照5的后半句,封锁对方行为,抢外围优势 五子棋技巧图解 安东是公认的世界上五子棋棋力最强的棋手,他有一套成熟的五子棋技巧理论,非常实用,本文就是这套五子棋技巧理论的图解,由五子茶馆站长雪飞翻译。 法则:越是积极的进攻,越容易获得取胜的机会。 当你的对手走棋不积极时,你不必跟着他走棋,而 是要考虑自己的棋是否能够进攻。如图1,白10形 成眠三,看起来为下一步进攻做好了准备;但如果 你仔细计算,会发现白棋的进攻并没有连续性。所 以,我们认为白棋并不积极,黑棋能够落子11形成 攻击。有很多棋手会跟着挡在11-C,虽然这不是坏 着,但在当前情况下,完全没有必要,这个时候, 你应该去进攻而不是防守。 白10应该走A或B点,这样的行棋会更加积极,如 此,黑棋就不能走11位攻击了,而是要跟着白棋去图1

五子棋游戏规则

五子棋游戏规则 目前五子棋有如下几种规则 一:无禁手规则:(本游戏中心的就是这种规则,适用于初学者) 黑白双方依次落子,由黑先下,当棋盘上有三个子时(两黑一白),如果此时白方觉得开的局不利于自已可以提出交换,黑方无条件接受!也可以不交换,主动权在白方!然后继续下棋,任一方先在棋盘上形成横向、竖向、斜向的连续的相同颜色的五个(含五个以上)棋子的一方为胜。 二:禁手规则 禁手是针对黑棋而言的,禁手是指一手黑棋棋形成:双活三,双四,长连(五子以上)为输!这种方法限制了黑棋先行的优势!禁手对白棋无效! 三:RIF(国际连珠连盟)正式规则 1,第一位选手开局(指定的26种开局) 2,第二位选手默认执白,如果觉得第一位选手开局对黑有利可以交换(即三手交换)!并由执白者下第四手棋! 3,第五手黑棋要在棋盘上下两子(即五手两打)这两手不能对称(即两手棋的相对位置不能一样),然后由白方从这两手中拿掉一个对白不利,对黑优势最大的那个子后下第六手棋! 4,开始轮留下子,黑棋有禁手!任何一方如果不想落子,可以放弃一手! 四:“Yamaguchi”规则 - 第一位选手摆出26种开局之一,并且提出要求本局需几个第5子。 - 另一位选手有权交换。 - 执白者在棋盘上任意位置放第4子。 - 执黑者按前面提出的要求在棋盘上放若干个第5子。 - 执白者从这些第5子中选择一个,然后落第6子。 开局阶段结束后,按连珠规则正常继续进行。 五:“Tarannikov”规则 - 执黑者在天元放第1子。 - 另一位选手可以交换。 - 执白者在中央3×3区域内放第2子。 - 另一位选手可以交换。 - 执黑者在中央5×5区域内放第3子。 - 另一位选手可以交换。 - 执白者在中央7×7区域内放第4子。 - 另一位选手可以交换。 - 执黑者在中央9×9区域内放第5子。

绝对经典_五子棋口诀与解释_技巧锦囊

五子棋口诀与释义 先手要攻,后手要守。以攻为守,以守待攻。 守取外势,攻聚内力。八卦易守,成角易攻。 阻断分隔,稳如泰山。不思争先,胜比登天。 初盘抢二,局终争三。留三不冲,变化万千。 多个先手,细算次先。五子要点,次序在前。 斜线为阴,直线为阳。阴阳结合,防不胜防。 连三连四,易见为明。跳三跳四,暗剑深藏。 己落一子,敌增一兵。攻其要点,守其必争。 势已形成,败即降临。五子精华,一子输赢。 先手要攻,后手要守 这句话的表面意思应该很容易理解,先手当然应该进攻,不要贻误时机。但有些时候局面并不是一边倒的形势,这就需要认真判断自己到底是不是真正的先手,如果前途暗淡,而对方也有些手段,就要小心了,冒然进攻,用完了自己的力量,再去防守对手,就成了彻底的后手。 有些初学者执黑就一味的进攻,结果没有成功就反过来防守白棋,而那时白棋早已羽翼丰满了。 以攻为守,以守待攻 攻不忘守,守不忘攻。有句话叫“最强的防守就是进攻”,防守别人棋的时候仔细看清局势,是不是有既能防守住对方又可以进攻的点。以守待攻,在对方狂攻一阵却无胜棋后,你防守的棋是否形成了外围的攻势?在安全的前提下,防守对方的棋最好不要太消极,等他攻完,就可以利用防守时形成的攻势轻松收拾对方。 白棋防守一般都有2至3个地方可以放子,如何选择最强防点是根据对手的棋型的,有时是远离自己的后方防住对手进攻的要塞,有时是借防守同时加强自己的子力。当然后者的防守有相当的难度。 攻守转换,慎思变化

发现进攻没有胜棋,而对方防守的子力形成了一定的威胁,一般就会转攻为守了。或者守住了对方的进攻,得到先手而转守为攻。攻守转换的时候,要分析局面,有些冲四、活三是不是该先下了再去防守更好?还是冲后以后再防守会变得更困难?以守转攻的时候,要看清是不是真的已经完全守住了对方?他还有哪些力量,能不能够成威胁? 先行争夺,地破天惊 用妙手强行夺得先手,这样的气势连天地都会惊动。 连珠是争夺先手的艺术。 守取外势,攻聚内力。 防守的时候,尽可能防在外围,限制对方的空间,让他的棋没有发展前途。进攻则不能太分散子力,下得太外,被对方占据要点,阻断子力联系,不能形成有效的进攻。但攻聚内力并不等于放弃外围,使自己没有足够的空间进攻,守取外势也不能一味地在外围防守,而放弃内部必须占据的要点。 有个比喻,白棋防守是要把黑棋当馅包裹起来的,而黑棋则是积聚力量在一个小空间内大做文章,或则突出重围,当然这样就很难利用内部的子力了。 八卦易守,成角易攻。 八卦就是由象棋四个马步形成的一种棋形,如果摆满全盘,则对方没有取胜的可能。还有一种说法叫“马步是强防”,既使不能摆满全盘,很多时候自己的棋子形成马步的点就是强防点。成角易攻,角就是三个紧紧地在一起的棋子构成的直角三角形,成角的形状后子力可互相多次利用,进攻源源不断。 有句话叫,黑八卦必胜,白八卦必输。可是,我看到很多白八卦也赢了。破八卦地方法很多,在网上可以看到很多人地解法。 阻断分隔,稳如泰山。 这句话说的就是防守时的一种思想,阻断对方子力的联系,逐个击破。 不思争先,胜比登天。

五子棋禁手规则详解含复杂禁手

五子棋禁手规则详解 (含复杂禁手) 首先,基本概念 参看《中国五子棋竞赛规则》,得到如下四个基本概念: 禁手的定义:对局中如果使用将被判负的行棋手段 禁手的分类:三三禁手(黑棋一子落下同时形成两个或两个以上的活三,此子必须为两个活三共同的构成子)、四四禁手(黑棋一子落下同时形成两个或两个以上的冲四或活四)、长连禁手(黑棋一子落下形成一个或一个以上的长连)。 构成禁手的基本子力要素:活三(本方再走一着可以形成活四的三)、活四(有两个点可以成五的四)、冲四(只有一个点可以成五的四)、长连(在棋盘上的阳线和阴线任意一条线上,形成的5个以上同色棋子不间隔的相连)关于禁手的规定:黑方五连与禁手同时形成,禁手失效,黑方胜 第二、基本子力要素的判断 (1)长连:在棋盘上的阳线和阴线任意一条线上,形成的5个以上同色棋子不间隔的相连 如图:黑子的连接数目都超过了5个,都是长连,六连、七连、八连、最长可以达到九子连。图中字母A标示的两个长连基于一身,“×”标示的是最长的九子连,只能以“×”位置为最后落子才能形成 (2)活四:有两个点可以成五的四 如图:黑棋下一手可以在A、B、C、D四处形成五连而取胜,且每个四都有两个点可以成五取胜。因而,这两个都是活四 (3)冲四:只有一个点可以成五的四 如图:黑棋下一手可在矩形标记处形成五连而取胜,且每个四都有且只有一个点可以成五取胜。因而,这里都是冲四 (4)活三:本方再走一着可以形成活四的三 如图:下一手黑棋可在所有“〇”处形成活四,因而这里的四个都真活三(5)假活三:这是判断复杂禁手的最重要的环节,几乎所有“似是而非、似非而是”的禁手都是假活三在捣乱(详见复杂禁手的判断),下图几个典型的假活三一定要牢记在心 如图:所有“×”标示的均因对手棋子(棋盘边缘,俗称“盘端”,因棋子不能下到棋盘外边,等同于棋盘外边有个对方棋子在防守)的阻碍,而无法形成活四(两边均可连五才叫活四);所有“△”标示的均因自己棋子的阻碍,而无法形成活四。图中C3位置落子的话,只能在G3一个点连五,即“没有形成活四,只能形成冲四”;图中K4位置落子的话会形成四四禁手,活四不成立,即“无法形成活四”;图中L9位置落子成四的话,M8位置是长连禁手,只能在H13一个点连五,即“没有形成活四,只能形成冲四”(E7同理)。因此,这些都是假活三 第三,认识简单禁手

五子棋基本技巧讲解学习

五子棋基本技巧

五子棋基本技巧 基本技巧 一、四种摆放(形象的叫法): 二、最常见的取胜法:一子双杀,既落下一个子,同时形成两条棋路,使对手封住一条,就来不及封住另一条,从而取胜。 三、不堵情况下,一子双杀的十大基本棋路: 两头空边二空跳二空中二空两头空图1 图2 图3 图4 边二空图2 图5 图6 图7 跳二空图3 图6 图8 图9 中二空图4 图7 图9 图10 图示说明: 圆形图标:表示已经落下的棋子。 十字图标:之后落下的棋子,同时形成两条棋路,使对手堵住其中一路,就来不及去堵另一路。 图1:两头空-两头空图2:两头空-边二空

图3:两头空-跳二空图4:两头空-中二空 图5:边二空-边二空 图6:边二空-跳二空 图7:边二空-中二空图8:跳二空-跳二空 图9:跳二空-中二空图10:中二空-中二空

四、一头被堵情况下,一子双杀的八大基本棋路。 一头被堵情况下,落下一个子,形成两条棋路,使一头被堵的那条棋路形成四个连子,没有被堵的那条棋路,形成三个子的棋路,可以是两头空、边二空、跳二空、中二空,从而使对手堵住一路,就来不及堵另一路。 两头空边二空跳二空中二空 内插连四图1 图2 图3 图4 外插连四图5 图6 图7 图8 分为两种情况: 1.从被堵棋路的内部形成四颗子: 图1:内插连四-两头空图2:内插连四-边二空 图3:内插连四-跳二空图4:内插连四-中二空

2.从被堵棋路的外部形成四颗子: 图5:外插连四-两头空图6:外插连四-边二空 图7:外插连四-跳二空图8:外插连四-中二空 开局技巧 五子棋的开局也称布局,一般在3~7手左右完成。五子棋的开局是十分重要的。一般情况下,一局五子棋的着数在20至40着之间,因此,它的开局阶段是非常短暂的,大约在七八着至十几着之间。在这一阶段的争夺中,双方的布局、应答将对以后的胜负起着关键的作用。一般来说,黑棋以攻为主,而白棋则以防为主。

五子棋AI算法的改进方法讲解

又是本人一份人工智能作业……首先道歉,从Word贴到Livewrter,好多格式没了,也没做代码高亮……大家凑活着看……想做个好的人机对弈的五子棋,可以说需要考虑的问题还是很多的,我们将制作拥有强大AI五子棋的过程分为十四步,让我来步步介绍。 第一步,了解禁手规则 做一个五子棋的程序,自然对五子棋需要有足够的了解,现在默认大家现在和我研究五子棋之前了解是一样多的。以这个为基础,介绍多数人不大熟悉的方面。五子棋的规则实际上有两种:有禁手和无禁手。由于无禁手的规则比较简单,因此被更多人所接受。其实,对于专业下五子棋的人来说,有禁手才是规则。所以,这里先对“有禁手”进行一下简单介绍: 五子棋中“先手必胜”已经得到了论证,类似“花月定式”和“浦月定式”,很多先手必胜下法虽然需要大量的记忆,但高手确能做到必胜。所以五子棋的规则进行了优化,得到了“有禁手”五子棋。五子棋中,黑棋必然先行。因此“有禁手”五子棋竞技中对黑棋有以下“禁手”限制:“三三禁”:黑棋下子位置同时形成两个以上的三;“四四禁”:黑棋下子位置同时形成两个以上的四;“长连禁”:六子以上的黑棋连成一线。黑棋如下出“禁手“则马上输掉棋局。不过如果“连五”与“禁手”同时出现这时“禁手”是无效的。所以对于黑棋只有冲四活三(后面会有解释)是无解局面。反观白棋则多了一种获胜方式,那就是逼迫黑棋必定要下在禁点。 为了迎合所有玩家,五子棋自然需要做出两个版本,或者是可以进行禁手上的控制。 第二步,实现游戏界面 这里,我制作了一个简单的界面,但是,对于人机对弈来说,绝对够用。和很多网上的精美界面相比,我的界面也许略显粗糙,但,开发速度较高,仅用了不到半天时间。下面我们简单看下界面的做法。 界面我采用了WPF,表现层和逻辑层完全分开,前台基本可以通过拖拽完成布局,这里就不做过多介绍。根据界面截图简单介绍

五子棋的必胜概念与规则限制.doc

五子棋的必胜概念与规则限制 五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一;下面是有五子棋的必胜概念与规则限制,欢迎参阅。 一、必胜的概念 很多人对五子棋执黑必胜(原始规则下)持有很大的疑问,很正常,毕竟五子棋里面的必胜概念,与寻常的理解存在差异。那么,五子棋里面的必胜是什么意思呢?我认为,要从两方面去正确理解 1、地毯式。五子棋的必胜是地毯式的必胜。大家应该听说过地毯式搜索这类词吧地毯式,意味着每个角落都不放过、不遗漏。五子棋的必胜,就属于地毯式的:在存在必胜的一方完全走对的前提下,理论必败的一方,他的每一步无论走在棋盘的哪个点上,全都无法逃脱理论必败只有这样的棋,我们才能叫它必胜。反之,即使仅仅一步棋中、仅仅有一个点做不到必胜,那么这个棋局就不能叫做必胜!五子棋的必胜概念,是相当严格的。(我们常说的无禁手花月必胜,就是这种严格、严谨的必胜) 2、客观存在性。必胜都是客观存在的。强调这句话是什么意思呢? 很多爱好者总喜欢反问:不是说花月必胜吗?怎么xx 下花月执黑还被我打败了呢? 请注意一点:必胜是客观存在的,但若使用它的人主观上走错,使得棋局无法必胜,甚至失败了,我们能因此说必胜不存在吗?显然是不能的。主观上的失误,无法改变必胜的客观存在性。因此,如果因为有人把必胜走丢了就说必胜不存在,这显然是没有道理的。 二、规则问题 既然五子棋存在先行必胜(原始规则),那么,为什么还会有五子棋的比赛呢?这样的比赛又有什么意义? 相信很多爱好者都会提出上面的疑问。针对上述问题,我要讲一下五子棋的规则演变。

规则演变历程: 1688年至1704年:原始五子棋传入日本 1899年:黑白双方都禁止走双活三(有禁手规则的最初形态) 1903年:仅仅黑方禁止走双活三(由双方禁手过渡到单方禁手) 1916年:黑方禁止走长连 1931年:黑方禁止走双四(形成了完整的有禁手规则) 1973年:提出三手可交换规则(这是里程碑式的创举,专业规则的雏形诞生了) 1988年:在三手可交换的基础上,加入五手两打规则 1995年:三手可交换、五手两打、有禁手的专业规则正式形成 下面,我要详细说一下五子棋规则的演变历程。 原始五子棋传入日本之后,经过了漫长的探索,渐渐的,人们发现五子棋的先行一方具有极大优势(那时的日本五子棋高手就已经基本上探索出原始五子棋的先行必胜法了),于是,1899年,有人想出了用禁手的手段去限制黑方。当时,人们想到的是双方禁手。遗憾的是,双方禁手似乎并不能解决什么问题。于是,1903年,人们改双方禁手为单方禁手。不久,长连禁手和双四禁手也加入到有禁手规则之中,截至1931年,形成了完整的有禁手规则。 有禁手规则形成之后,在相当长的时间之内,五子棋又重新获得了竞技的平衡性。可是,经过了几十年的研究探索以及技术进步,慢慢的,人们又发现,即使是有禁手的五子棋,黑方的先行优势依然很大(事实上,有禁手五子棋依然先行必胜,只不过难度比无禁手先行必胜大了不少)。

五子棋棋谱(学习法)

专业五子棋学习网站 | 教室 | 定式 | 习题 | 对局 | 当前位置: 首页 > 五子棋教室 > 名家教程 > Ando论道 > 五子棋技巧图解(Ando) 时间:2010-07-22 08:22来源:五子茶馆作者:Ando 点击: 31599次 安东是公认的世界上五子棋棋力最强的棋手,他有一套成熟的五子棋技巧理论,非常 实用,本文就是这套五子棋技巧理论的图解。 安东是公认的世界上五子棋棋力最强的棋手,他有一套成熟的五子棋技巧理论,非常实用,本文就是这套五子棋技五子茶馆站长雪飞翻译。 五子棋技巧之一:该进攻时,不要防守。 法则:越是积极的进攻,越容易获得取胜的机会。 当你的对手走棋不积极时,你不必跟着他走棋,而是要考虑自己的棋是否可以进攻。 眠三,看起来为下一步进攻做好了准备;但如果你仔细计算,会发现白棋的进攻并没 我们认为白棋并不积极,黑棋可以落子11形成攻击。有很多棋手会跟着挡在11-C,虽 在当前情况下,完全没有必要,这个时候,你应该去进攻而不是防守。 白10应该走A或B点,这样的行棋会更加积极,如此,黑棋就不能走11位攻击了, 防守。 图1 五子棋技巧之二:进攻始于活二,要尽可能的利用好棋盘上的每一个子,多形成活二。

(图2-1)中,黑棋有不同的选择。黑若走在A点,虽然产生了两个二,但都不是活 毫无威力。而走在B点会产生两个活二,为后续攻击打下了基础。显然B点比A点更 总之,一个原则:一子落下,形成的活二越多越好。 图2-1 (图2-2)中,黑棋有四种选择(A、B、C、D)来构筑进攻,但D是最佳攻击点,因 个活二。 这跟做棋原则中,“一子三通点往往是好点”相通。 图2-2 五子棋技巧之三:在必须防守时,可以选择一个最助于自己进攻的防守点。 (图3-1)中白活三,黑有A、B两个防点来挡住白的活三。由此需要判断哪个防点, 击。很显然,走在A点,自己会形成连接,而白棋并无后续手段,由此在黑防A后, 棋,这样白就失掉先手。这里,防在A点比B点更有利。 图3-1

五子棋棋谱版

五子棋棋谱 五子棋开局棋分为两种: 直止、斜止,两种类型。 寒星溪月疏星首,花残二月并白莲, 雨月金星追黑玉,松丘新宵瑞山腥。 星月长峡恒水流,白莲垂俏云浦岚, 黑玉银月倚明星,斜月名月堪称朋。 口诀中前四句为直止,五至八句为斜止。 浦月--2花月--3新月—4水月--5雨月—6金星--7流星—8银月--9溪月—10 名月--11丘月—12岚月--13残月—14明星--15恒星—16瑞星--17松月—18长星--19寒星—20山月--21

开局分析 五子棋的开局是十分重要的。一般情况下,一局五子棋的着数在20至40着之间,因此,它的开局阶段是非常短暂的,大约在7、8着至10几着之间。在这一阶段的争夺中,双方的布局、应答将对以后的胜负起着关键的作用。一般来说,黑棋以攻为主,而白棋则以防为主。 由于连珠指定开局名称繁多,不易记忆,下面提供由京都五子棋少年队总教练彭建国先生编写的《彭氏口诀》,有助于记住职业开局的名称: 寒星溪月疏星首,花残二月并白莲, 雨月金星追黑玉,松丘新宵瑞山腥。 星月长峡恒水流,白莲垂俏云浦岚, 黑玉银月倚明星,斜月名月堪称朋。 二十六局先弃二,直指游星斜慧星。 这里还要指出在二十六种开局中有两个必胜开局和两个必败开局:必胜开局是直指的花月局和斜指的浦月局;必败开局是直指的游星局和斜指的彗星局。

浦月:白16冲是妙手。到白18时,黑棋在I5点三三禁手负。 浦月是先手必胜的珠形。白4是不太好的防守,最强的防守点是5、7、11、9等位置。以下黑棋走了5、7、9的位置,非常痛快,对于白10的防守,黑11活三相当棒。 对于白12的防守,黑13是败着,因白棋有反先手,以下形成反先手的再反先手的争夺。黑13不如在14的位置走跳三效果好,走完跳三后将来一定会形成连攻胜。 白14和黑15互相反先手后,下一手白16冲四是高着,黑17只能防守,于是,下一手白18一落盘即定了胜负。

五子棋有禁手规则(实图)

[交流讨论] 五子棋禁手规则详解(含复杂禁手) 首先,基本概念 参看《中国五子棋竞赛规则》,得到如下四个基本概念: 禁手的定义:对局中如果使用将被判负的行棋手段禁手的分类:三三禁手(黑棋一子落下同时形成两个或两个以上的活三,此子必须为两个活三共同的构成子)、四四禁手(黑棋一子落下同时形成两个或两个以上的冲四或活四)、长连禁手(黑棋一子落下形成一个或一个以上的长连)。 构成禁手的基本子力要素:活三(本方再走一着可以形成活四的三)、活四(有两个点可以成五的四)、冲四(只有一个点可以成五的四)、长连(在棋盘上的阳线和阴线任意一条线上,形成的5个以上同色棋子不间隔的相连) 关于禁手的规定:黑方五连与禁手同时形成,禁手失效,黑方胜 第二、基本子力要素的判断 (1)长连:在棋盘上的阳线和阴线任意一条线上,形成的5个以上同色棋子不间隔的 相连

如图:黑子的连接数目都超过了5个,都是长连,六连、七连、八连、最长可以达到九子连。图中字母A标示的两个长连基于一身,“×”标示的是最长的九子连,只能以“×” 位置为最后落子才能形成 (2)活四:有两个点可以成五的四

如图:黑棋下一手可以在A、B、C、D四处形成五连而取胜,且每个四都有两个点可 以成五取胜。因而,这两个都是活四 (3)冲四:只有一个点可以成五的四

如图:黑棋下一手可在矩形标记处形成五连而取胜,且每个四都有且只有一个点可以 成五取胜。因而,这里都是冲四 (4)活三:本方再走一着可以形成活四的三

如图:下一手黑棋可在所有“〇”处形成活四,因而这里的四个都真活三 (5)假活三:这是判断复杂禁手的最重要的环节,几乎所有“似是而非、似非而是”的禁手都是假活三在捣乱(详见复杂禁手的判断),下图几个典型的假活三一定要牢记在心

相关文档