浅谈公平组合游戏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. VirtualBox修改现有虚拟磁盘大小

    VirtualBox装Ubuntu下载Android源代码分配的磁盘空间不够,修改磁盘大小必须进入VirtualBox安装目录使用VBoxmanager修改,执行: vboxmange modifyh ...

  2. php中const和static的区别和联系

    1.const是类中的常量,类外用define来定义常量2.const只可以修饰类的属性,不能修饰类的方法,static可以修饰属性,也可以修饰方法3.const和static都属于类本身,而不属于n ...

  3. Python内置模块和第三方模块

    1.Python内置模块和第三方模块 内置模块: Python中,安装好了Python后,本身就带有的库,就叫做Python的内置的库. 内置模块,也被称为Python的标准库. Python 2.x ...

  4. C# Socket.Connect连接请求超时机制

    介绍 您可能注意到了,.Net的System.Net.Sockets.TcpClient和System.Net.Sockets.Socket都没有直接为Connect/BeginConnect提供超时 ...

  5. js获取屏幕高度/浏览器高度

     1.window.screen.height window.screen.height:设备显示屏的高度 (1)分辨率为1080px的显示屏 (2)手机屏 2.window.screen.avail ...

  6. 懒人学习automake, Makefile.am,configure.ac(转)

    已经存在Makefile.am,如何生成Makefile? 步骤: [root@localhost hello]# autoscan .///在当前文件夹中搜索 [root@localhost hel ...

  7. 微软在GitHub上开放源代码

    https://github.com/MSOpenTech 点击链接:openFrameworks :https://github.com/openframeworks/openFrameworks ...

  8. 给mysql root用户设置密码

    使用其他用户进入数据库, 用select PASSWORD('你要设置的密码'), 然后直接update mysql.user set  mysql.user.Password='你PASSWORD( ...

  9. MVC基础操作

    C#-MVC基础操作-数据的展示及增删改.登录页面及状态保持一.数据展示1.View代码: <%@Page Language="C#" Inherits="Syst ...

  10. python char()和ord()

    通过help 查看相关函数的帮助文档 >>>help (chr) chr(...) chr(i) -> character Return a string of one cha ...