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学习笔记之列表(list)与元组(tuple)详解
Nov 23 Python
python3判断url链接是否为404的方法
Aug 10 Python
浅谈Python反射 &amp; 单例模式
Mar 21 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
Oct 18 Python
python 实现兔子生兔子示例
Nov 21 Python
django中url映射规则和服务端响应顺序的实现
Apr 02 Python
Python logging模块写入中文出现乱码
May 21 Python
python 最简单的实现适配器设计模式的示例
Jun 30 Python
Python3爬虫带上cookie的实例代码
Jul 28 Python
python的flask框架难学吗
Jul 31 Python
Python爬取微信小程序通用方法代码实例详解
Sep 29 Python
一起来学习Python的元组和列表
Mar 13 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新浪微博登录接口用法实例
2014/12/23 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
php生成无限栏目树
2017/03/16 PHP
PHP正则判断一个变量是否为正整数的方法
2019/02/27 PHP
借用Google的Javascript API Loader来加速你的网站
2009/01/28 Javascript
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
javascript preload&amp;lazy load
2010/05/13 Javascript
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
2014/05/20 Javascript
jQuery学习笔记之创建DOM元素
2015/01/19 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
JQuery日期插件datepicker的使用方法
2016/03/03 Javascript
ionic实现可滑动的tab选项卡切换效果
2020/04/15 Javascript
Vue 实用分页paging实例代码
2017/04/12 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
JavaScript实现异步图像上传功能
2018/07/12 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
vue图片裁剪插件vue-cropper使用方法详解
2020/12/16 Vue.js
python通过apply使用元祖和列表调用函数实例
2015/05/26 Python
python中字符串前面加r的作用
2015/06/04 Python
python 写入csv乱码问题解决方法
2016/10/23 Python
rabbitmq(中间消息代理)在python中的使用详解
2017/12/14 Python
Pandas中把dataframe转成array的方法
2018/04/13 Python
Python3.6简单反射操作示例
2018/06/14 Python
python实现代码统计程序
2019/09/19 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
css3实现动画的三种方式
2020/08/24 HTML / CSS
非洲NO.1网上商店:Jumia肯尼亚
2016/08/18 全球购物
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
最新远光软件笔试题面试题内容
2013/11/08 面试题
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
移除Selenium中window.navigator.webdriver值
2022/06/10 Python