浅谈公平组合游戏IGC

IGC简介

一个游戏满足以下条件时被叫做IGC游戏

(前面三个字是自己YY的,不必在意)

  • 竞争性:两名玩家交替行动。
  • 公平性:游戏进程的任意时刻,可以执行的操作和操作者本人无关。
  • 唯一性:不能行动的玩家判负,不存在平局。

NIM游戏

内容

给定\(n\)堆石子,每堆有\(a_i\)个石头。规则是拿最后那块石头的人赢,(或者说没有石头拿的人输)。每次没人只能选择一堆石子并拿走,拿走多少不做限制,但是不能不拿。两人交替行动。问先手是否必胜。

定理

一个局面先手必胜,当且仅当(\(\zeta(A)\) 是我自己使用的记号,不是什么别的知识点)
\[
\zeta(A)={XOR}_ia_i\not=0
\]
证明如下:

​ 考虑使用数学归纳法,当没有石头供选择时,此时显然有\(\zeta(A)=0\),是必输的状态。

​ 此时对于上一个局面,显然有\(\zeta(A')\not = 0\),必要性得证。(不知道怎么表达我的意思)

​ 下证对于每个\(\zeta(P)\not=0\),一定存在一个合法操作使得\(\zeta(P' \subset P)=0\)

​ 假设\(\zeta(P)=k\),那么我们选择一个二进制最高位\(1\)和\(k\)的二进制最高位\(1\)在同一个位置上面的\(a_i\),我们可以得到\(a_i \text{xor } k<a_i\),那么也就是说我们可以把\(a_i\)拿到只剩下\(a_i\text{xor }k\)个石子,由于前面那个不等式,这个操作是合法的(石子变少了)。所以最后\(\zeta(P')=\zeta(P)\text{xor }k=0\)了。重复性得证。

​ Q.E.D

理解

证明应该已经够清楚了,乍一看感觉这个NIM博弈扩展性不是很强,貌似被局限在了整数和石子这种框架以内,我们好像很难对于其他的问题进行建模直接套在这个定理上面,但是:

  • 一个局面可以被抽象成一个数
  • 一个局面的后继局面可以取满\([0,a)\)

那么我们建模即可。是不是很棒。

来道例题吧。

【题解】Cutting Game

新Nim游戏

简要题解:在游戏正式开始前多了一个取很多堆的操作,取走很多堆可以看做对对手留一个NIM游戏的集合。那么要使得我们留下的集合的任意一个非空子集都\(\zeta(A)\not =0\),那么就是要求我们留给对手的自己都是线性无关的,这样就不存在\(\zeta(A)=0\)了,所以我们就取出尽量少的石子堆使得整个集合线性无关,显然可以贪心做吧...实际上叫拟阵,因为确实对于线性基的集合来说遗传性和增广性都挺容易满足的。(加入我取走这个大的石子堆可以防止和那个小一点的石子堆线性有关,那么我们不如取小的那一个,这是对这个拟阵的简单说明)。

有向图游戏

内容

有一个DAG,有一个唯一的起点,最开始棋子在这个起点上,你可以让棋子向该点任意一个出度走一步,当你走玩了最后可以走的那一步你就赢了(当你没有可以走的点你就输了)。两人交替行动。

定义1:mex运算

mex运算是对于正整数集合\(S\)的函数,具体计算方式为:
\[
\text{mex}(S)=min\{x|x\not \in S ,x \in \N\}
\]

定义2:SG函数

递归定义:

​ 在DAG上,设当前点为\(x\),设它的后继顶点集合为\(V\),那么
\[
\S(x)=\text{mex}\{\S(k),k\in V\}
\]
很明显当\(V=\varnothing\)(没有后继节点了)的时候\(\S(x)=0\)。

特别的,对于图\(G\),它的sg函数定义为这个图起点的sg函数值。

定理1:一个有向图游戏的胜负判断

一个有向图游戏局面必胜,当且仅当
\[
\S(A)\not = 0
\]
证明如下

当我们发现棋子点上没有出边时候,我们输了,此时显然有\(\S(A)=0\)。

那么我们上一个状态一定有\(\S(A') \ge 1\)。假如我们在这个\(A'\)局面上我们就是必胜的。

也就是说,假如\(\S(A)\not=0\)那么我们就可以把石子移动到那个\(\S(A')=0\)的局面上,我们就必胜了。

定理2:多个有向图游戏的和

\[
\S(G)=\oplus_i\S(G_i)
\]

胜负判断和前面那个一样。

证明如下

每个\(k=\S(G_i)\)表示后继条件一定可以取到\([0,k)\),这和NIM游戏取石子有什么区别...那就是和NIM一样啊!

以上只能算说明,有一些其他的细节可以自己想通的。

理解

建模应该是OIER必备技能吧,我们可以把各种ICG游戏全部抽象成一个DAG上的游戏

咕咕咕

[组合游戏与博弈论]【学习笔记】

写得很好,可以看看,很全。

提供一大堆例题

付费查看

浅谈公平组合游戏IGC的更多相关文章

  1. 浅谈设计模式--组合模式(Composite Pattern)

    组合模式(Composite Pattern) 组合模式,有时候又叫部分-整体结构(part-whole hierarchy),使得用户对单个对象和对一组对象的使用具有一致性.简单来说,就是可以像使用 ...

  2. 【博弈论】浅谈泛Nim游戏

    Nim游戏在ACM中碰到了,就拎出来写写. 一般Nim游戏:有n堆石子,每堆石子有$a_i$个,每次可以取每堆石子中$[0,a_i-1]$,问先手是否有必胜策略. 泛Nim游戏:每堆石子有$a_i$个 ...

  3. 今日文摘:浅谈 HTML5 的游戏化之路

    如今商业网站中用于广泛的HTML5无限下拉效果已经越来越受到游戏网站的喜爱.各个品牌为了打造专属自己的游戏特色,纷纷推出了模拟HTML5效果的品牌 站,且都起到了相当好的效果.可是从很多方面来说我们对 ...

  4. 浅谈LZSS与游戏图片破解

      业余游戏制作者最头疼的就是没有美工的支持了.很多业余游戏制作所使用的图片都是来自于网上的很有限的一些图片资源,然而这些图片并不能完整配套,所以业余游戏的画面往往显得单调或者搭配不协调(使用多个不属 ...

  5. 【博弈论】组合游戏及SG函数浅析

    目录 预备知识 普通的Nim游戏 SG函数 预备知识 公平组合游戏(ICG) 若一个游戏满足: 由两名玩家交替行动: 游戏中任意时刻,合法操作集合只取决于这个局面本身: 若轮到某位选手时,若该选手无合 ...

  6. 【Unity游戏开发】浅谈Lua和C#中的闭包

    一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...

  7. 【转载】浅谈游戏开发之2D手游工具

    浅谈游戏开发之2D手游工具 来源:http://www.gameres.com/459713.html 游戏程序 平台类型: iOS Android  程序设计: 其它  编程语言:   引擎/SDK ...

  8. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  9. 【Unity游戏开发】浅谈 NGUI 中的 UIRoot、UIPanel、UICamera 组件

    简介 马三最近换到了一家新的公司撸码,新的公司 UI 部分采用的是 NGUI 插件,而之前的公司用的一直是 Unity 自带的 UGUI,因此马三利用业余时间学习了一下 NGUI 插件的使用,并把知识 ...

随机推荐

  1. 配置php扩展redis

    环境说明: 系统版本    CentOS 6.9 x86_64 软件版本    nginx-1.12.2        php-5.5.38        yum安装redis3.2.11 php扩展 ...

  2. mpush 服务端配置 for windows 服务自动运行

    mpush 服务端配置 以下安装部分是参照官方的步骤, 一.安装jdk1.8并配置环境变量 示例:  http://www.cnblogs.com/endv/p/6439860.html 二.Wind ...

  3. 用MyEclipse2016 CI版创建一个SpringBoot程序

    之前先要在Eclipse里安装STS,步骤如下: 1.点击菜单Help->Install from Catalog 2.在弹出的对话框中点击Popular选项卡,在STS旁边点Install按钮 ...

  4. es6 - filter for-chrome

    'use strict'; let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]; // 除去取余2的 - es6 let es5OddNumbers = numbers ...

  5. python 奇技淫巧

    列表内部的字典的value进行排序 li = [{a:1,b:2,c:3,d:4},{e:5,f:6,g:7,h:8}] li = [{"day":2},{"day&qu ...

  6. Vue 事件修饰符 阻止默认事件

    阻止默认事件: <a v-on:click.prevent="doThat"></a>

  7. GMGC记实(上篇)

    24日和25日參加了2014年GMGC大会,整体感觉今年的大会比前2届大会办的更符合听众的需求.由于今年的大会开设了开发人员训练营的分会场.在成都这样一个CP占主流的IT圈中非常有意义.另一点就是在会 ...

  8. maven生成jar包

    改了部分cas源码,想重新生成jar包,只好试着脱离eclipse,学了一下maven打jar包的命令,记录如下: 1.首先下载maven (请注意自己的jdk版本,如果使用maven2建议使用jdk ...

  9. Centos7 搭建最新 Nexus3 Maven 私服

    Maven 介绍 Apache Maven 是一个创新的软件项目管理和综合工具.Maven 提供了一个基于项目对象模型(POM)文件的新概念来管理项目的构建,可以从一个中心资料片管理项目构建,报告和文 ...

  10. 创建标题栏,UINavigationBar的使用

    IOS 开发有关界面的东西不仅可以使用代码来编写,也可以使用Interface Builder可视化工具来编写.今天有个朋友问我这两个有什么区别,首先说说IB ,使用它编辑出来的控件其实底层还是调用代 ...