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查询Mysql时返回字典结构的代码
Jun 18 Python
python使用xlrd模块读写Excel文件的方法
May 06 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
Jan 24 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
Oct 07 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
Oct 16 Python
python opencv设置摄像头分辨率以及各个参数的方法
Apr 02 Python
python购物车程序简单代码
Apr 18 Python
解决Pycharm界面的子窗口不见了的问题
Jan 17 Python
python实现五子棋小程序
Jun 18 Python
使用python实现回文数的四种方法小结
Nov 24 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
Feb 14 Python
详解Python如何批量采集京东商品数据流程
Jan 22 Python
Python开发五子棋小游戏
python获取带有返回值的多线程
May 02 #Python
总结三种用 Python 作为小程序后端的方式
Python如何用re模块实现简易tokenizer
May 02 #Python
Python实现简单得递归下降Parser
使用Python开发贪吃蛇游戏 SnakeGame
Apr 30 #Python
使用Python开发冰球小游戏
You might like
239军机修复记
2021/03/02 无线电
PHP新手上路(十二)
2006/10/09 PHP
PHP PDO函数库详解
2010/04/27 PHP
destoon数据库表说明汇总
2014/07/15 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
php与python实现的线程池多线程爬虫功能示例
2016/10/12 PHP
超级强大的表单验证
2006/06/26 Javascript
JavaScript 中的replace方法说明
2007/04/13 Javascript
jQuery ajax cache缓存问题
2010/07/01 Javascript
jquery应该如何来设置改变按钮input的onclick事件
2012/12/10 Javascript
js清除input中type等于file的值域(示例代码)
2013/12/24 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
jQuery实现的动态伸缩导航菜单实例
2015/05/07 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
bootstrap中的 form表单属性role=&quot;form&quot;的作用详解
2017/01/20 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
浅谈JavaScript 代码简洁之道
2019/01/09 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
前端Electron新手入门教程详解
2019/06/21 Javascript
js中值引用和地址引用实例分析
2019/06/21 Javascript
Vue数组响应式操作及高阶函数使用代码详解
2020/08/01 Javascript
处理Python中的URLError异常的方法
2015/04/30 Python
python使用psutil模块获取系统状态
2016/08/27 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
2018/01/10 Python
Python递归实现汉诺塔算法示例
2018/03/19 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
芭比波朗加拿大官方网站:Bobbi Brown Cosmetics CA
2020/11/05 全球购物
感恩教育活动总结
2014/05/05 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书