1. 游戏思路和流程图

实现功能,现实生活中的井字棋玩法

游戏流程图

2. 使用模块和游戏提示

import random
def game_info():
print('欢迎来到井字棋游戏')
print('输入数字1~9进行下棋')

3. 棋盘显示

def display_board(checkerboard):
'''棋盘显示'''
print(' '.join(checkerboard[6:9]))
print(' '.join(checkerboard[3:6]))
print(' '.join(checkerboard[:3]))

4. 用户下棋输入限制

def chess_limited(number,checkerboard):
'''用户落棋限制
:param number 用户输入
:param checkerboard 棋盘列表
:return 返回验证过的用户输入'''
while True:
if not number.isdigit():
print('请输入整数数字')
elif number not in '1 2 3 4 5 6 7 8 9'.split():
print('请输入1~9之间的数字')
elif checkerboard[int(number)-1]!='_':
print('棋盘上已经有棋子了')
else:
break
number = input()
return int(number)

5. 双选验证

def Double_choice(a,b,hint):
'''双选择验证函数
:param a 第一个选项值
:param b 第二个选项值
:param hint 选项信息
:return 返回输入值'''
choice=''
while choice.lower() !=a and choice.lower() !=b:
print(hint)
choice=input()
return choice

6. 获胜验证

def referee(choice,checkerboard):
'''判断谁胜利了还是平局'''
if checkerboard[0] == choice and checkerboard[1] == choice and checkerboard[2] == choice:
return True #123
if checkerboard[3] == choice and checkerboard[4] == choice and checkerboard[5] == choice:
return True #456
if checkerboard[6] == choice and checkerboard[7] == choice and checkerboard[8] == choice:
return True #789
if checkerboard[0] == choice and checkerboard[3] == choice and checkerboard[6] == choice:
return True #147
if checkerboard[1] == choice and checkerboard[4] == choice and checkerboard[7] == choice:
return True #258
if checkerboard[2] == choice and checkerboard[5] == choice and checkerboard[8] == choice:
return True #369
if checkerboard[2] == choice and checkerboard[4] == choice and checkerboard[6] == choice:
return True #357
if checkerboard[0] == choice and checkerboard[4] == choice and checkerboard[8] == choice:
return True #159
return False

6. 用户落子处理

def user_play(user_choice,checkerboard):
'''用户选择落子点
:param user_choice 用户所选棋子
:param checkerboard 棋盘列表
:param 返回用户落子完后的棋盘列表'''
print('请你选择落子点')
number=chess_limited(input(),checkerboard)
checkerboard[number-1]=user_choice
return checkerboard

7. 电脑落子处理

def compute_play(compute_choice,checkerboard):
'''电脑选择落子点(电脑ai)
:param compute_choice 电脑所选的棋子
:param checkerboard 棋盘
:return 电脑下过的棋盘'''
copy_win=compute_win(compute_choice,checkerboard)
if copy_win: #电脑获胜
checkerboard=copy_win
return checkerboard
user_win=prevent_user_win(compute_choice, checkerboard)
if user_win: #阻止用户获胜
checkerboard = user_win
return checkerboard
angle=choice_random(compute_choice,checkerboard,[0,2,6,8])
if angle: #角落点
checkerboard =angle
return checkerboard
center=choice_random(compute_choice,checkerboard,[4])
if center: #中心落点
checkerboard = center
return checkerboard
side = choice_random(compute_choice, checkerboard, [1, 3, 5, 7])
if side: #边落点
checkerboard =side
return checkerboard
return checkerboard

8. 电脑获胜

def compute_win(compute_choice,checkerboard):
'''获胜的方法(模拟算法)
:return 获胜的棋盘, False 没有可落子的地方'''
compute_choice=compute_choice.lower()
for i in range(9):
copy_board = checkerboard.copy()
if copy_board[i]=='_':
copy_board[i]=compute_choice
if referee(compute_choice,copy_board):
checkerboard[i] = compute_choice
return checkerboard
return False

9. 阻止玩家获胜

def prevent_user_win(compute_choice,checkerboard):
'''阻止玩家获胜(模拟玩家获胜下子)
:return 阻止用户获胜的棋盘 False 没有可以阻止的落子'''
user_choice = 'O' if compute_choice.lower() == 'x' else 'X'
user_choice=user_choice.lower()
for i in range(9):
copy_board = checkerboard.copy()
if copy_board[i] == '_':
copy_board[i] = user_choice
if referee(user_choice, copy_board):
#成功阻止玩家获胜....
checkerboard[i]=compute_choice
return checkerboard
return False

10. 电脑随机落点

def choice_random(compute_choice,checkerboard,choice_list):
'''随机下棋点'''
for i in choice_list:
if checkerboard[i]=='_':
checkerboard[i]=compute_choice
return checkerboard
return False

11. 游戏主程序

def game_start(user_choice,sequence_flag):
'''游戏核心处理
:param user_choice 用户所选棋子
:param sequence_flag 决定先后手'''
checkerboard=['_' for i in range(9)] #棋盘列表
compute_choice = 'O' if user_choice.lower()=='x' else 'X'
if sequence_flag: #显示棋盘
print('玩家先走')
else:
checkerboard=compute_play(compute_choice,checkerboard) #电脑先走棋盘
print('电脑先走')
while True:
display_board(checkerboard)
checkerboard = user_play(user_choice, checkerboard)
if referee(user_choice,checkerboard):
print('用户赢了...')
display_board(checkerboard)
break
checkerboard = compute_play(compute_choice, checkerboard)
if referee(compute_choice,checkerboard):
print('电脑赢了...')
display_board(checkerboard)
break
if '_' not in checkerboard:
print('平局...')
display_board(checkerboard)
break

12. 游戏外壳

def game_shell():
'''外壳程序'''
game_info() # 游戏开始提示
user_choice = Double_choice('x', 'o', hint='请选择你的棋子 X or O')
sequence_flag = random.randint(0, 1)
game_start(user_choice,sequence_flag)
while True:
message='你想在玩一次吗(Y or N)'
again_flag=Double_choice('y','n',message)
if again_flag=='n':
break
if sequence_flag:
sequence_flag=0
else:
sequence_flag=1
game_start(user_choice,sequence_flag)

13. 运行游戏

game_shell()

python学习途径

本游戏参考书本 <<Python游戏编程快速上手>>

友情推荐:  猿人学Python【https://www.yuanrenxue.com/】 由一群工作十余年的老程序员结合实际工作经验所写的Python教程。

python 游戏(井字棋)的更多相关文章

  1. Pascal小游戏 井字棋

    一个很经典的井字棋游戏 Pascal源码Chaobs奉上 注意:1.有的FP版本不支持汉语,将会出现乱码.2.别想赢电脑了,平手不错了. 井字过三关: program TicTacToe; uses ...

  2. Java 小游戏 - 井字棋 v1.0 (初步完成) (2018.4.16更新)

      井字棋游戏初步完成 实现功能:输入位置数据->打印棋盘->判断是否胜利->继续游戏/退出游戏 缺点:没有清屏函数   判断胜利方法太过无脑    package MYGAME; ...

  3. C++小游戏——井字棋

    #include<cstdio> #include<windows.h> #include<ctime> int main() { srand(time(NULL) ...

  4. python 井字棋(Tic Tac Toe)

    说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码也是本人逐字逐句敲的. minimax算法还没完全理解,所以参考了这里的代码,并作了修改. 特点 可以选 ...

  5. [CareerCup] 17.2 Tic Tac Toe 井字棋游戏

    17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏, ...

  6. [C++] 井字棋游戏源码

    TicTac.h #define EX 1 //该点左鼠标 #define OH 2 //该点右鼠标 class CMyApp : public CWinApp { public: virtual B ...

  7. [游戏学习22] MFC 井字棋 双人对战

    >_<:太多啦,感觉用英语说的太慢啦,没想到一年做的东西竟然这么多.....接下来要加速啦! >_<:注意这里必须用MFC和前面的Win32不一样啦! >_<:这也 ...

  8. [HTML5实现人工智能]小游戏《井字棋》发布,据说IQ上200才能赢

    一,什么是TicTacToe(井字棋)   本 游戏 为在下用lufylegend开发的第二款小游戏.此游戏是大家想必大家小时候都玩过,因为玩它很简单,只需要一张草稿纸和一只笔就能开始游戏,所以广受儿 ...

  9. 井字棋游戏升级版 - TopTicTacToe项目 简介

    一.游戏简介 井字棋是一款世界闻名的游戏,不用我说,你一定知道它的游戏规则. 这款游戏简单易学,玩起来很有意思,不过已经证明出这款游戏如果两个玩家都足够聪明的话, 是很容易无法分出胜负的,即我们得到的 ...

随机推荐

  1. python字典的基本操作

    字典的基本方法 什么是字典: 字典是一种 key - value的数据类型,听alex说就像我们上学用的字典,通过笔划,字母来查找对饮页面的详细内容. 语法: id_dict = { 'stu1101 ...

  2. How to Be Assertive Asking for What You Want Firmly and Fairly

    What Is Assertiveness? It's not always easy to identify truly assertive behavior. This is because th ...

  3. MySQL基础之 恢复数据和数据库迁移

    1.mysql命令或者source命令恢复数据 这两个命令在进行恢复数据的时候要检查是否创建数据库.如果数据库不存在,则恢复失败. 数据库迁移 1.相同版本的mysql数据库之间的迁移. mysqld ...

  4. [luogu T71973]卡常者π酱

    [luogu T71973]卡常者π酱 题意 给定一个长度为 \(n\) 的字符串, 要求将字符串分割为若干段, 每一段要么是一个字符要么是前面几段的并的子串. 如果某一段是一个单独字符, 则产生 \ ...

  5. 题解 P1034 【矩形覆盖】

    题面 在平面上有n个点(n≤50),每个点用一对整数坐标表示.例如:当n=4时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这些点可以用k个矩形(1≤ ...

  6. ftp 命令全集

    FTP的命令行格式为: ftp -v -d -i -n -g [主机名] , 其中 -v 显示远程服务器的所有响应信息: -n 限制ftp的自动登录,即不使用:.n etrc文件: -d 使用调试方式 ...

  7. ModuleNotFoundError No module named urllib2

    ModuleNotFoundError No module named urllib2?那么在进行编辑的来进行代码上开发,那就会出现的来代码的上错误,也是版本的上差异导致的问题.   工具/原料   ...

  8. Redis系列三:reids常用命令

    全局命令 keys *  查看所有键 dbsize 查看的是当前所在redis数据库的键总数 如果存在大量键,线上禁止使用此指令 exists key 检查键是否存在,存在返回1,不存在返回0 del ...

  9. ES6标准入门之字符串的拓展讲解

    在开始讲解ES6中字符串拓展之前,我们先来看一下ES5中字符串的一些方法. 获取字符串长度 str.length 分割字符串 str.split() 拼接字符串 str1+str2 或 str1.co ...

  10. css 字体、文本、padding的样式

    一.字体的样式: 1)字体倾斜:font-style:italic 2)字体大小:font-size 一般为偶数. 3)行高:line-height   当行高为奇数的时候,是文字上面比文字下面的少一 ...