Python控制台版五子棋
1、写在前面
最近从各种渠道接触到了一些有趣的Python小练习题,适合对Python基础有一定了解的童鞋练习,因为问题都来源于生活,所以码起来有一些趣味,自己也断断续续把代码敲完,现在自娱自乐地码出来吧,理解错的地方请多包涵。另外,反正我也知道没人看,就当是打发时间,给自己的学习过程留一点印记吧。先来写一个Python控制台版的五子棋O(∩_∩)O~
2、棋盘构建
棋盘默认设置10*10大小,这里其实可用类来自定义棋盘大小,但是用了后不太会给棋盘的轴线标号,所以暂时将(tou)就(xia)下(lan)吧。

def Get_Checherboard():checkerboard = []for i in range(10):checkerboard.append([])for j in range(10):checkerboard[i].append('-')return checkerboard

3、显示棋盘
下棋嘛肯定是要看得见棋盘,不然一直下盲棋谁顶得住?该部分在Python控制台打印棋盘,包括之后落子后的棋盘也是用这个显示。首先打印一行数字坐标(1-10),之后在每行前面加上字母坐标,再打印棋盘checkerboard中的内容。

def Show():print('  1  2  3  4  5  6  7  8  9  10')for i in range(len(checkerboard)):print(chr(i + ord('A')) + ' ' ,end = '')for j in range(len(checkerboard)):print(checkerboard[i][j] + '  ',end = '')print()

效果显示

  1  2  3  4  5  6  7  8  9  10
A -  -  -  -  -  -  -  -  -  -
B -  -  -  -  -  -  -  -  -  -
C -  -  -  -  -  -  -  -  -  -
D -  -  -  -  -  -  -  -  -  -
E -  -  -  -  -  -  -  -  -  -
F -  -  -  -  -  -  -  -  -  -
G -  -  -  -  -  -  -  -  -  -
H -  -  -  -  -  -  -  -  -  -
I -  -  -  -  -  -  -  -  -  -
J -  -  -  -  -  -  -  -  -  -
Please input your choice(exit-0):

4、胜负判断
这部分是代码最麻烦的部分,最开始想算法时是想每次下棋都逐行逐列逐斜每个棋子检查,这样每次检查时就和落子地点无关,直接调用就行。但是后来发现这样效率低,而且代码不好写,就主动放弃(应证了古话世上无难事只要肯放弃)。后来借鉴别人的思路,每次落子时检查四个部分(行、列、两斜)(假设落子地方为(x,y),A-J为x,1-10为y),只要有一个部分的值为True,那么就获胜。下面检查的方法也是自己琢磨的,索性还挺好用。

def Check(pos,color):    '''pos[0]代表x,pos[1]代表y,color 为不同的棋子,函数输入落子坐标pos和对应棋子color,输出布尔值-是否获胜'''                     if  Check_row(pos, color) or Check_columns(pos, color) \or Check_oblique_1(pos, color) or Check_oblique_2(pos, color):return Trueelse:return False

判断是否获胜需要检查四个方面:
(1)检查行:从(x-4,y)到(x+4,y),是否有五个一样的棋子。但是有可能x-4会超出棋盘的范围,若超出范围,就从(0,y)开始;同理,右边x+4若超出范围,就以(9,y)结束。这样检查的坐标范围是(max(0,x-4),y)到(min(9,x+4),y)

def Check_row(pos,color):start_x = max(0,pos[0] - 4)end_x = min(9,pos[0] + 4)count = 0for pos_x in range(start_x, end_x + 1):if checkerboard[pos_x][pos[1]] == color:count += 1if count >= 5:return Trueelse:     #若前后棋子不一致,计数器归零count = 0return False

(2)检查列:原理同上,检查的坐标范围是(x,max(0,y-4))到(x,min(9,y+4))

def Check_columns(pos,color):start_y = max(0,pos[1] - 4)end_y = min(9,pos[1] + 4)count = 0for pos_y in range(start_y, end_y + 1):if checkerboard[pos[0]][pos_y] == color:count += 1if count >= 5:return Trueelse:count = 0return False

(3)检查左上右下方向从(x-4,y-4)到(x+4,y+4):检查斜需要稍动脑筋,设横纵坐标差s = x-y,分两种情况:
1、若x>=y,那么找左端的检查起始点时,若x-4>0,y-4>0,那么检查的起点无疑就是(s+(y-4),y-4),但是若起点靠边了,那么检查起始点的纵坐标y就为0(因为x>y,所以肯定是y方向先靠边),横坐标为0+s,即点(0+s,0)。所以综合两种情况:左边检查的起始点是(max(0,y-4)+s,max(0,y-4))。同理,若x+4<9,y+4<9,那么右边检查结束点为(x+4,x+4-s),若终点靠边了,那么检查的终点横坐标x就为9(因为x>y,所以是x方向先靠边),纵坐标为9-s,所以终点的坐标为(min(9,x+4),min(9,x+4)-s)。
2、若x<y,推理同上,左边检查的起始点就是(max(0,x-4),max(0,x-4)-s),右边检查的终点是(min(9,y+4)+s,min(9,y+4))。有了起点和终点,生成x和y方向的起止序列range(start_point_x,end_point_x + 1)和range(start_point_y,end_point_y + 1)),再用zip将横纵坐标对应打包起来检查即可。

def Check_oblique_1(pos,color):if pos[0] >= pos[1]:start_point_y = max(0,pos[1] - 4)start_point_x = start_point_y + (pos[0] - pos[1])end_point_x = min(9,pos[0] + 4)end_point_y = end_point_x - (pos[0] - pos[1])  else:start_point_x = max(0,pos[0] - 4)start_point_y = start_point_x - (pos[0] - pos[1])end_point_y = min(9,pos[1] + 4) end_point_x = end_point_y + (pos[0] - pos[1])count = 0for i,j in zip(range(start_point_x,end_point_x + 1),range(start_point_y,end_point_y + 1)):if checkerboard[i][j] == color:count += 1if count >= 5:return True   else:count = 0return False

(4)检查右上左下方向
情况也分两种:1、x+y<=9 和 2、x+y>9,坐标在代码中应该看得清。注意在生成x坐标序列时应注意结束点坐标要小于开始点,所以序列是range(end_point_x,start_point_x + 1)。由于水平有限,只能转换成列表翻转后再和y坐标序列打包。

def Check_oblique_2(pos,color):s = sum(pos)if pos[0] + pos[1] <= 9:start_point_y = max(0,pos[1] - 4)start_point_x = s -start_point_yend_point_x = max(0,pos[0] - 4)end_point_y = s - end_point_xelse:start_point_x = min(9,pos[0] + 4)start_point_y = s - start_point_xend_point_y = min(9,pos[1] + 4)end_point_x = s - end_point_ycount = 0tmp_lst = list(range(end_point_x,start_point_x + 1))tmp_lst.reverse()for i,j in zip(tmp_lst,list(range(start_point_y,end_point_y + 1))):if checkerboard[i][j] == color:count += 1if count >= 5:return Trueelse:count = 0return False

(5)主函数部分
设置好棋盘,定义棋子形状为M和O,每次取color中的第一个元素(color[0])落子,落子后color反转,表示双方交替落子,最后加上一些异常处理,就是下面这段代码了。本来逻辑很好理解,但加上异常处理代码看起来比较乱。这也是没办法,因为总会有些人在输入时搞幺蛾子,故意逗你玩。

checkerboard = Get_Checherboard()
def main():color = ['M','O']dic = {'A':0,'B':1,'C':2,'D':3,'E':4,'F':5,'G':6,'H':7,'I':8,'J':9}Show()Mark = Truewhile Mark:choice = input('Please input your choice(exit-0):')if choice == '0':breakelif not choice[0].isalpha() or not choice[1:].isdigit():print('Please input right position!')continueelse:choice_y = choice[0].title()choice_x = int(choice[1:]) - 1try:if 0 <= dic[choice_y] <= 9 and 0 <= choice_x <= 9:if checkerboard[dic[choice_y]][choice_x] != '-':print('Chess piece already exists in this position!')else:if color[0] == 'M':checkerboard[dic[choice_y]][choice_x] = 'M'if Check([dic[choice_y],choice_x], color[0]):print('Congs!Player 1 win!')Mark = FalseShow()color.reverse()else:checkerboard[dic[choice_y]][choice_x] = 'O'if Check([dic[choice_y],choice_x], color[0]):print('Congs!Player 2 win!')Mark = FalseShow()color.reverse()else:print('Position out of range!')except:print('Please input right position!')if __name__ == "__main__":main()

6、效果显示

Congs!Player 1 win!1  2  3  4  5  6  7  8  9  10
A -  M  -  -  -  -  -  -  -  -
B -  -  M  O  -  M  -  -  -  -
C -  -  M  M  O  O  -  -  -  -
D -  -  O  M  M  M  -  -  -  -
E -  -  -  O  O  M  -  -  -  -
F -  -  -  -  O  -  O  -  -  -
G -  -  -  -  -  -  -  -  -  -
H -  -  -  -  -  -  -  -  -  -
I -  -  -  -  -  -  -  -  -  -
J -  -  -  -  -  -  -  -  -  -

这样就是尽我所能写的啦,本来还想加入悔棋的设置的,限于水平和精力就不写了,反正没人看,后面还有几个有趣的小练习题,后面陆续码出来。如果屏幕前的你能看到这篇博客,并且能看到底,那说明你我是有缘分的O(∩_∩)O,哈哈,就这样啦,有缘人再见!

Python简易五子棋相关推荐

  1. C语言五子棋标记,C语言实现简易五子棋

    本文实例为大家分享了C语言实现简易五子棋的具体代码,供大家参考,具体内容如下 #define _CRT_SECURE_NO_WARNINGS #include #include #include #d ...

  2. Python实现五子棋人机对战 | CSDN博文精选

    作者 | 吴小鹏 来源 | 数据札记倌(ID:Data_Groom) 五子棋是常见的一款小游戏,五子棋问题是人工智能中的一个经典问题.这篇文章主要介绍了Python版本五子棋的实现代码,大家可以做个参 ...

  3. python 简易HTTP服务器搭建

    安装Python简易HTTP服务器 大多数Linux/Unix/mac OS操作系统都已默认安装,直接运行以下命令即可,其中"8008"为指定的端口号:如果没有安装python,可 ...

  4. python局域网大文件_[源码]Python简易http服务器(内网渗透大文件传输含下载命令)...

    Python简易http服务器源码 import SimpleHTTPServer import SocketServer import sys PORT = 80 if len(sys.argv) ...

  5. mayapython开关_Maya Python 简易教程.doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspPython Maya Python 简易教程.doc25页 本 ...

  6. Python 简易实现 quoted-printable 编码

    参考链接: 网络管理员在线工具 python模块之quopri: quoted-printable编解码 以下有关内容基于 Python 3: Python 简易实现 quoted-printable ...

  7. 【QT项目】简易五子棋游戏(人机对战)— 完整源码

    文章目录 前言 一.游戏实现效果 二.需求分析 三.解决方案 四.核心步骤 1.插入棋盘图 2.双方落子 3.输赢判定 4.重新开始 五.完整源码 1.main.cpp 2.chessboard.h ...

  8. Java 简易五子棋游戏的编写

    编写一个简易五子棋,棋盘在控制台中绘制,棋盘每- - 个点都有对应的坐标,下棋者输 入对应坐标落棋子,运行效果如图所示.两位数字表示的坐标中,第-一个数字表示横坐标, 第二个数字表示纵坐标,运行结果如 ...

  9. Java 简易五子棋

    使用Swing实现的简易五子棋,棋盘由225个JButton构成,棋子用⬦⬥两个符号代替. 点击空白格子落子,再次点击上一步落子的位置悔棋; 判断胜负逻辑:黑子为-1,白子为1,空白格为0,当一枚棋子 ...

最新文章

  1. [CTO札记]防盗版新思路:招安
  2. ffmpeg 移植到 android 并使用
  3. linux18.04安装显卡驱动,详细介绍ubuntu18.04安装NVIDIA显卡驱动(亲测有效!)
  4. 格式说明_现代诗歌的写作格式是什么,能否举例说明?
  5. java----java工具包
  6. 利用Word2010给汉字添加汉语拼音
  7. 输出26个英文字母c语言,菜鸟求助,写一个随机输出26个英文字母的程序
  8. 电大计算机网考选择题多少分,[2017年电大]电大计算机网考选择题题库精选汇总.doc...
  9. php 五子棋源联机版_五子棋服务器客户端联机对战 C++版完整代码
  10. 我从Python新手到大师的百天之路(内附学习资源)
  11. k8s的优势和部署模式
  12. seo软文标题写作技巧:好的标题是靠这样想出来的
  13. 关于浏览器加载不出图片的问题
  14. EXCEL基本功能 --- 数据透视表
  15. GWAS计算BLUE值3--LMM考虑残差异质计算BLUE值
  16. 家谱(特殊的层级人物关系)数据结构与自动排版算法的一种实现
  17. Typora使用方法
  18. 淘宝开放平台 top 的概要
  19. jav: bigInteger
  20. Word转成PDF后有空白页要怎么删除?

热门文章

  1. 内存的可靠性、可用性和诊断功能(内存RAS)
  2. Qt编写安防视频监控系统22-摄像机搜索
  3. 如何修改固定了格式的WPS表格
  4. 安装永中Office for linux
  5. Attribute 属性
  6. 【电路第五章】含运算放大器的电路分析方法
  7. 将多个MP4通过FFmpeg工具合并成一个MP4文件
  8. 申万一级行业日指数_申万一级行业指数昨日市场表现
  9. 前端基础 - 案例二:酱品购电商网站首页(精简版)
  10. openlayers——(一)缓冲区分析