人工智能之人机博弈(1)

  每个程序猿的心中都有一个AI梦,而人机博弈是最简单的一种AI形式。

  看了阿尔法狗和李世石之战后,就一直在研究AI的一些知识,包括传统的人机博弈算法,以及阿尔法狗的蒙特卡罗加神经网络的算法。甚至还重温了高等数学的知识。

  为了给家里小朋友学棋,花了一个多月的休息的时间,开发了这个国际跳棋软件。支持人机对战,经专家们测试,AI棋力达到中等以上棋手的水平。

  对国际跳棋感兴趣的朋友,可以到下面地址下载试用一下。暂时不开源,等我完善了程序,再考虑开源出来。并写一些文章总结和分享开发的过程。

   下载地址: https://pan.baidu.com/s/1slOSvgh 

    1, 支持人机对弈,AI有超过10个以上的难度等级,经专家们认定,AI有中级以上棋手的棋力。

        2, 可以选择100格和64格两种模式。

        3,支持教学模式,可以自定义棋局,加载和保存棋谱。可以让AI破解残局。

        4 ,能清楚显示每步的吃子路线,棋局结束,可以回看对弈过程。

        5,非商业软件,完全免费,并在不断完善中。

   6,开发语言为C#,采用传统的人机博弈和静态估计的算法。具体实现我将会在后续文章中介绍。
        开发过程中,得到了中国国跳协会的老师和一些国际跳棋大师们很多帮助和支持,还有很多网友帮忙测试并给出好的建议,在此表示感谢。

 

后记 :

    最近我已经把该项目做成了一个微信的服务号,可以在服务号上直接跟AI下棋,AI棋力已经可以击败全国冠军级别的棋手了。

    还可以联网对战,已经有近万人关注使用该服务号,有国跳方面兴趣的朋友,可以通过关注下面公众号

 

  国际跳棋简介:

  跳棋是世界上最古老、最普及的智力游戏之一。关于跳棋的第一本书早在一五三一年就已经在威尼斯出版。在跳棋基础上发展起来的国际跳棋在许多国家受到欢迎。国际跳棋联合会已经有五十多个会员国。             

  世界棋类最发达的国家俄、美、英、法、德的教育专家都曾经指出:国际跳棋经过4千年发展,棋子外形一致,仅为两色,升王容易处理,这与没有地域性专用文字或图形样式的局限有关,规则明晰,棋理深邃,名谱众多,趣味盎然,能迅速开发学生智力,培养学生意志和品性。积累丰富的比赛经验,达到临危不乱、冷静细致、精密计算,最后时刻在极其困难的局面下战胜对手的能力。儿童会因为喜欢此项活动,进取意识强烈,变得更爱思考,处事更加有大局观,做事变得有条理。

 

转载于:https://www.cnblogs.com/echeng192/p/5637900.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以给您提供一个基本的五子棋人机博弈Python程序。以下是程序代码: ```python import numpy as np import random # 定义棋盘大小和赢法数组 BOARD_SIZE = 15 WIN_COUNT = 5 wins = np.zeros((BOARD_SIZE, BOARD_SIZE, 572), dtype=int) # 初始化赢法数组 def init_wins(): count = 0 # 横向赢法 for i in range(BOARD_SIZE): for j in range(BOARD_SIZE - WIN_COUNT + 1): for k in range(WIN_COUNT): wins[i][j+k][count] = 1 count += 1 # 纵向赢法 for i in range(BOARD_SIZE): for j in range(BOARD_SIZE - WIN_COUNT + 1): for k in range(WIN_COUNT): wins[j+k][i][count] = 1 count += 1 # 斜向赢法 for i in range(BOARD_SIZE - WIN_COUNT + 1): for j in range(BOARD_SIZE - WIN_COUNT + 1): for k in range(WIN_COUNT): wins[i+k][j+k][count] = 1 count += 1 # 反斜向赢法 for i in range(WIN_COUNT - 1, BOARD_SIZE): for j in range(BOARD_SIZE - WIN_COUNT + 1): for k in range(WIN_COUNT): wins[i-k][j+k][count] = 1 count += 1 return count # 初始化棋盘 def init_board(): board = np.zeros((BOARD_SIZE, BOARD_SIZE), dtype=int) return board # 人下棋 def human_play(board, x, y): if board[x][y] == 0: board[x][y] = 1 return True else: return False # AI下棋 def ai_play(board): empty_points = np.argwhere(board == 0) scores = [] for point in empty_points: score = 0 for i in range(len(wins[point[0]][point[1]])): if wins[point[0]][point[1]][i] == 1: score += 1 scores.append(score) max_score = max(scores) max_points = [empty_points[i] for i in range(len(scores)) if scores[i] == max_score] ai_point = random.choice(max_points) board[ai_point[0]][ai_point[1]] = 2 return ai_point[0], ai_point[1] # 判断是否结束 def is_gameover(board, x, y): for i in range(len(wins[x][y])): if wins[x][y][i] == 1: count = 0 for j in range(WIN_COUNT): if wins[x][y+j-WIN_COUNT+1][i] == 1 and board[x][y+j-WIN_COUNT+1] == board[x][y]: count += 1 if count == WIN_COUNT: return True count = 0 for j in range(WIN_COUNT): if wins[x+j-WIN_COUNT+1][y][i] == 1 and board[x+j-WIN_COUNT+1][y] == board[x][y]: count += 1 if count == WIN_COUNT: return True count = 0 for j in range(WIN_COUNT): if wins[x+j-WIN_COUNT+1][y+j-WIN_COUNT+1][i] == 1 and board[x+j-WIN_COUNT+1][y+j-WIN_COUNT+1] == board[x][y]: count += 1 if count == WIN_COUNT: return True count = 0 for j in range(WIN_COUNT): if wins[x+j-WIN_COUNT+1][y+j-WIN_COUNT+1+WIN_COUNT-1-2*(j-WIN_COUNT+1)][i] == 1 and board[x+j-WIN_COUNT+1][y+j-WIN_COUNT+1+WIN_COUNT-1-2*(j-WIN_COUNT+1)] == board[x][y]: count += 1 if count == WIN_COUNT: return True return False # 打印棋盘 def print_board(board): print(" ", end="") for i in range(BOARD_SIZE): print(i, end=" ") print("") for i in range(BOARD_SIZE): print(i, end=" ") for j in range(BOARD_SIZE): if board[i][j] == 0: print("+", end=" ") elif board[i][j] == 1: print("O", end=" ") elif board[i][j] == 2: print("X", end=" ") print("") # 主函数 def main(): count = init_wins() board = init_board() print_board(board) while True: x = int(input("请输入您下棋的横坐标:")) y = int(input("请输入您下棋的纵坐标:")) if human_play(board, x, y): if is_gameover(board, x, y): print_board(board) print("您赢了!") break ai_x, ai_y = ai_play(board) print("AI下棋:(%d, %d)" % (ai_x, ai_y)) print_board(board) if is_gameover(board, ai_x, ai_y): print("AI赢了!") break else: print("此处已有棋子,请重新输入。") if __name__ == '__main__': main() ``` 这个程序实现了基本的五子棋人机博弈,您可以在此基础上进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值