Python开发简易五子棋小游戏


Posted in Python onMay 02, 2022

本文实例为大家分享了Python开发简易五子棋小游戏的具体代码,供大家参考,具体内容如下

class CheckerBoard():
    '''棋盘类'''
    def __init__(self,col=0,row=0,piece_type='--'):
        self.col = col
        self.row = row
        self.piece_type = piece_type
        self.labelx = range(self.col)
        self.labely = range(self.row)

    def chessboard(self):
        '''棋盘初始化数据(棋子的状态)'''
        checkerboardl = []
        for y in self.labely:
            heading_list = []
            checkerboardl.append(heading_list)
            for x in self.labelx:
                heading_list.append(self.piece_type)
        return checkerboardl

    def chess_show(self,checkerboardl):
        '''显示棋子的状态'''
        print('\0\0\0',end=' ')
        for x_title in self.labelx:
            print(str(x_title).zfill(2),end=' ')
        for y_title in range(len(checkerboardl)):
            print('\n',str(y_title).zfill(2),end=' ')
            for instans in checkerboardl[y_title]:
                print(instans,end=' ')

class User():
    '''玩家类'''
    def __init__(self,id,name,piece_type):
        '''构造函数
            id :玩家 id标识
            name:玩家名称
           piece_type:棋子的状态
        '''
        self.id = id
        self.name = name
        self.piece_type = piece_type

    def play(self,x,y,pool,data):
        '''play():   玩家下棋子
            x:下棋子的x坐标
            y:下棋子的y坐标
            pool:棋子的状态集合
            data:棋盘上的棋子状态数据
        '''
        if data[y][x] not in pool:
            data[y][x] = self.piece_type
            return data,True
        else:
            print('\n位置错误,已经有棋子了,重新输入:')
            return data,False

    def __col_list(self, x, y, col,row, data):
        '''获取下棋子的x轴所有棋子的状态
            x:下棋子的x坐标
            y:下棋子的y坐标
            col:棋盘的最大横向坐标
            row:棋盘的最大纵向坐标
            data:棋盘中棋子的状态数据
        '''
        # slist = []
        slist = data[y]
        print(slist,'__col_list')
        return slist
    def __row_list(self, x, y, col,row, data):
        '''获取下棋子的y轴所有棋子的状态
                    x:下棋子的x坐标
                    y:下棋子的y坐标
                    col:棋盘的最大横向坐标
                    row:棋盘的最大纵向坐标
                    data:棋盘中棋子的状态数据
                '''
        slist = []
        for i in data:
            slist.append(i[x])
        print(slist, '__row_list')
        return slist
    def __left_cut_list(self, x, y, col,row, data):
        '''获取下棋子的左斜角所有棋子的状态
                    x:下棋子的x坐标
                    y:下棋子的y坐标
                    col:棋盘的最大横向坐标
                    row:棋盘的最大纵向坐标
                    data:棋盘中棋子的状态数据
                '''
        slist = []
        if 0 <= x+y and  row > x+y:
            x_val_init = x+y
            y_val_init = 0
            while x_val_init >= 0 and y_val_init <= row-1:
                val = data[y_val_init][x_val_init]
                slist.append(val)
                x_val_init -= 1
                y_val_init += 1
        else:
            x_val_init = col-1
            y_val_init = y
            while x_val_init > 0 and y_val_init <= row-1:
                val = data[y_val_init][x_val_init]
                slist.append(val)
                x_val_init -= 1
                y_val_init += 1
        print(slist, '__left_cut_list')
        return slist
    def __right_cut_list(self, x, y, col,row, data):
        '''获取下棋子的右斜角所有棋子的状态
            x:下棋子的x坐标
            y:下棋子的y坐标
            col:棋盘的最大横向坐标
            row:棋盘的最大纵向坐标
            data:棋盘中棋子的状态数据
                        '''
        slist = []
        if 0 <= x-y :
            x_val_init = x-y
            y_val_init = 0
            while x_val_init <= col-1 and y_val_init <= row-1:
                val = data[y_val_init][x_val_init]
                slist.append(val)
                x_val_init += 1
                y_val_init += 1
        else:
            x_val_init = 0
            y_val_init = y-x
            while x_val_init <= col-1 and y_val_init <= row-1:
                val = data[y_val_init][x_val_init]
                slist.append(val)
                x_val_init += 1
                y_val_init += 1
        print(slist, '__right_cut_list')
        return slist

    def fif_diff(slef,list5):
        '''判断连续五个棋子状态都一样'''
        # list5:5个元素的列表
        piece_type = slef.piece_type
        for i in range(len(list5)):
            if list5[i] != piece_type:
                return False
        return True

    def rule(self,x, y, col,row, data):
        '''规则:连续5个棋子状态都一样时,返回True
        x:下棋子的x坐标
        y:下棋子的y坐标
        col:棋盘的最大横向坐标
        row:棋盘的最大纵向坐标
        data:棋盘中棋子的状态数据
        '''


        status = False
        rule_list = [self.__col_list,self.__row_list,self.__left_cut_list,self.__right_cut_list]
        for i in range(len(rule_list)):
            get = rule_list[i]
            slist = get(x, y, col,row, data)
            if len(slist) >= 5:
                start = 0
                end = 5
                while end < len(slist) + 4:
                    fif_ele_list = slist[start:end]
                    if self.fif_diff(fif_ele_list) :
                        print('%s赢了' %self.name,'11111111111111')
                        status = True
                        break
                    else:
                        start += 1
                        end += 1
        return status

def inputbox(obj, pool, checkerboardl_init):
    ''' 输入横向纵向坐标'''
    print('\n*************************************************')
    x = int(input('%s请输入横坐标:'%obj.name).strip())
    if not 0 <= x < 15:
        x = int(input('%s请输入横坐标:'%obj.name).strip())
    y = int(input('%s请输入纵坐标:'%obj.name).strip())
    if not 0 <= y < 15:
        y = int(input('%s请输入纵坐标:'%obj.name).strip())
    checkerboardl,static = obj.play(x, y, pool, checkerboardl_init)
    if static:
        s = obj.rule(x, y, 15, 15, checkerboardl)
        chess.chess_show(checkerboardl)
        if s:
            return True
    else:
        inputbox(obj, pool, checkerboardl_init)
pool = []
checkerboardl=[]
static = ''
if __name__ == '__main__':
    ST = True
    chess = CheckerBoard(15,15)
    checkerboardl_init = chess.chessboard()
    chess.chess_show(checkerboardl_init)
    s1 = User(1,'jack','@@')
    pool.append(s1.piece_type)
    s2 = User(2, 'chen', '##')
    pool.append(s2.piece_type)
    z =1
    while  ST:
        if z == 1:
            a = inputbox(s1, pool, checkerboardl_init)
            if a :
                break
            z = 2
            continue
        if z == 2:
            b = inputbox(s2, pool, checkerboardl_init)
            if b :
                break
            z = 1

简化图:

Python开发简易五子棋小游戏

以上就是本文的全部内容,希望对大家的学习有所帮助。


Tags in this post...

Python 相关文章推荐
python的常见命令注入威胁
Feb 18 Python
python使用内存zipfile对象在内存中打包文件示例
Apr 30 Python
详解Python的迭代器、生成器以及相关的itertools包
Apr 02 Python
python机器学习之随机森林(七)
Mar 26 Python
Python单元测试简单示例
Jul 03 Python
python爬虫之urllib3的使用示例
Jul 09 Python
Python绘制KS曲线的实现方法
Aug 13 Python
一行代码让 Python 的运行速度提高100倍
Oct 08 Python
python绘制已知点的坐标的直线实例
Jul 04 Python
如何提高python 中for循环的效率
Apr 15 Python
Python调用REST API接口的几种方式汇总
Oct 19 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
Jan 27 Python
Python开发五子棋小游戏
python获取带有返回值的多线程
May 02 #Python
总结三种用 Python 作为小程序后端的方式
Python如何用re模块实现简易tokenizer
May 02 #Python
Python实现简单得递归下降Parser
使用Python开发贪吃蛇游戏 SnakeGame
Apr 30 #Python
使用Python开发冰球小游戏
You might like
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
php反射应用示例
2014/02/25 PHP
PHP如何通过date() 函数格式化显示时间
2020/11/13 PHP
jquery二级导航内容均分的原理及实现
2013/08/13 Javascript
jQuery阻止事件冒泡具体实现
2013/10/11 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
关于Vue.js一些问题和思考学习笔记(2)
2016/12/02 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
全新打包工具parcel零配置vue开发脚手架
2018/01/11 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
jQuery中的类名选择器(.class)用法简单示例
2018/05/14 jQuery
Vue前后端不同端口的实现方法
2018/09/19 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
2020/11/12 Javascript
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
Python使用matplotlib绘制随机漫步图
2018/08/27 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
2019/01/15 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
一款纯css3实现的漂亮的404页面的实例教程
2014/11/27 HTML / CSS
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
你的自行车健身专家:FaFit24
2016/11/16 全球购物
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
经典c++面试题六
2012/01/18 面试题
自荐信的禁忌和要点
2013/10/15 职场文书
财务管理专业推荐信
2013/11/19 职场文书
普通话演讲稿
2014/09/03 职场文书
自查自纠整改报告
2014/11/06 职场文书
廉洁自律个人总结
2015/02/14 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书
django学习之ajax post传参的2种格式实例
2021/05/14 Python
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers