python井字棋代码_python井字棋算法及代码
井字棋盘看起来像一个大的井字符号(#),有9 个空格,可以包含X、O 或
关于落子问题
由于只能采用键盘输入,所以需要对棋盘进行坐标表示;
即直接用1-9个9个数字来表示位置,
7|8|9
-+-+-
4|5|6
-+-+-
1|2|3
其索引顺序与数字键盘上的数字键排列一致,下棋时看着数字键下,较为简便。
计算机的算法--寻找最佳落子位置
首先简单的将棋盘划分为三个部分——中心(1),角(4),边(4)。
中心虽然只有一个但却不是最重要的,三个部分落子的优先顺序依次为:角、中心、边。
因此,井字棋的计算机算法计算最佳落子位置的顺序如下:
1 直接落子获胜
2 阻止玩家获胜
3 在角上落子
4 在中心落子
5 在边上落子
游戏流程
1、开始
2、选子 X或者O
3、随机先手
4、轮流下棋
5、是否分出胜负
5.1 分出胜负 跳到6
5.2 未分出胜负 跳到4
6、再来一局
6.1是, 跳到2
6.2否, 退出
游戏代码:
import random
def printBoard(borad):
print(borad[7] + '|' + borad[8] + '|' + borad[9])
print('-+-+-')
print(borad[4] + '|' + borad[5] + '|' + borad[6])
print('-+-+-')
print(borad[1] + '|' + borad[2] + '|' + borad[3])
'''printBoard 定义了棋盘打印输出函数
与数字键盘排列一致'''
def inputPlayerLetter():
'''#让玩家选择棋子
返回一个列表,显示玩家和电脑的棋子类型
'''
letter = ''
while not (letter == 'X' or letter == 'O'):
print('Do you want to be X or O?')
letter = input().upper()
if letter == 'X':
return ['X', 'O']
else:
return ['O', 'X']
def whoGoesFirst():
'''随机先手'''
if random.randint(0, 1) == 0:
return 'Computer'
else:
return 'Player'
def playAgain():
'''再玩一次?'''
print('Do you want to play again?(yes or no)')
return input().lower().startswith('y')
def makeMove(board, letter, move):
'''落子'''
board[move] = letter
def isWinner(board, occupy):
判断是否获胜
return ((board[1] == occupy and board[2] == occupy and board[3] == occupy) or
(board[4] == occupy and board[5] == occupy and board[6] == occupy) or
(board[7] == occupy and board[8] == occupy and board[9] == occupy) or
(board[1] == occupy and board[4] == occupy and board[7] == occupy) or
(board[2] == occupy and board[5] == occupy and board[8] == occupy) or
(board[3] == occupy and board[6] == occupy and board[9] == occupy) or
(board[1] == occupy and board[5] == occupy and board[9] == occupy) or
(board[3] == occupy and board[5] == occupy and board[7] == occupy))
def getBoardCopy(board):
复制一份棋盘给电脑落子使用
depuBoard = []
for i in board:
depuBoard.append(i)
return depuBoard
def isSpaceFree(board, move):
判断这个位置是否有子,无子返回True
return board[move] == ' '
def getPlayerMove(board):
move = ' '
while move not in '1 2 3 4 5 6 7 8 9'.split() or not isSpaceFree(board, int(move)):
print('What is your next move?(1-9)')
move = input()
return int(move)
def choosePossibleMoverFromList(board, moveList):
随机返回一个可以落子的坐标,若无子可下,则返回None
possibleMoves = []
for i in moveList:
if isSpaceFree(board, i):
possibleMoves.append(i)
if len(possibleMoves) != 0:
return random.choice(possibleMoves)
else:
return None
def getComputerMove(board, computerLetter):
确定电脑的落子位置
if computerLetter == 'X':
playerLetter == 'O'
else:
playerLetter == 'X'
'''先判断电脑方能否通过一次落子直接获得游戏胜利'''
for i in range(1, 10):
copy = getBoardCopy(board)
if isSpaceFree(copy, i):
makeMove(copy, computerLetter, i)
if isWinner(copy, computerLetter):
return i
'''判断玩家下一次落子是否获胜,若能,则再该点落子'''
for i in range(1, 10):
copy = getBoardCopy(board)
if isSpaceFree(copy, i):
makeMove(copy, playerLetter, i)
if isWinner(copy, playerLetter):
return i
'''若角上能落子,则在角上落子'''
move = choosePossibleMoverFromList(board, [1, 3, 5, 7])
if move != None:
return move
'''若中心能落子,则在中心落子'''
if isSpaceFree(board, 5):
return 5
'''若边上能落子,则在边上落子'''
return choosePossibleMoverFromList(board, [2, 4, 6, 8])
def isBoardFull(board):
''' 如果棋盘满了,返回True'''
for i in range(1, 10):
if isSpaceFree(board, i):
return False
return True
print('Welcome to the TicTacToe game!')
while True:
update board
theBoard = [' '] * 10
playerLetter, computerLetter = inputPlayerLetter()
turn = whoGoesFirst()
print('The ' + turn + ' will go first.')
gameIsPlaying = True
while gameIsPlaying:
if turn == 'Player':
# 玩家回合
printBoard(theBoard)
move = getPlayerMove(theBoard)
makeMove(theBoard, playerLetter, move)
if isWinner(theBoard, playerLetter):
printBoard(theBoard)
print('Wow!!!You win the game!!!')
gameIsPlaying = False
else:
if isBoardFull(theBoard):
printBoard(theBoard)
print('The game is tie')
break
else:
turn = 'Computer'
else:
# 电脑回合
move = getComputerMove(theBoard, computerLetter)
makeMove(theBoard, computerLetter, move)
if isWinner(theBoard, computerLetter):
printBoard(theBoard)
print('Oh!,The computer win!,You lose.')
gameIsPlaying = False
else:
if isBoardFull(theBoard):
printBoard(theBoard)
print('The game is tie')
break
else:
turn = 'Player'
if not playAgain():
break
python井字棋代码_python井字棋算法及代码相关推荐
- 石头剪刀布python代码_Python实现的石头剪子布代码分享
我之前写过一篇基于JS的石头剪子布程序 <JavaScript实现的石头剪刀布游戏源码分享>,今天又基于Python写了一个实例,这里边的算法有点特殊但一时也想不到一个好的算法规律. 代码 ...
- python中注释的作用_Python 注释作用写法及示例代码
1、代码注释的作用 1) 注释可用于解释Python代码. 2) 注释可用于使代码更具可读性. 3) 注释可用于在测试代码时阻止执行. 2、单行注释 注释以开头#,Python将忽略它们: 例如,#T ...
- fifo算法c语言程序代码,c语言实现fifo算法及代码
C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. 尽管C语言提供了许多低级处理的功 ...
- python字典读取特定值_python 获取字典特定值对应的键的实现
对于字典,通过"键"获得"值"非常简单,但通过"值"获得"键"则需绕些弯子. 一.通用:自行定义函数方式 假设: 输入: ...
- python同时注释多行代码_python怎么同时对多行代码进行注释
学会向程序中添加必要的注释,也是很重要的.注释不仅可以用来解释程序某些部分的作用和功能(用自然语言描述代码的功能),在必要时,还可以将代码临时移除,是调试程序的好帮手. 当然,添加注释的最大作用还是提 ...
- python 批量下载 代码_Python + Selenium +Chrome 批量下载网页代码修改
Python + Selenium +Chrome 批量下载网页代码修改 主要修改以下代码可以调用 本地的 user-agent.txt 和 cookie.txt 来达到在登陆状态下 批量打开并下载网 ...
- python动态数组的最大值_python实现动态数组的示例代码
实现一个支持动态扩容的数组并完成其增删改查 #通过python实现动态数组 """ 数组特点: 占用一段连续的内存空间,支持随机(索引)访问,且时间复杂度为O(1) 添加 ...
- 网页爬虫python代码_Python 爬虫web网页版程序代码
一:网页结构分析 二:代码实战#! /usr/bin/env python2 # encoding=utf-8 #BeautifulSoup需要安装 MySQLdb import sys,os,re, ...
- 基于python的视频监控系统_Python远程视频监控程序的实例代码
老板由于事务繁忙无法经常亲临教研室,于是让我搞个监控系统,让他在办公室就能看到教研室来了多少人.o(>﹏<)o||| 最初我的想法是直接去网上下个软件,可是找来找去不是有毒就是收费,无奈技 ...
最新文章
- [高中作文赏析]假如真的有时光隧道
- 《动手学深度学习》中文第二版预览版发布
- JavaScript之作用域链
- python三维图的坐标_六维图见过么?Python 画出来了
- 如果企业网站长时间没有排名可以从多个方面进行分析
- matlab生成实指数序列、matlab茎状图
- 关于js的回调函数的一点看法
- 【云上ELK系列】Logstash迁移Elasticsearch数据方法解读
- js 去除字符串左右两边的空格
- 怎么样建立局域网?一般局域网需要几台电脑才可以?
- 当甲骨文思维遇上谷歌精神,谷歌云将走向何方?
- android 缺半圆形头像,圆形头像设计
- 2018年需要记住的5个区块链事实
- ffmpeg 查看bayer rg8 \ bg8 像素格式图片方法
- java aud 转mp3_音频格式转换:微信语音aud格式转成wav格式
- 常量(Constant)
- 一个单点登录系统设计
- 由LG 的G2手机浅析国产旗舰机的方向
- java的几个生命周期(部分简单总结)
- 快速听懂英文数字和中英文数字转换教程