扫雷 python2.7 控制台

扫雷 python

实习入职第一周要求从 c 转 python,leader 给我一个任务 用 python 写个扫雷的游戏
代码如下:

#!/usr/bin/python
# coding:utf-8

# python 写的扫雷游戏 控制台程序

import sys
import random

#  -3 代表没有翻开过
#   >= 0 代表已经扫描
#  -1 表示雷


class CMineSweeping:
    # 扫雷初始化
    def __init__(self, row = 8, line = 8, mineNum = 15):
        # 结构体 行 列 雷的个数
        self.m_row = row         # 行
        self.m_line = line        # 列
        self.m_score = 0          # 得分
        self.m_mineNum = mineNum  # 雷的数量
        self.m_xy_list = [[-3 for i in range(self.m_line)] for i in range(self.m_row)]  # 需要修改

    def initData(self):
        # 初始化状态值
        # 偷袭开始状态值清零
        self.m_xy_list = [[-3 for i in range(self.m_line)] for i in range(self.m_row)]  # 需要修改
        # 埋雷
        maxMine = self.m_mineNum
        while maxMine > 0:
            num_x = random.randint(0, self.m_row - 1)
            num_y = random.randint(0, self.m_line - 1)
            if self.m_xy_list[num_x][num_y] == -3:  # 需要修改
                self.m_xy_list[num_x][num_y] = -1   # 需要修改
                maxMine -= 1

    # 获取 (X,Y) 坐标
    def get_Pos(self, str_pos):
        while 1:
            try:
                num_x = raw_input(str_pos)
                #if num_x and 0 <= int(num_x) < LEN(self.line)  :
                if int (num_x) in range (self.m_line) and num_x:
                    break
                else:
                    print u'输入无效值'
            except:
                pass
        return int(num_x)

    # 获取周围 8 个方向雷的个数
    def get_Minecnt(self ,x , y):
        cnt = 0
        for i in range(x - 1,x + 2):
            for j in xrange(y - 1,y + 2):
                if i >= 0 and i < self.m_row and j >= 0 and j < self.m_line and self.m_xy_list[i][j] == -1:
                    cnt +=1
      #  print ("cnt:",cnt)
        return int(cnt)

    def mine_clear(self, x, y):
        pos = self.m_xy_list[x][y]
        m = x
        n = y
        #print("comes")
        if pos == -3:      #没有翻开过
            self.m_xy_list[x][y] =   self.get_Minecnt(m , n)
            return 0
        elif pos == -1:     # 表示雷
            return 1        # 雷直接 g 了
        elif pos >= 0:
            return 2        # 已经翻开过了




    # 界面的显示
    def mineFace(self, state):
        # 显示界面内容
        # 显示游戏状态
        # 1 表示最开始的状态
        # 2 表示正常扫雷输出状态
        # 3 表示游戏结束状态
        # 4 表示获取了完胜

        if state == 1:
            print '================+'
            print '    Game start  '
            print '====================='
            tt = ' #'
            print '**************************'
            for i in range(self.m_line):
                str_t = ''
                for t in xrange(self.m_row):
                    str_t += tt
                print "|%s|" % (str_t,)
            print '**************************'
            print 'Please input values of x,y(0-7):'
            # 刷新用户界面
        if state == 2:
            tt = ' #'
            print '**************************'
            for i in range(self.m_line):
                str_t = ''
                for t in xrange(self.m_row):
                    if self.m_xy_list[i][t] >= 0: # 这个表示已经打开的
                        str_t += str(self.m_xy_list[i][t]).rjust(2)
                    else:
                        str_t += tt             # 没有打开的 都用 这个
                print "|%s|" % (str_t,)
            print '**************************'
        if state == 3:
            print '**************************'
            for i in range(self.m_line):
                str_t = ''
                for t in xrange(self.m_row):
                    if int(self.m_xy_list[i][t]) == -1:
                        str_t += ' *'
                    else:
                        str_t += ' ' + str(self.get_Minecnt(i,t))
                print "|%s|" % (str_t,)
            print '**************************'

        if state == 4:
            tt = ' #'
            print '**************************'
            for i in range(self.m_line):
                str_t = ''
                for t in xrange(self.m_row):
                    if self.m_xy_list[i][t] >= 0:
                        str_t += str(self.m_xy_list[i][t]).rjust(2)
                    else:
                        str_t += ' @'
                print "|%s|" % (str_t,)
            print '**************************'


    def MainLoop(self):
        # 创建游戏主循环

        # 创建界面的运行

        self.mineFace(1)
        self.m_score = 0
        self.initData()

        # print self.xy_list

        # 进入主循环
        while 1:
            # 获取坐标位置
            x = self.get_Pos(' X = ')
            y = self.get_Pos(' Y = ')
            num = self.mine_clear(x, y)
            # 判断是不过的了完胜
            win = True
            for i in self.m_xy_list:
                if -3 in i:
                    win = False
                    break
            if win:
                num = 4

            # 执行刷新界面的函数
            if num == 0:
                self.mineFace(2)
                self.m_score += 10
            elif num == 2:
                print u'这个位置已经被排过了,证实没有雷'
            elif num == 1:
                print '+=================+'
                print '   Game over  '
                print '+=================+'
                print u'分数: ', self.m_score
                self.mineFace(3)
                # 是不是进行下一一局
                next = raw_input(u'是够进行下一局:Y or N ')
                if next.upper().startswith('Y'):
                    print u'下一局开始'
                    self.nextGame()
                else:
                    print '>>> Game exit'
                    break
            else:
                self.m_score += 10
                print u'恭喜您获得的完全的胜利'
                print u'分数:',self.m_score
                self.mineFace(4)
                next = raw_input(u'是否进行下一局: Y or N ')
                if next.upper().startswith('Y'):
                    print u'下一局开始'
                    self.nextGame()
                else:
                    print '>>> Game exit'
                    break

    # 下一局初始化信息
    def nextGame(self):
        self.mineFace(1)
        self.m_score = 0
        self.initData()


if __name__ == '__main__':


        mi = CMineSweeping(8, 8, 15)
        mi.MainLoop()
        sys.exit()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值