扫雷 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()