游戏简介:在九宫格内进行,如果一方抢先于另一方向(横、竖、斜)连成3子,则获得胜利。游戏中输入方格位置代号的形式如下:

设计前的思路:
游戏中,board棋盘存储玩家、计算机的落子信息,未落子处未EMPTY。由于人机对战,需要实现计算机智能性,下面是为这个计算机机器人设计的简单策略:
如果有一步棋可以让计算机机器人在本轮获胜,那就选那一步走。
否则,如果有一步棋可以让玩家在本轮获胜,那就选那一步走。
否则,计算机机器人应该选择最佳位置来走。
最佳位置就是中间,其次是四个角
定义第一个元组best_weizhi存储最佳方格位置:
按优劣顺序排序的下棋位置
best_weizhi= (4, 0, 2, 6, 8, 1, 3, 5, 7)
井字棋盘输赢判断规则只有8种方式。每种获胜方式都被写成一个元组,利用嵌套元组表达:
win = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6),(1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6))
代码:

#全局常量
best_weizhi= (4, 0, 2, 6, 8, 1, 3, 5, 7)
win = ((0, 1, 2),  (3, 4, 5), (6, 7, 8),  (0, 3, 6),(1, 4, 7),  (2, 5, 8), (0, 4, 8),  (2, 4, 6))
X = "X"
O = "O"
EMPTY = " "
#定义函数产生一个新的棋盘
def new_board():board = []for square in range(9):board.append(EMPTY)return board
#询问该谁下棋
def ask_yes_no(question):response = None#如果输入不是"y", "n",继续重新输入while response not in ("y", "n"): response = input(question).lower()return response
#询问谁先走,先走方为X,后走方为O
#函数返回电脑方、玩家的角色代号
def pieces():go_first = ask_yes_no("玩家你是否先走 (y/n): ")if go_first == "y":print("\n玩家你先走.")human = Xcomputer = Oelse:print("\n电脑先走.")computer = Xhuman = Oreturn computer, human
#显示棋盘
def display_board(board):board2=board[:]     #创建副本,修改不影响原来列表boardfor i in range(len(board)):if board[i]==EMPTY:board2[i]=iprint("\t", board2[0], "|", board2[1], "|", board2[2])print("\t", "---------")print("\t", board2[3], "|", board2[4], "|", board2[5])print("\t", "---------")print("\t", board2[6], "|", board2[7], "|", board2[8], "\n")
#输入你想下的位置数字
def ask_number(question, low, high):response = Nonewhile response not in range(low, high):response = int(input(question))return response
#产生可以合法走棋位置序列(也就是还未下过子位置)
def legal_moves(board):moves = []for i in range(9):if board[i] == EMPTY:moves.append(i)return moves
#判断输赢
def winner(board):for row in win:if board[row[0]] == board[row[1]] == board[row[2]] != EMPTY:winner = board[row[0]]return winner       #返回赢方#棋盘没有空位置if EMPTY not in board:return "True"         #"平局和棋,游戏结束"return False
#人走棋
def human_move(board, human):legal = legal_moves(board)move = Nonewhile move not in legal:move = ask_number("你走那个位置? (0 - 9):", 0, 9)if move not in legal:print("\n此位置已经落过子了")return move
#电脑走棋
def computer_move(board, computer, human):# make a copy to work with since function will be changing listboard = board[:]     #创建副本,修改不影响原来列表board#按优劣顺序排序的下棋位置best_weizhi# 如果电脑能赢,就走那个位置for move in legal_moves(board):board[move] = computerif winner(board) == computer:print("电脑下棋位置是" ,move)return move# 取消走棋方案board[move] = EMPTY# 如果玩家能赢,就堵住那个位置for move in legal_moves(board):board[move] = humanif winner(board) == human:print("电脑下棋位置是" ,move)return move#取消走棋方案board[move] = EMPTY#不是上面情况则,也就是这一轮时都赢不了则#从最佳下棋位置表中挑出第一个合法位置for move in best_weizhi:if move in legal_moves(board):print("电脑下棋位置是" ,move)return move
#转换角色
def next_turn(turn):if turn == X:return Oelse:return X
#主方法:
def main():computer, human = pieces()turn = Xboard = new_board()display_board(board)while not winner(board):if turn == human:move = human_move(board, human)board[move] = humanelse:move = computer_move(board, computer, human)board[move] = computerdisplay_board(board)turn = next_turn(turn)the_winner = winner(board)#游戏结束输出输赢信息if the_winner == computer:print("电脑赢!\n")    elif the_winner == human:         print("玩家赢!\n")elif the_winner == "True":    #"平局"        print("平局,和棋,游戏结束\n")# start the program
main()
input("按任意键退出游戏.")

在最后附上结果图:







至此一个简单的井字棋就完成了。

python小游戏井字棋(人机对战)相关推荐

  1. 用c语言编写的打字母游戏,用C语言编写小游戏——“井字棋”

    原标题:用C语言编写小游戏--"井字棋" 作者:Milo Yip 来源:知乎 原文链接:https://zhuanlan.zhihu.com/p/39581573 在 Milo Y ...

  2. C++ 小游戏 井字棋

    c++井字棋小游戏,里面有人机对战 和 双人对战 先创建一个游戏类 #pragma once #include<iostream> #include<vector> #incl ...

  3. javafx写一个小游戏-井字棋

    学了几天的javafx,感觉非常好用,自己写了一个小游戏,如有不足,希望大佬加以指正,谢谢. 1.先写UI界面 新建一个ui.fxml文件,用于显示ui界面 界面效果如下: 代码如下: <?xm ...

  4. vb小游戏——井字棋

    欠了一个星期的小游戏..我得补一补.以下效果图: 特别简单,其实学一段就能做的小东西,愣是给我拖了不知道多久orz 新手初学,错误和不好的习惯请一定要纠正我.Thanks♪(・ω・)ノ 以下实现方法: ...

  5. C语言小游戏井字棋(三子棋)

    1.自定义game.h头文件 #pragma once#include <stdio.h>//符号定义 #define Row 3 #define Col 3//函数声明//棋盘 void ...

  6. java 井字棋 人机_井字棋(人机对战版)

    1 #include 2 #include 3 4 const int ROW = 3;5 const int COL = 3;6 intchessboard[ROW][COL];7 intscore ...

  7. python井字棋游戏人机对战_用Python做一个井字棋小游戏

    井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...

  8. python井字棋_用Python做一个井字棋小游戏

    井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...

  9. 用IE网页学游戏-井字棋

    IE网页学游戏-井字棋 井字棋实现交互的简单小游戏,学习使用表格,理解javascript函数. 1.构造棋盘 用table元素的行列构造三行三列的表格.设置好120像素的井字棋背景,三个小图表示方格 ...

最新文章

  1. 各种字符串分拆处理函数.sql
  2. Nignx平滑升级(1.8.0-1.8.1)
  3. Exchange 2010迁移Exchange 2013(一)共存部署
  4. 20211222 AB和BA具有相同的非零特征值;如果A和B均方,且AB=I,那么BA=I,A、B均可逆
  5. 自定义类型转换器代码编写
  6. 苹果手机输入屏保后锁屏_修一块手机屏幕要7080元?
  7. 从软件交付看软件验收管理
  8. ICCV 2019 | 北邮提出高阶注意力模型,大幅改进行人重识别SOTA精度
  9. Ansible Inventory
  10. 由内而外 多项国产自主先进设计
  11. mnist数据集matlab导入,MNIST数据集转为matlab可读的mat格式
  12. uni-app、小程序项目分包经验之谈与天坑异常:RangeError: Maximum call stack size exceeded
  13. 利用ViewItems来管理我们ListView项之间的drag-and-drog
  14. InstallShield Professional,开发解决方案
  15. Sicily.1059. Exocenter of a Trian(求垂心,向量旋转)
  16. ubuntu20.04安装百度网盘
  17. android wear tizen,三星tizen和谷歌android wear对比 android wear和三星tizen哪个好
  18. 【每日新闻】诺基亚展示未来工厂:5G自动化机器人与人类和谐共处
  19. element 树形表格行列转换(行列转换系列2)
  20. 二叉查找树BST基本操作(一)

热门文章

  1. 推荐一款免费的内网穿透工具ngrok
  2. 什么是复制和交换成语?
  3. 网络协议总结(TCP,UDP,HTTP,HTTPS)
  4. OpenCV--直线拟合fitLine及求两直线对称轴
  5. blender中的灯光和相机
  6. signal信号捕捉
  7. SIGHUP信号相关
  8. CMDB建设补充:教你用django+drf 怎么去生成漂亮的API文档
  9. ANO V7上位机协议程序(新版加入DMA形式发送接收)
  10. ROS2+nav2+激光雷达导航(上)