简介

井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名。游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜。

过程

因为最近在学习Python的实训,学习了接近两周了,感觉Python确实是比较简单的,而且具有丰富的第三方库,(手动点赞),进入正题,一周的基础,当然要进行项目了,作为爱玩游戏的我,当然要从游戏入手,通过制作游戏,可以提升你的思维逻辑,其实写代码更多的是你的逻辑,你的思维。废话不多说先看这个游戏的规则已经在简介说了,首先我们需要绘制棋盘,我们需要知道这个棋盘是多大的我们可以尝试输出:

print("""

0 | 1 | 2

---------

3 | 4 | 5

---------

6 | 7 | 8

""")

这是我们要绘制大致棋盘的样式,这样,我们就可以定义如下参数:

# 全局常量

X = "X"

O = "O"

EMPTY = " "

TIE = "TIE"

NUM_SQUARES = 9

前两个变量就是井字棋的两个棋子,然后定义一个空,一个平局,还有棋盘的位置。

下面就是,我们都要思考的,玩一个游戏,你是和电脑玩(暂时没考虑人人对战)。肯定先询问一下,电脑先手还是玩家先手,所以定义一个询问函数,在这里简单说一下,这个的函数定义,很多地方都可以用得到,方便化结构化管理。

# 询问答案”是“或”否“

def ask_yes_no(question):

response = None

while response not in ('y', 'n'):

response = input(question).lower()

return response

这个就是询问函数返回y/n,下面的函数就是规定落点,棋盘一共九个位置,肯定不能随便下。

# 用户给出指定范围内的一个数字

def ask_number(question, low, high):

response = None

# range(low, high)是左闭右开区间

while response not in range(low, high):

response = int(input(question))

return response

下面就是先手的棋子问题,一般认为先走的为X

# 决定玩家和电脑各执哪种棋子

def pieces():

# 在一个函数内调用另一个函数

go_first = ask_yes_no("是否玩家先走?(y/n):")

if go_first == 'y':

print("玩家先走")

human = X

computer = O

else:

print("电脑先走")

computer = X

human = O

return computer, human

下面就是绘制棋盘逻辑,其实棋盘就是一个数组,存放。

def new_board():

board = []

for i in range(NUM_SQUARES):

board.append(EMPTY)

return board

绘制棋盘:

def display_board(board):

print("\n\t", board[0], "|",

board[1], "|",

board[2])

print("\t", "-" * 9)

print("\t", board[3], "|",

board[4], "|",

board[5])

print("\t", "---------")

print("\t", board[6], "|",

board[7], "|",

board[8])

下面就是下棋的合理性,例如。你再1号位置下了,我肯定不能再下1号位置了。

# 根据当前局面,确保行棋合法

def legal_moves(board):

moves = []

for i in range(NUM_SQUARES):

if board[i] == EMPTY:

moves.append(i)

return moves

胜负状态的判定:

# 判断胜负

# 游戏有四种状态: X获胜,O获胜,平局,正在进行

def winner(board):

# 获胜的8种可能性:一方占据了以下某一行

WAYS_TO_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))

for row in WAYS_TO_WIN:

# WAYS_TO_WIN的某一行都是同一方(O或X)

# 则该方获胜

if board[row[0]] == board[row[1]] \

== board[row[2]] != EMPTY:

the_winner = board[row[0]]

return the_winner

# 如果暂时无人获胜,且棋盘上已经没有空了,则是平局

if EMPTY not in board:

return TIE

# 如果以上结果都未出现,则游戏正在进行,还未结束

return None

然后获取当前棋子合法位置:

def human_move(board, human):

# 获取当前合法落子位置

legal = legal_moves(board)

move = None

while move not in legal:

move = ask_number("在哪里落子?(0-8):",

0, NUM_SQUARES)

if move not in legal:

print("那里不可以")

return move

下一个就是电脑下棋的策略:

def computer_move(board, computer, human):

"""

电脑下棋策略:

1. 如果有一步可以让电脑在本轮获胜,就选那一步

2. 如果有一步可以让玩家在下一轮获胜,就堵那一步

3. 其他情况下,按照方格本身的优先级落子

中间最好,四角次之,边缘最差

"""

BEST_MOVES = (4, 0, 2, 6, 8, 1, 3, 5, 7)

print("电脑走在:", end=" ")

# 如果电脑能赢,就走那里

for move in legal_moves(board):

# 循环尝试每一合法落子位置

board[move] = computer

# 将该位置从“ ”改为电脑符号

if winner(board) == computer:

print(move)

return move

board[move] = EMPTY

# 电脑赢不了,看有没有会使玩家获胜的位置

for move in legal_moves(board):

board[move] = human

if winner(board) == human:

print(move)

return move

board[move] = EMPTY

# 如果不是以上两种情况,则依照BEST_MOVES的顺序落子

for move in BEST_MOVES:

if move in legal_moves(board):

print(move)

return move

def next_turn(turn):

if turn == O:

return X

else:

return O

最后提示获胜的状态:

def congrat_winner(the_winner, computer, human):

if the_winner != TIE:

print(the_winner, " 获胜!")

else:

print("平局!")

if the_winner == computer:

print("愚蠢的人类")

elif the_winner == human:

print("我会回来的")

elif the_winner == TIE:

print("咱们走着瞧")

然后就是主函数的编写:

def main():

computer, human = pieces() # 人机分配棋子

turn = X # X先走

board = new_board() # 生成一个新棋盘

display_board(board)

# 当胜负未决,winner()返回None

while not winner(board):

if turn == human:

# human_move()返回玩家的落子位置

move = human_move(board, human)

# 将board的落子位置更新为human的棋子

board[move] = human

else:

move = computer_move(board, computer, human)

board[move] = computer

display_board(board)

turn = next_turn(turn)

the_winner = winner(board)

congrat_winner(the_winner, computer, human)

最后运行main函数就OK了

main()

总结

经过简单的小游戏编写测试,把Python的基础巩固好,其实这个游戏,还是牵扯一点点的人工智能, 就是电脑下棋的策略都是最优算法,目前Python做人工智能也是比较火热的。

C语言井字棋人人对战源代码,回忆儿时游戏-井字棋(完整代码)相关推荐

  1. 【C语言游戏】三子棋完整代码和正确结果截图

  2. Java黑皮书课后题第3章:*3.13(金融应用:计算税款)程序清单3-5给出了计算单身登记人税款的源代码。将程序清单3-5补充完整,从而计算所有登记的婚姻状态的税款

    *3.13(金融应用:计算税款)程序清单3-5给出了计算单身登记人税款的源代码.将程序清单3-5补充完整,从而计算所有登记的婚姻状态的税款 题目 题目描述 程序清单3-5 代码 题目 题目描述 *3. ...

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

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

  4. C语言自制小游戏:三子棋(井字棋)智能下棋补充

    目录 一.前期准备 二.逻辑与程序实现 1.连珠 ①横向连珠 ②纵向连珠 ③斜向连珠 ④函数完善 2.堵棋 ①横向堵棋 ②纵向堵棋 ③斜向堵棋 3.整理函数 ①整理AI_Computer函数 ②修改C ...

  5. 怎样学好C语言,一个成功人士的心得!

    今天,我能够自称是一个混IT的人,并能以此谋生,将来大家能一次谋生,都要感谢两个人:克劳德.香农和约翰.冯.诺依曼,是他们发现了全部的数字化信息,不论是一段程序,一封email,一部电影都是用一连串的 ...

  6. 为什么C语言还是被很多人说成过时了?

    为什么C语言还是被很多人说成过时了? 现在很多人初学者直接选择C语言的人已经变得越来越少了,主要原因还是在招聘岗位数量上无法和java,php等高级语言想媲美,但并不代表C语言已经穷途末路没有前景了, ...

  7. 如何学好C语言,一个成功人士的心得!

    来源URL:http://blog.csdn.net/yxnk/article/details/5976699/ 今天,我能够自称是一个混IT的人,并能以此谋生,将来大家能一次谋生,都要感谢两个人:克 ...

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

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

  9. C++ 小游戏 井字棋

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

  10. 基于C语言实现的多人在线聊天系统(客户端和服务端源码)

    资源下载地址:https://download.csdn.net/download/sheziqiong/85768602 资源下载地址:https://download.csdn.net/downl ...

最新文章

  1. 1000+个常用的Linux命令!看完通关!随手玩Linux!
  2. hibernate Disabling contextual LOB creation as connection was null
  3. Spring(二)——IoC
  4. 如何让组织的KPI成为敏捷转型的推手而不是杀手 | IDCF
  5. 如何在 C# 中使用 Buffer
  6. 大数据之-Hadoop3.x_MapReduce_WordCount案例需求分析---大数据之hadoop3.x工作笔记0087
  7. xen-tools创建虚拟机找不到root fs的解决办法
  8. Docker简介(转)
  9. 移远EC20基站定位
  10. 新著作计划:《水利水电工程施工导流 水力计算与.NET编程》
  11. python实现外挂自动学习网络课程实例
  12. 国科大—矩阵分析与应用(李老师)—复习提纲—2.矩阵代数
  13. MySQL memo优化_mysql memo
  14. 骚操作“破解“App
  15. 电信校园网宽带创翼破解,路由器PPPOE拦截法
  16. curl上传文件到服务器命令,linux curl上传文件到服务器
  17. 根据经纬度和日期计算日出日落时间
  18. 第三方支付网银支付流程
  19. Java算法训练:沙盘上的字符串
  20. 【Android】的jenkins环境搭建

热门文章

  1. python 谷歌翻译 api_python免费调用谷歌翻译接口
  2. 通过汉字查找五笔码和拼音
  3. 『号外号外』WoS数据库更新后导入VOSviewer出错的原因
  4. 信息技术处理员和计算机二级,信息处理技术员(信息技术处理员含金量)
  5. PMP试题 | 每日一练,快速提分 9.1
  6. IEEE2019_A Survey of Event Extraction from Text
  7. html 页面加载事件,页面加载事件--DOMContentLoaded
  8. c语言编程 猜字游戏
  9. C++初学者该如何写程序?
  10. Java指纹识别开源代码SourceAFIS使用入门