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. 【转】Nginx学习---负载均衡的原理、分类、实现架构,以及使用场景

    [原文]https://www.toutiao.com/i6593604356799463944/ [原文]https://www.toutiao.com/i6592741060194075143/ ...

  2. Docker容器学习与分享04

    Docker容器的基本操作(2) 基于docker分享03的centos容器,接着学习docker容器的基本操作. docker分享03中创建了一个centos镜像,如果想要查看容器的具体信息就要使用 ...

  3. WCF简单实例--用Winform启动和引用

    以订票为例简单应用wcf程序,需要的朋友可以参考下 本篇转自百度文档,自己试过,确实可以用. 以订票为例简单应用wcf 新建一个wcf服务应用程序 在IService1.cs定义服务契约 namesp ...

  4. WebAPI项目中使用SwaggerUI

    1.创建webapi项目解决方案 2.引入Swagger组件 在项目引用中可以看到swagger的引用 3.webapi 项目右键属性->生成-> 勾选XML文档文件,然后将XML文件保存 ...

  5. Android Fragment(三)ListFragment简单介绍以及Fragment之间通信

    一.Fragment通信简单介绍:Fragments之间是不能够直接通信的,他们之间的通信是通过Activity这个中间件来通信的, 为了让Fragment跟它的Activity通信,我们可以在Fra ...

  6. SelectObject函数

    SelectObject 函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的同样类型的对象. 函数原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ ...

  7. 【小程序】text-indent设置

    要想文本首行缩进,则需要设置以下 1. 文本以<view>标签包裹 (可选) 2. 该标签设置margin值 3.以上设置text-indent才会成功

  8. SAP函数 LAST_DAY_OF_MONTHS 获取月末最后一天日期

    DATA LAST_DATE TYPE SY-DATUM. CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = sy-datum IMPORTI ...

  9. 领域驱动设计理解&总结

    领域驱动设计理解&总结 这篇文章主要是通读<实现领域驱动设计>之后自己的理解和总结(同时也参照一些博文的分析来加深自己的理解): 有些疑问是自定义内容,虽然有自己的理解,但依然感觉 ...

  10. 20155222卢梓杰 实验五 MSF基础应用

    实验五 MSF基础应用 1.一个主动攻击实践,如ms17_010_eternalblue漏洞; 本次攻击目标是win7虚拟机 首先进行相应配置 然后点launch 就成功了 针对win7的漏洞还是相对 ...