一字棋游戏c语言,计算机c语言实现一字棋游戏.doc

实验5 编程实现一字棋游戏

1实验目的:

(1)理解和掌握博弈树的启发式搜索过程;

(2)熟悉博弈中两种最基本的搜索方法——极大极小过程和过程;

(3)能够用VC编程语言设计简单的博弈游戏。

2实验要求:

用VC 编程实现一字棋,根据实验结果写出总结。

3 实验结果分析:

参考示例代码:

#include "StdAfx.h"

#include

#include

#include

#include

#include

using namespace std;

#define MAX_NUM 1000 //计算机获胜的标志

#define NO_BLANK -1001//人获胜的标志

#define TREE_DEPTH 3 //递归深度

#define NIL 1001 //根节点的函数走步评估值

class State //棋盘状态节点,一个State实例就是一个棋盘的状态节点,从而形成一颗树状结构

{

public:

int QP[3][3]; //当前棋盘数组

int e_fun; //评分结果

int child[9]; //当前棋盘状态下的后一步的所有状态节点

int parent; //当前棋盘状态下的父母节点下标

int bestChild;//在child[9]里e_fun最优的节点下标

};

class Tic

{

public:

int tmpQP[3][3]; //用于3层递归的临时棋盘

static int s_count;//叶子节点的静态总数

State States[MAX_NUM];//棋盘状态节点数组

Tic()

{

}

void init() //初始化棋盘,将各个位置的棋盘都置为0

{

s_count=0;

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

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

{

States[0].QP[i][j] = 0;

}

States[0].parent = NIL;

}

void PrintQP()//棋盘界面显示

{

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

{

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

{

cout<

}

cout<

}

}

int IsWin(State s) //判断当前的棋盘状态是否有令任何一方获胜

{

int i = 0;

for(i=0;i<3;i++)

{

if(s.QP[i][0]==1&&s.QP[i][1]==1&&s.QP[i][2]==1)return 1;

if(s.QP[i][0]==-1&&s.QP[i][1]==-1&&s.QP[i][2]==-1)return -1;

}

for(i=0;i<3;i++)

{

if(s.QP[0][i]==1&&s.QP[1][i]==1&&s.QP[2][i]==1)return 1;

if(s.QP[0][i]==-1&&s.QP[1][i]==-1&&s.QP[2][i]==-1)return -1;

}

if((s.QP[0][0]==1&&s.QP[1][1]==1&&s.QP[2][2]==1)||(s.QP[2][0]==1&&s.QP[1][1]==1&&s.QP[0][2]==1))return 1;

if((s.QP[0][0]==-1&&s.QP[1][1]==-1&&s.QP[2][2]==-1)||(s.QP[2][0]==-1&&s.QP[1][1]==-1&&s.QP[0][2]==-1))return -1;

return 0;

}

int e_fun(State s)//机器智能判定评价函数

{

bool flag=true;

int i = 0;

for( i=0;i<3;i++)

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

if(s.QP[i][j]==0)flag=false;

if(flag)return NO_BLANK;

if(IsWin(s)==-1)return -MAX_NUM;

if(IsWin(s)==1)return MAX_NUM;

int count=0;

for(i=0;i<3;i++)

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值