python扫雷

py2.7版本(py3.5运行不上)

# -*- coding: utf-8 -*-
import sys
import random
import string


class MineSweeping():
    '''扫雷主程序
    '''

    def __init__(self):
        '''初始化函式
        '''

        self.ROW = 8
        self.LINE = 8
        self.SCORE = 0  # 扫雷得分
        self.MineNum = 15  # 地雷总数
        self.xy_list = [[0, 0, 0, 0, 0, 0, 0, 0],
                        [0, 0, 0, 0, 0, 0, 0, 0],
                        [0, 0, 0, 0, 0, 0, 0, 0],
                        [0, 0, 0, 0, 0, 0, 0, 0],
                        [0, 0, 0, 0, 0, 0, 0, 0],
                        [0, 0, 0, 0, 0, 0, 0, 0],
                        [0, 0, 0, 0, 0, 0, 0, 0],
                        [0, 0, 0, 0, 0, 0, 0, 0]]

    def iniData(self):
        '''x,y坐标初始状态值函数
           0-没有地雷;1-有地雷
        '''

        # 游戏开始前所有数值归零
        for l in range(self.LINE):
            for r in range(self.ROW):
                self.xy_list[l][r] = 0

        Max = self.MineNum
        for x in range(self.LINE):
            for y in range(self.ROW):
                if 0 > Max:
                    self.xy_list[x][y] = 0
                else:
                    # 为了增加地雷分布范围,选择04随机数
                    if 1 == random.randint(0, 4):
                        self.xy_list[x][y] = 1
                        Max = Max - 1

    def getX(self):
        '''获得x坐标值
           @return : 返回x坐标值
           @type : int
        '''

        sys.stdout.write('X=')
        xRet = raw_input()
        while xRet == '' or (False == self.isNumber(xRet)) \
                or 0 > int(xRet) or int(xRet) > self.ROW:
            print 'Wrong number!(please input 0-7)'
            sys.stdout.write('X=')
            xRet = raw_input()
        return int(xRet)

    def getY(self):
        '''获得y坐标值
           @return : 返回y坐标值
           @type : int
        '''

        sys.stdout.write('Y=')
        yRet = raw_input()
        while yRet == '' or (False == self.isNumber(yRet)) \
                or 0 > int(yRet) or int(yRet) > self.LINE:
            print 'Wrong number!(please input 0-7)'
            sys.stdout.write('Y=')
            yRet = raw_input()
        return int(yRet)

    def isNumber(self, strVal):
        '''检查是否数值
           @param : 需检查的字符串
           @type : str
        '''

        nums = string.digits
        for i in strVal:
            if i not in nums:
                return False
        return True

    def checkMine(self, xPos, yPos):
        '''检查输入坐标是否有雷
           0-没有地雷;1-有地雷;2-已经清扫
           @param 1: x坐标
           @type : int
           @param 2: y坐标
           @type : int
           @return : 0-没有地雷;1-有地雷;2-已经清扫
           @rtype : int
        '''

        if 0 == self.xy_list[xPos][yPos]:
            self.xy_list[xPos][yPos] = 2
            return 0
        elif 2 == self.xy_list[xPos][yPos]:
            return 2
        else:
            return 1

    def play(self):
        '''游戏运行函数
        '''

        self.display(1)
        self.SCORE = 0
        self.iniData()
        # print self.xy_list

        while (1):
            x = self.getX()
            y = self.getY()
            while (2 == self.checkMine(x, y)):
                print 'values of x,y had inputed,please input new values!'
                x = self.getX()
                y = self.getY()
            if 1 == self.checkMine(x, y):
                self.end()
                break
            else:
                self.display(2)
                self.SCORE = self.SCORE + 1

    def end(self):
        '''游戏结束函数
        '''

        self.display(3)
        print '+======================+'
        print '+      Game Over       +'
        print '+======================+'
        print '   Your score is: %d    ' % self.SCORE

    def display(self, kind):
        '''图形输出函数
           @param:1-初始;2-运行;3-结束
           @type:int
        '''

        if kind == 1:
            print '+======================+'
            print '+      Game Start      +'
            print '+======================+'
            print '*-----------------*'
            for i in range(self.LINE):
                print '| 1 1 1 1 1 1 1 1 |'
            print '*-----------------*'
            print 'Please input values of x,y(0-7):'
        elif kind == 2:
            # 输出已经清扫位置
            print '*-----------------*'
            for i in range(self.LINE):
                sys.stdout.write('| ')
                for k in range(self.ROW):
                    if 2 == self.xy_list[i][k]:
                        sys.stdout.write('0 ')
                    else:
                        sys.stdout.write('1 ')
                print '|'
            print '*-----------------*'
            print 'Please input values of x,y(0-7):'
        else:
            # 输出所有的地雷与已经清扫位置
            print '*-----------------*'
            for i in range(self.LINE):
                sys.stdout.write('| ')
                for k in range(self.ROW):
                    if 2 == self.xy_list[i][k]:
                        sys.stdout.write('0 ')
                    elif 1 == self.xy_list[i][k]:
                        sys.stdout.write('X ')
                    else:
                        sys.stdout.write('1 ')
                print '|'
            print '*-----------------*'


if __name__ == '__main__':
    '''自测试
    '''
    ms = MineSweeping()
    while (1):
        ms.play()
        print '\n----------------------------------------------'
        print 'Quit game press \'q\',otherwise press other key!'
        print '----------------------------------------------'
        inputVal = raw_input()
        if 'q' == inputVal:
            break

参考:

http://blog.sina.com.cn/s/blog_4deeda250100uwcs.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值