改进版本的五子棋

本文详细介绍了如何实现一个五子棋游戏,包括棋盘和棋子的状态存储,以及电脑智能选择下棋位置的算法。游戏使用C++编写,涉及struct、class的使用,并实现了悔棋功能。通过计算棋盘上各位置的得分来决定电脑的最优落子位置,以达到最佳策略。
摘要由CSDN通过智能技术生成

#include "stdafx.h"

//定义点
struct Point
{
 int x ;
 int y ;
};

//定义棋子节点,用于悔棋
struct chessNode
{
 Point point;//棋子的棋盘位置
 int   status;//下子者 0为电脑 ,1为棋手,2为空白
 int   win[2][252];//用于存储当前节点的胜利组合数目
};

#define WHITECHESS 0   //白棋
#define BLACKCHESS 1   //黑棋
#define BLANK      2   //空白
class chess
{
private:

 //定义棋手和电脑的棋盘用于存放
 bool blackChessBoard[11][11][252];
 bool whiteChessBoard[11][11][252];


 //分别用于存放电脑和棋手在各点的得分
 int whiteChessGrade[11][11],blackChessGrade[11][11];

 //计算在每种组合中电脑或棋手分别占据几粒棋子
 //0代表黑棋,1代表白棋
 int win[2][252];


 //定义是否为第一步棋
 bool start;

 //记录电脑和棋手的下棋步数
 int whiteChessCount;
 int blackChessCount;

 //用以进行当前下棋者的转换 (黑棋<-> 白棋)
 bool white,black;

 //用于存放所有棋子的状态,位置和下子者,用于悔棋只用
 chessNode allChess[122];

 //是否游戏结束
 bool gameover;

 //获胜者   0为白棋 1为黑棋   2为游戏未结束 -1为平局
 int  winner;
 /*************功能函数**************************/

 //把棋盘初始化为空白
 int initBoard();
 //初始化分数
 void initialMark();
 //初始化获胜的组合数
 int initWinCompages();
  //记录所下棋子的状态
 void recordChessStatus(int horizontal , int vertical , int player);
 //计算某个胜利组合中已经被某方占据的棋子数放到win[2][252]的数组中去, 参数分别为水平,竖直位置,最后是记录落子的是电脑还是棋手
 int compute(int horizontal , int vertical , int player);
public:
 //定义棋盘
 int Board[11][11];
 
 //构造函数
 chess();
 //电脑通过计算确定下棋位置
 int whitePlayChess(int horizontal , int vertical);
 //棋手在棋盘中落子
 int blackPlayChess(int horizontal , int vertical);
 //悔棋,只能对己方上一步进行悔棋
 int contritionChess(int player);
  //判断是否已经游戏结束
  bool gameOver();
  //取得获胜者 0为电脑 1为棋手 2为棋局未结束 -1为平局
  int getWinner();

  // 决定电脑的下棋位置 返回落子的坐标
  Point decidePosition(void);
     //下棋者转换
  bool roleSwitch(void);

   //得到棋手落子的步数
 int getBlackChessCount()
 {
  return blackChessCount;
 }

 //得到电脑落子的步数
 int getWhiteChessCount()
 {
  return whiteChessCount;
 }
};


 /*****************************************************功能函数****************************************/

    /*************初始化函数************************/
 //把棋盘初始化为空白
 int chess::initBoard()
  {
   int i=0;
   
   //把棋盘初始化为空格
   for( i =0 ; i < 11 ;i++)
   {
    for(int j = 0 ; j < 11 ; j++)
     Board[i][j] = 2;
   }
   //初始化棋局
   for(i = 0 ; i<122 ; i++)
   {
    allChess[i].point.x = -1;
    allChess[i].point.y = -1;
    allChess[i].status  = BLANK ;
   }
   
   for(i = 0 ; i< 2 ; i++)
    for(int j = 0 ; j < 252 ; j++)
     win[i][j] = 0;

   for(i = 0 ; i <11; i++)
    for(int j =  0 ; j< 11 ; j++)
     for(int k = 0 ; k < 252 ; k++)
     {
       blackChessBoard[i][j][k] = false;
       whiteChessBoard[i][j][k] = false;
     }
   whiteChessCount = blackChessCount = 0;
   gameover = false ;

   winner = BLANK;
   return 0 ;
  }
 //初始化分数
 void chess::initialMark()
  {
   for(int i = 0 ;i < 11 ; i ++)
    for(int j = 0 ; j < 11 ; j++)
    {
     whiteChessGrade[i][j] = 0 ;
     blackChessGrade[i][j] = 0 ;
    }
  }
 //初始化获胜的组合数
 int chess::initWinCompages()
  {
   int i=0,j=0,k=0,num=0;
   //初始化水平方向的获胜组合数
   for(i = 0 ; i< 11; i++)
   {
    for(int j = 0 ; j < 7 ; j++)
    {
     for(k = 0; k < 5 ; k++)
     {
      blackChessBoard[i][j+k][num] = true;
      whiteChessBoard[i][j+k][num] = true;
     }
     num

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值