加载中…
个人资料
rayment
rayment
  • 博客等级:
  • 博客积分:0
  • 博客访问:995
  • 关注人气:49
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Python小游戏--扫雷

(2011-09-23 11:51:22)
标签:

python游戏

扫雷

代码

it

分类: 程序人生
  最近在学习python,闲来有空想看看自己的学习成果,做了一个简易的扫雷游戏。效果如下图:


  游戏运作流程:首先是绘制一个8X8矩阵,所有雷区地块初始显示为1,表示没有清扫。用户输入要清扫的雷区地块x,y坐标。程序进行检测,如果没有雷,雷区地块显示改为0,表示已经清扫了,否则显示改为X,然后绘制出已经清扫的雷区地块和全部有雷地块,并计算出用户得分。


  游戏数据结构与逻辑:游戏的数据保存使用了list构造出一个8X8矩阵存储。 list中的值只要3种,0-没有地雷;1-有地雷;2-已经清扫。每次用户输入x,y坐标后,都进行修改list中的值。游戏乐趣的关键点在于地雷的随机分布设计。我采用了random函数,雷的最大个数为15个,每次游戏开始前,程序对地雷进行随机分布。好了,说了这么多,还是读者自己看程序代码吧,程序不太复杂,一看就明白。
------------------------------------begin--------------------------------------------------
# -*- coding: utf-8 -*-
'''@author: Rayment
   @version: 1.0
   @note: 实现扫雷游戏(2011-9-20)
          测试环境:python2.5.2
'''
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:
                    #为了增加地雷分布范围,选择0到4随机数
                    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
------------------------------------end--------------------------------------------------
代码下载:http://download.csdn.net/detail/raymentblog/3628972

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有