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使用random和tertools模块解一些经典概率问题
Jan 28 Python
Python实现PS滤镜碎片特效功能示例
Jan 24 Python
Python pandas常用函数详解
Feb 07 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
Apr 27 Python
Django 浅谈根据配置生成SQL语句的问题
May 29 Python
Python爬虫实现简单的爬取有道翻译功能示例
Jul 13 Python
Python + OpenCV 实现LBP特征提取的示例代码
Jul 11 Python
python基于socket进行端口转发实现后门隐藏的示例
Jul 25 Python
在django中实现页面倒数几秒后自动跳转的例子
Aug 16 Python
django数据模型on_delete, db_constraint的使用详解
Dec 24 Python
python如何代码集体右移
Jul 20 Python
python openpyxl模块的使用详解
Feb 25 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学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
详解PHP发送邮件知识点
2018/05/06 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
jQuery学习笔记之Helloworld
2010/12/22 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
详解javascript实现自定义事件
2016/01/19 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
详解React项目中碰到的IE问题
2019/03/14 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)
2019/08/12 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
2019/08/26 Javascript
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
2018/04/27 Python
python使用opencv驱动摄像头的方法
2018/08/03 Python
Django model反向关联名称的方法
2018/12/15 Python
python模块之subprocess模块级方法的使用
2019/03/26 Python
python中字典按键或键值排序的实现代码
2019/08/27 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
HTML5 语义化结构化规范化
2008/10/17 HTML / CSS
应届生如何写自荐信
2014/01/05 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
公司合作协议范文
2014/10/01 职场文书
2014年政风行风评议工作总结
2014/10/21 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书
详解NodeJS模块化
2021/06/15 NodeJs
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS