井字棋游戏

Python实现井字棋游戏 (人与AI对战)死都下不赢AI,只能打个平手... 阅读详情

游戏简介

三连棋游戏(两人轮流在印有九格方盘上划“+”或“O”字, 谁先把三个同一记号排成横线、直线、斜线, 即是胜者)。
程序提供随机算法和智能算法两种AI,随机算法使用随机数随意选择棋盘上的位置,智能算法通过对每隔落子位置权重的计算,选取最优的落子点。

游戏实现

#include <iostream>
#include <vector>
#include <ctime>
#include <string>
using namespace std;

//human takes X, Competitor takes O,
enum Checker{
    EMPTY, X, O
};

//base class of RandomAI, intermediateAI, Human
class Competitor{
public:
    //use move to avoid copy
    Competitor(Checker type, string name):checkerType(type), name(move(name)){
    }
    virtual  ~Competitor(){}
    //Competitor algorithms : random and intermediateAI
    virtual void desiredMove(vector<vector<Checker>> &checkBoard, Checker type) = 0;

    //checker type
    Checker checkerType;
    string name;
};

//move checker by random seed
class RandomAI:public Competitor{
public:
    RandomAI():Competitor(O,"RandomAI"){
        srand((unsigned int) time(nullptr));
    }

    void desiredMove(vector<vector<Checker>> &checkBoard, Checker type)override{
        checkerType = type;
        //traversing the whole board, get empty checker number
        int emptyCheckerNum = 0;
        for(auto &row: checkBoard){
            for(auto &checker: row){
                if(checker == EMPTY){
                    emptyCheckerNum++;
                }
            }
        }
        if(emptyCheckerNum == 0)
            return;

        //get random index
        int  randomIndex = rand()%(emptyCheckerNum) + 1;

        emptyCheckerNum = 0;
        for(auto &row: checkBoard){
            for(auto &checker: row){
                if(checker == EMPTY){
                    if(++emptyCheckerNum == randomIndex){
                        checker = checkerType;
                        return;
                    }
                }
            }
        }

        cout<<"RandomAI move failed!"<<endl;
    }
};

//each step to create a checkBoard with weight
//w_O2 means two O already in a line, so Competitor have to attack, hold max weight for Competitor
//w_X2 means two X already in a line. so Competitor must defence, hold second largest weight for Competitor
//w_X1 means only one X in the line
//w_O1 means only one O in the line
//w_Empty means it is empty in the line
class InterMediateAI: public Competitor{
public:
    //init weights
    InterMediateAI():Competitor(O,"IntermediateAI"),w_O2(10000),w_X2(1000),w_x(10),w_o(6),w_Empty(4){

    }
    void desiredMove(vector<vector<Checker >> &checkBoard, Checker type) override{
        checkerType = type;
        vector<int> temp(3,0);
        vector<vector<int>> levelBoard(3,temp);

        //count different situation
        for(int i = 0; i < checkBoard.size();i++){
            for(int j = 0; j < checkBoard[i].size();j++){
                //count weight in empty place
                if(checkBoard[i][j] == EMPTY){
                    //count weights of same row
                    int res = countWeight(checkBoard[i][0],checkBoard[i][1], checkBoard[i][2]);
                    if(res != -1){
                        levelBoard[i][j] = levelBoard[i][j] + res;
                    }

                    //count weights of same column
                    res = countWeight(checkBoard[0][j],checkBoard[1][j],checkBoard[2][j]);
                    if(res != -1){
                        levelBoard[i][j] = levelBoard[i][j] + res;
                    }

                    //in the mainDiagonal
                    if((i == 0 && 
井字棋游戏 代码分析 井字棋游戏 开发工具:Visual C++.NET 2003程序员:黄江斌程序功能:井字棋小游戏,人机对战版时间:2005年8月28日 界面如下图: 程序分析: CtictactoeView::CtictactoeView()//程序中关键变量赋初值{       // TODO: 在此处添加构造代码       int i , j;       for( i = 0 ; i            阅读详情

相关推荐

unity实现井字棋小游戏

unity实现井字棋小游戏 前言 这是中山大学数据科学与计算机学院2019年3D游戏编程与设计的第二次作业 所有项目与代码已上传至github当中,欢迎大家访问。 github个人主页: https://starashzero.github.io 3D游戏编程与设计主页: https://starashzero.github.io/3DGameDesign 本次作业项目地址: https://gi...

qq_20549085的博客 837

机器学习(井字棋程序)

通过训练机器,使其学会下棋,井字棋。 目标函数是棋盘状态到一个实数的映射;估计的目标函数是一个线性函数。学习的过程其实就是不断的调整权值wi,用LMS算法调整权值。

TicTacToe小游戏

WPF+MVVM编写的TicTacToe三连棋游戏, 三连棋游戏(两人轮流在印有九格方盘上划“+”或“O”字, 谁先把三个同一记号排成横线、直线、斜线, 即是胜者)。

tictactoe游戏

这是一个简单的tictactoe游戏,包含了一定的逻辑思路,希望可以帮助到大家,代码仅供参考

用Java实现的简单井字棋游戏

以一字棋游戏为例,设计的一个3行3列的棋盘,自己给出估价函数,采用极大极小搜索方法。采用人机对弈方式,一方走步后等待对方,对弈过程的棋局变化在屏幕上显示。

电压抬升电路设计

一、实验目的 掌握集成运放电压放大电路设计基本方法。 掌握基本仪器使用方法(电源、信号发生器、示波器)。 二、实验内容及结果 实验内容 基于集成运放设计一传感器信号采集电路。传感器输出信号在±50mV,频率为100Hz以内,模数转换器允许输入电压在0~5V,要求设计传感器与模数转换器之间的信号采集电路,实现传感器信号放大10倍,并适合模数转换器的输入。模数转换器的输入电阻为1KHz,设计电路时,可使用1KHz电阻作为信号采集电路负载,代替模数转换器。 实验具体要求如下: (1)确定电路形式,说明电压转

Safaearth的博客 4万+

Fastjson2 2.0.26反序列化漏洞深度剖析:从原理到PoC构造

本文深度剖析了Fastjson2在2.0.26及之前版本中存在的反序列化漏洞。该漏洞允许攻击者通过构造包含恶意TemplatesImpl对象的JSONArray,并利用BadAttributeValueExpException触发,在反序列化过程中实现远程代码执行。文章从漏洞原理、PoC构造、利用链分析到防御建议,提供了全面的技术解读,帮助开发者和安全人员理解其危害并采取应对措施。

d3e4f的博客 1051

YOLOv5+Astra Pro Plus深度相机:手把手教你实现实时目标检测(附ROS配置技巧)

本文详细介绍了如何将YOLOv5目标检测算法与Astra Pro Plus深度相机结合,构建实时目标检测系统。内容涵盖从硬件选型、环境搭建、ROS配置到YOLOv5部署与深度信息融合的完整流程,并分享了性能优化、避障算法等实战技巧,帮助开发者在机器人视觉等场景中快速实现智能感知应用。

weixin_28292761的博客 389

Jupyter notebook教程系列(二)Jupyter notebook的基本用法

Jupyter notebook的基本使用   一. 主页面 如图1-1 我们先介绍一下主页面上的内容: 1.Files页面是用于管理创建文件相关类目的。 2.Running页面主要展示的是当前正在运行当中的终端和“ipynb”格式的notebook。若想要关闭已经打开的终端和“ipynb”格式的notebook,仅仅关闭其页面是无法彻底退出程序的,需要在Running页面点击其对...

dlhlSC的博客 1438

Android 13.0仿ios的hotseat效果修改hotseat样式

在13.0系统产品rom定制化开发中,在项目需求的需要,系统原生Launcher的布局样式很一般,所以需要重新设计ui对布局样式做调整,产品在看到 ios的hotseat效果觉得特别美观,所以要仿ios一样不需要横屏铺满的效果 居中显示就行了,所以就要看hotseat的具体布局显示了

安卓兼职framework和app工程师的博客 1144

广州吉欧电子科技有限公司安卓开发工程师岗位 - 技术核心、职责详解与面试指南

广州吉欧电子科技有限公司招聘安卓开发工程师,该岗位可接收优秀应届生。岗位职责包括:1)负责安卓应用架构设计与开发,确保稳定性和可扩展性;2)功能模块编码实现与测试;3)性能优化与用户体验提升;4)后端接口对接;5)系统版本适配;6)用户反馈处理迭代;7)特殊要求熟悉RTK高精度定位技术原理及使用。该岗位要求扎实的安卓开发技术、良好的架构设计能力、性能优化经验,以及特定领域的RTK专业知识,是一个技术全面且具有专业特色的开发岗位。

郑伟强dev的专栏 154

uniapp:在map地图组件上添加控件,在地图上添加浮层展示自定义按钮或元素,uniApp如何在Map组件地图上添加悬浮在上面的图标/图片(全平台兼容安卓苹果app、H5网页、微信小程序、nvue)

uni-app的map添加控件问题,uniapp实现地图展示控件,uniapp小程序如何在map组件上增加按钮,uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,Uniapp腾讯地图添加控件,uniapp百度地图添加控件,地图上展示控件并可以点击,在地图上展示控件信息,uniapp map地图怎么向地图上增加工具栏,使用cover-view将控件在地图上展示,解决uniapp map上添加浮层无法显示问题,不显示怎么办,css样式不生效,地图等最高层

✅ 精选推荐文章 3231

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 常用排序算法
下一篇: shared_ptr实现stock
陆标
博客等级 码龄9年 100粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值