AI算法象棋

简介: AI算法象棋

AI算法玩转象棋

毕加锁

于 2022-06-09 21:03:46 发布

135
收藏 11
文章标签: fpga开发 python
版权
大家好 我是毕加锁 (锁!)

今天教大家 python 象棋AI算法

一,棋子的着法

com.bylaw ={} 首先创建一个数组,用于存储该棋子处于某一点时所能走到着点

(1)车:

com.bylaw.c = function (x,y,map,my){

var d=[];

//左侧检索 若存在棋子且颜色不同则push过去并结束循环,否则一步步push

for (var i=x-1; i>= 0; i--){

if (mapy) {

if (com.mansmap[y].my!=my) d.push([i,y]);

break

}else{

d.push([i,y])

}

}

//右侧检索

for (var i=x+1; i <= 8; i++){

if (mapy) {

if (com.mansmap[y].my!=my) d.push([i,y]);

break

}else{

d.push([i,y])

}

}

//上检索

for (var i = y-1 ; i >= 0; i--){

if (mapi) {

if (com.mansmap[i].my!=my) d.push([x,i]);

break

}else{

d.push([x,i])

}

}

//下检索

for (var i = y+1 ; i<= 9; i++){

if (mapi) {

if (com.mansmap[i].my!=my) d.push([x,i]);

break

}else{

d.push([x,i])

}

}

return d;

}
算法分析:

分别向上,下,左,右四个方向搜索,若找到一个点且颜色与该棋子不同(敌对棋子),则将该点坐标记录在d数组中,若某一方向上没有其他棋子,将这一方向上所有坐标都记录在d数组中。简单来讲:就是将以车这个棋子为中心的十字上的坐标都记录在d数组中(你早这样说多好~,开始说那么多)

前提补充:

1,代码中的map:

com.initMap = [

['C0','M0','X0','S0','J0','S1','X1','M1','C1'],

[ , , , , , , , , ],

[ ,'P0', , , , , ,'P1', ],

['Z0', ,'Z1', ,'Z2', ,'Z3', ,'Z4'],

[ , , , , , , , , ],

[ , , , , , , , , ],

['z0', ,'z1', ,'z2', ,'z3', ,'z4'],

[ ,'p0', , , , , ,'p1', ],

[ , , , , , , , , ],

['c0','m0','x0','s0','j0','s1','x1','m1','c1']

];
这里的字符串代表每个棋子的key值:

com.keys = { //设定每类棋子的key值

"c0":"c","c1":"c",

"m0":"m","m1":"m",

"x0":"x","x1":"x",

"s0":"s","s1":"s",

"j0":"j",

"p0":"p","p1":"p",

"z0":"z","z1":"z","z2":"z","z3":"z","z4":"z","z5":"z",

"C0":"C","C1":"C",

"M0":"M","M1":"M",

"X0":"X","X1":"X",

"S0":"S","S1":"S",

"J0":"J",

"P0":"P","P1":"P",

"Z0":"Z","Z1":"Z","Z2":"Z","Z3":"Z","Z4":"Z","Z5":"Z",

}
2,my:

标记值:1代表红色方(这里指人。玩家永远操纵红色) ; -1代表AI

3,mapy与d.push(i)

左方向上搜索,y坐标不变,x坐标遍历,而体现在map当中(向上翻第一点),仔细看就会发现:第一个下标代表y值,第二个下标代表x值,其与坐标值正好相反

其他方向上以此类推。。。

(2)马

com.bylaw.m = function (x,y,map,my){

var d=[];

//1点钟方向 不绊马脚 1点不存在棋子或1点棋子颜色不同 push

if ( y-2>= 0 && x+1<= 8 && !play.mapy-1 &&(!com.mansmap[y-2] || com.mansmap[y-2].my!=my)) d.push([x+1,y-2]);

//2点

if ( y-1>= 0 && x+2<= 8 && !play.mapy &&(!com.mansmap[y-1] || com.mansmap[y-1].my!=my)) d.push([x+2,y-1]);

//4点

if ( y+1<= 9 && x+2<= 8 && !play.mapy &&(!com.mansmap[y+1] || com.mansmap[y+1].my!=my)) d.push([x+2,y+1]);

//5点

if ( y+2<= 9 && x+1<= 8 && !play.mapy+1 &&(!com.mansmap[y+2] || com.mansmap[y+2].my!=my)) d.push([x+1,y+2]);

//7点

if ( y+2<= 9 && x-1>= 0 && !play.mapy+1 &&(!com.mansmap[y+2] || com.mansmap[y+2].my!=my)) d.push([x-1,y+2]);

//8点

if ( y+1<= 9 && x-2>= 0 && !play.mapy &&(!com.mansmap[y+1] || com.mansmap[y+1].my!=my)) d.push([x-2,y+1]);

//10点

if ( y-1>= 0 && x-2>= 0 && !play.mapy &&(!com.mansmap[y-1] || com.mansmap[y-1].my!=my)) d.push([x-2,y-1]);

//11点

if ( y-2>= 0 && x-1>= 0 && !play.mapy-1 &&(!com.mansmap[y-2] || com.mansmap[y-2].my!=my)) d.push([x-1,y-2]);

return d;

}
算法分析:

当马处于一点时,可以走的最多情况有8种方向,分别讨论每个方向:如果不绊马脚,且该方向上那着点没有棋子或棋子颜色不同,则记录该着点

图例分析:

有点丑,用画图做的,不要在意这些细节

(三)相

com.bylaw.x = function (x,y,map,my){

var d=[];

if (my===1){ //红方 颜色不同,y的取值范围不同,且不能过河

//4点半 不绊象脚 4.5位置没子或棋子颜色不同 push

if ( y+2<= 9 && x+2<= 8 && !play.mapy+1 && (!com.mansmap[y+2] || com.mansmap[y+2].my!=my)) d.push([x+2,y+2]);

//7点半

if ( y+2<= 9 && x-2>= 0 && !play.mapy+1 && (!com.mansmap[y+2] || com.mansmap[y+2].my!=my)) d.push([x-2,y+2]);

//1点半

if ( y-2>= 5 && x+2<= 8 && !play.mapy-1 && (!com.mansmap[y-2] || com.mansmap[y-2].my!=my)) d.push([x+2,y-2]);

//10点半

if ( y-2>= 5 && x-2>= 0 && !play.mapy-1 && (!com.mansmap[y-2] || com.mansmap[y-2].my!=my)) d.push([x-2,y-2]);

}else{

//4点半

if ( y+2<= 4 && x+2<= 8 && !play.mapy+1 && (!com.mansmap[y+2] || com.mansmap[y+2].my!=my)) d.push([x+2,y+2]);

//7点半

if ( y+2<= 4 && x-2>= 0 && !play.mapy+1 && (!com.mansmap[y+2] || com.mansmap[y+2].my!=my)) d.push([x-2,y+2]);

//1点半

if ( y-2>= 0 && x+2<= 8 && !play.mapy-1 && (!com.mansmap[y-2] || com.mansmap[y-2].my!=my)) d.push([x+2,y-2]);

//10点半

if ( y-2>= 0 && x-2>= 0 && !play.mapy-1 && (!com.mansmap[y-2] || com.mansmap[y-2].my!=my)) d.push([x-2,y-2]);

}

return d;

}
算法分析:

因为相不能过河,所以要按颜色分情况讨论(不同颜色,y坐标不同)

而每种颜色的相都有四种可能着法,与马类似:如果不绊象脚, 着点没有棋子或棋子颜色不同,记录

图例分析:

(四)士

com.bylaw.s = function (x,y,map,my){

var d=[];

if (my===1){ //红方

//4点半

if ( y+1<= 9 && x+1<= 5 && (!com.mansmap[y+1] || com.mansmap[y+1].my!=my)) d.push([x+1,y+1]);

//7点半

if ( y+1<= 9 && x-1>= 3 && (!com.mansmap[y+1] || com.mansmap[y+1].my!=my)) d.push([x-1,y+1]);

//1点半

if ( y-1>= 7 && x+1<= 5 && (!com.mansmap[y-1] || com.mansmap[y-1].my!=my)) d.push([x+1,y-1]);

//10点半

if ( y-1>= 7 && x-1>= 3 && (!com.mansmap[y-1] || com.mansmap[y-1].my!=my)) d.push([x-1,y-1]);

}else{

//4点半

if ( y+1<= 2 && x+1<= 5 && (!com.mansmap[y+1] || com.mansmap[y+1].my!=my)) d.push([x+1,y+1]);

//7点半

if ( y+1<= 2 && x-1>= 3 && (!com.mansmap[y+1] || com.mansmap[y+1].my!=my)) d.push([x-1,y+1]);

//1点半

if ( y-1>= 0 && x+1<= 5 && (!com.mansmap[y-1] || com.mansmap[y-1].my!=my)) d.push([x+1,y-1]);

//10点半

if ( y-1>= 0 && x-1>= 3 && (!com.mansmap[y-1] || com.mansmap[y-1].my!=my)) d.push([x-1,y-1]);

}

return d;

}

算法分析:

士不能出九宫格,x,y值都有限制。按颜色分情况讨论。每种颜色各有4中可能着法:如果该着点没棋子或棋子颜色不同,记录

图例分析:

这个简单了,就不画图了~ ~ ~ ~

(五)将

com.bylaw.j = function (x,y,map,my){

var d=[];

var isNull=(function (y1,y2){

var y1=com.mans["j0"].y; //红帅的y

var x1=com.mans["J0"].x; //黑将的x

var y2=com.mans["J0"].y; //黑将的y

for (var i=y1-1; i>y2; i--){

if (mapi) return false; //将与将之间非空,有子

}

return true;

})();

if (my===1){ //红方

//下

if ( y+1<= 9 && (!com.mansmap[y+1] || com.mansmap[y+1].my!=my)) d.push([x,y+1]);

//上

if ( y-1>= 7 && (!com.mansmap[y-1] || com.mansmap[y-1].my!=my)) d.push([x,y-1]);

//老将对老将的情况

if ( com.mans["j0"].x == com.mans["J0"].x &&isNull) d.push([com.mans["J0"].x,com.mans["J0"].y]); //x相等,且中间为空,push黑将的坐标

}else{

//下

if ( y+1<= 2 && (!com.mansmap[y+1] || com.mansmap[y+1].my!=my)) d.push([x,y+1]);

//上

if ( y-1>= 0 && (!com.mansmap[y-1] || com.mansmap[y-1].my!=my)) d.push([x,y-1]);

//老将对老将的情况

if ( com.mans["j0"].x == com.mans["J0"].x &&isNull) d.push([com.mans["j0"].x,com.mans["j0"].y]); //push红帅的坐标

}

//右

if ( x+1<= 5 && (!com.mansmap[y] || com.mansmap[y].my!=my)) d.push([x+1,y]);

//左

if ( x-1>= 3 && (!com.mansmap[y] || com.mansmap[y].my!=my))d.push([x-1,y]);

return d;

}
算法分析:

将除了颜色不同导致y值不同外,还有种特殊情况:即老将见面。所以开始先写个函数,判断将与帅之间是否有其他棋子

接下来按颜色不同分情况讨论上下两种着法:重点 是y值的界定。以帅为例:帅在棋盘下方,y坐标只能取7,8,9.如果向下走,则取7,8,所以y值最大为8.上与其类似。而判断完着法之后还要判断是否老将见面的特殊情况:如果两者x坐标相等且中间没其他棋子,之间闪现过去抢人头~ ~ ~然后victory

(六),炮

com.bylaw.p = function (x,y,map,my){

var d=[];

//左侧检索

var n=0;

for (var i=x-1; i>= 0; i--){

if (mapy) { //碰到子

if (n==0){ //若是第一个子,不用管,跳出本次循环,标记位加1

n++;

continue;

}else{ //若不是第一个子,判断颜色若不同,push过去并结束循环

if (com.mansmap[y].my!=my) d.push([i,y]);

break

}

}else{ //若一直碰不到子,将子走到最左

if(n==0) d.push([i,y])

}

}

//右侧检索

var n=0;

for (var i=x+1; i <= 8; i++){

if (mapy) {

if (n==0){

n++;

continue;

}else{

if (com.mansmap[y].my!=my) d.push([i,y]);

break

}

}else{

if(n==0) d.push([i,y])

}

}

//上检索

var n=0;

for (var i = y-1 ; i >= 0; i--){

if (mapi) {

if (n==0){

n++;

continue;

}else{

if (com.mansmap[i].my!=my) d.push([x,i]);

break

}

}else{

if(n==0) d.push([x,i])

}

}

//下检索

var n=0;

for (var i = y+1 ; i<= 9; i++){

if (mapi) {

if (n==0){

n++;

continue;

}else{

if (com.mansmap[i].my!=my) d.push([x,i]);

break

}

}else{

if(n==0) d.push([x,i])

}

}

return d;

}

目录
相关文章
|
1天前
|
机器学习/深度学习 人工智能 算法
传统笔触与算法洪流:AI时代的艺术创作挑战
本文探讨了传统艺术与AI技术在创作中的共生关系及其对艺术生产力的赋能。研究表明,混合工作流能显著提升效率,而传统媒介带来的“意外美学”与AI生成的跨时空意象拼接相辅相成。AI通过快速生成视觉原型、优化色彩方案和提供即用元素,极大加速创作过程。同时,人机协同可实现风格融合、逆向思维训练及动态知识网络构建,但创作者需建立风格防火墙、验证机制和价值评估体系以守住创作主权。未来艺术教育将涵盖多层能力培养,具备跨维能力的艺术家市场竞争力将大幅提升。最终,真正成功的创作者是能够融合传统与科技、让艺术回归情感表达本质的“双脑创作者”。
22 0
|
14天前
|
数据采集 人工智能 编解码
算法系统协同优化,vivo与港中文推出BlueLM-V-3B,手机秒变多模态AI专家
BlueLM-V-3B是由vivo与香港中文大学共同研发的多模态大型语言模型,专为移动设备优化。它通过算法和系统协同优化,实现了高效部署和快速生成速度(24.4 token/s),并在OpenCompass基准测试中取得优异成绩(66.1分)。模型小巧,语言部分含27亿参数,视觉编码器含4000万参数,适合移动设备使用。尽管如此,低端设备可能仍面临资源压力,实际应用效果需进一步验证。论文链接:https://arxiv.org/abs/2411.10640。
37 9
|
16天前
|
机器学习/深度学习 自然语言处理 算法
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
116 0
|
20天前
|
人工智能 编解码 算法
DeepSeek加持的通义灵码2.0 AI程序员实战案例:助力嵌入式开发中的算法生成革新
本文介绍了通义灵码2.0 AI程序员在嵌入式开发中的实战应用。通过安装VS Code插件并登录阿里云账号,用户可切换至DeepSeek V3模型,利用其强大的代码生成能力。实战案例中,AI程序员根据自然语言描述快速生成了C语言的base64编解码算法,包括源代码、头文件、测试代码和CMake编译脚本。即使在编译错误和需求迭代的情况下,AI程序员也能迅速分析问题并修复代码,最终成功实现功能。作者认为,通义灵码2.0显著提升了开发效率,打破了编程语言限制,是AI编程从辅助工具向工程级协同开发转变的重要标志,值得开发者广泛使用。
7908 68
DeepSeek加持的通义灵码2.0 AI程序员实战案例:助力嵌入式开发中的算法生成革新
|
23天前
|
人工智能 算法
细思极恐,GPT-4竟串谋AI欺骗人类!哈佛PSU重磅揭秘算法共谋,AI教父预言正成真
近日,哈佛大学和宾夕大合著的重磅论文揭示,基于大型语言模型(如GPT-4)的算法可能自主串谋,损害消费者利益。研究发现,这些算法在虚拟市场中能迅速达成默契,提高价格以获取更高利润,类似于人类垄断行为。这一现象曾被DeepMind联合创始人Shane Legg预言,如今成为现实。论文呼吁加强对AI的监管,确保其透明性和可解释性,以防止潜在风险,并促进AI的可持续发展。
30 6
|
2月前
|
机器学习/深度学习 人工智能 算法
Transformer打破三十年数学猜想!Meta研究者用AI给出反例,算法杀手攻克数学难题
《PatternBoost: Constructions in Mathematics with a Little Help from AI》提出了一种结合传统搜索算法和Transformer神经网络的PatternBoost算法,通过局部搜索和全局优化交替进行,成功应用于组合数学问题。该算法在图论中的Ramsey数研究中找到了更小的反例,推翻了一个30年的猜想,展示了AI在数学研究中的巨大潜力,但也面临可解释性和通用性的挑战。论文地址:https://arxiv.org/abs/2411.00566
98 13
|
2月前
|
机器学习/深度学习 存储 人工智能
淘天算法工程师玩转《黑神话》,多模态大模型如何成为天命AI
淘天集团未来生活实验室的算法工程师们以ARPG游戏《黑神话:悟空》为平台,探索多模态大模型(VLM)在仅需纯视觉输入和复杂动作输出场景中的能力边界。他们提出了一种名为VARP的新框架,该框架由动作规划系统和人类引导的轨迹系统组成,成功在90%的简单和中等难度战斗场景中取得胜利。研究展示了VLMs在传统上由强化学习主导的任务中的潜力,并提供了宝贵的人类操作数据集,为未来研究奠定了基础。
|
3月前
|
机器学习/深度学习 人工智能 算法
Enhance-A-Video:上海 AI Lab 推出视频生成质量增强算法,显著提升 AI 视频生成的真实度和细节表现
Enhance-A-Video 是由上海人工智能实验室、新加坡国立大学和德克萨斯大学奥斯汀分校联合推出的视频生成质量增强算法,能够显著提升视频的对比度、清晰度和细节真实性。
148 8
Enhance-A-Video:上海 AI Lab 推出视频生成质量增强算法,显著提升 AI 视频生成的真实度和细节表现
|
3月前
|
人工智能 算法
AI+脱口秀,笑点能靠算法创造吗
脱口秀是一种通过幽默诙谐的语言、夸张的表情与动作引发观众笑声的表演艺术。每位演员独具风格,内容涵盖个人情感、家庭琐事及社会热点。尽管我尝试用AI生成脱口秀段子,但AI缺乏真实的情感共鸣和即兴创作能力,生成的内容显得不够自然生动,难以触及人心深处的笑点。例如,AI生成的段子虽然流畅,却少了那份不期而遇的惊喜和激情,无法真正打动观众。 简介:脱口秀是通过幽默语言和夸张表演引发笑声的艺术形式,AI生成的段子虽流畅但缺乏情感共鸣和即兴创作力,难以达到真人表演的效果。
|
机器学习/深度学习 人工智能 自然语言处理
让机器读懂视频:亿级淘宝视频背后的多模态AI算法揭秘
在移动互联网行业整体增速放缓的大背景下,短视频行业异军突起,成为“行业黑洞”抢夺用户时间,尽管移动互联网人口红利见顶,新的增长点难以寻觅,但中国短视频人均使用时长及头部短视频平台日均活跃用户均持续增常,在淘宝,短视频业务一直以来都是非常重要的业务,让我们一起揭秘亿级淘宝视频背后的多模态AI算法…
1509 0
让机器读懂视频:亿级淘宝视频背后的多模态AI算法揭秘

热门文章

最新文章