python 游戏(井字棋)
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 游戏(井字棋)的更多相关文章
- Pascal小游戏 井字棋
一个很经典的井字棋游戏 Pascal源码Chaobs奉上 注意:1.有的FP版本不支持汉语,将会出现乱码.2.别想赢电脑了,平手不错了. 井字过三关: program TicTacToe; uses ...
- Java 小游戏 - 井字棋 v1.0 (初步完成) (2018.4.16更新)
井字棋游戏初步完成 实现功能:输入位置数据->打印棋盘->判断是否胜利->继续游戏/退出游戏 缺点:没有清屏函数 判断胜利方法太过无脑 package MYGAME; ...
- C++小游戏——井字棋
#include<cstdio> #include<windows.h> #include<ctime> int main() { srand(time(NULL) ...
- python 井字棋(Tic Tac Toe)
说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码也是本人逐字逐句敲的. minimax算法还没完全理解,所以参考了这里的代码,并作了修改. 特点 可以选 ...
- [CareerCup] 17.2 Tic Tac Toe 井字棋游戏
17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏, ...
- [C++] 井字棋游戏源码
TicTac.h #define EX 1 //该点左鼠标 #define OH 2 //该点右鼠标 class CMyApp : public CWinApp { public: virtual B ...
- [游戏学习22] MFC 井字棋 双人对战
>_<:太多啦,感觉用英语说的太慢啦,没想到一年做的东西竟然这么多.....接下来要加速啦! >_<:注意这里必须用MFC和前面的Win32不一样啦! >_<:这也 ...
- [HTML5实现人工智能]小游戏《井字棋》发布,据说IQ上200才能赢
一,什么是TicTacToe(井字棋) 本 游戏 为在下用lufylegend开发的第二款小游戏.此游戏是大家想必大家小时候都玩过,因为玩它很简单,只需要一张草稿纸和一只笔就能开始游戏,所以广受儿 ...
- 井字棋游戏升级版 - TopTicTacToe项目 简介
一.游戏简介 井字棋是一款世界闻名的游戏,不用我说,你一定知道它的游戏规则. 这款游戏简单易学,玩起来很有意思,不过已经证明出这款游戏如果两个玩家都足够聪明的话, 是很容易无法分出胜负的,即我们得到的 ...
随机推荐
- 【转】Nginx学习---负载均衡的原理、分类、实现架构,以及使用场景
[原文]https://www.toutiao.com/i6593604356799463944/ [原文]https://www.toutiao.com/i6592741060194075143/ ...
- Docker容器学习与分享04
Docker容器的基本操作(2) 基于docker分享03的centos容器,接着学习docker容器的基本操作. docker分享03中创建了一个centos镜像,如果想要查看容器的具体信息就要使用 ...
- WCF简单实例--用Winform启动和引用
以订票为例简单应用wcf程序,需要的朋友可以参考下 本篇转自百度文档,自己试过,确实可以用. 以订票为例简单应用wcf 新建一个wcf服务应用程序 在IService1.cs定义服务契约 namesp ...
- WebAPI项目中使用SwaggerUI
1.创建webapi项目解决方案 2.引入Swagger组件 在项目引用中可以看到swagger的引用 3.webapi 项目右键属性->生成-> 勾选XML文档文件,然后将XML文件保存 ...
- Android Fragment(三)ListFragment简单介绍以及Fragment之间通信
一.Fragment通信简单介绍:Fragments之间是不能够直接通信的,他们之间的通信是通过Activity这个中间件来通信的, 为了让Fragment跟它的Activity通信,我们可以在Fra ...
- SelectObject函数
SelectObject 函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的同样类型的对象. 函数原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ ...
- 【小程序】text-indent设置
要想文本首行缩进,则需要设置以下 1. 文本以<view>标签包裹 (可选) 2. 该标签设置margin值 3.以上设置text-indent才会成功
- SAP函数 LAST_DAY_OF_MONTHS 获取月末最后一天日期
DATA LAST_DATE TYPE SY-DATUM. CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = sy-datum IMPORTI ...
- 领域驱动设计理解&总结
领域驱动设计理解&总结 这篇文章主要是通读<实现领域驱动设计>之后自己的理解和总结(同时也参照一些博文的分析来加深自己的理解): 有些疑问是自定义内容,虽然有自己的理解,但依然感觉 ...
- 20155222卢梓杰 实验五 MSF基础应用
实验五 MSF基础应用 1.一个主动攻击实践,如ms17_010_eternalblue漏洞; 本次攻击目标是win7虚拟机 首先进行相应配置 然后点launch 就成功了 针对win7的漏洞还是相对 ...