如果你对python感兴趣,我这有个学习Python基地,里面有很多学习资料,感兴趣的+Q群:688244617
init()
while(state !='Exit'):
op = get_action()
if op =='quit':
state = 'Exit'
elif op == 'Restart':
state = 'init'
else
state = 'game'
#调用状态类
state_class[state]()
#相关函数
init()
get_action
game():
执行操作,
判断is_win?
判断is_lose?
返回状态
注意到,由于游戏胜利或gameover后与正常游戏操作中的输入操作不同(赢了输了只能重开或者退出),所以要区分这些,if-elif-else语句就会很复杂,这里我们采用条件类,将不同的状态作为条件写在字典中,每次循环即可。
state_functions = {
'Init':init,
'win': lambda:not_game('Win')
'lose': lambda:not_game('gameover')
'game': game}
def main():
state = 'init'
while(state !='Exit'):
state_functions[state]()
这时,在主函数中定义not_game()、game()即可:
def not_game():
get_action()
执行action的操作
def game():
get_action()
判断该方向是否可以移动:
可以-->执行-->得到新棋盘-->判断输赢:
win-->return ‘win’
lose --> return 'lose'
else --> return 'game'
不可以--> pass -->还是旧棋盘 -->原路返回
当了解了游戏状态与逻辑的设计时,我们一步一步地进行实现:
1.curses窗口设置与使用
我们在curses窗口(控制字符界面)下设计这个棋盘。
使用curses.wrapper()函数可以更容易的进行调试:wrapper会将界面变量screen传递给main函数,而一旦main函数执行完毕,则自动退出该控制字符界面。
def main(screen):
while():
......
curses.wrapper(main)
这段代码进入curses界面,对main函数赋参整个窗口对象screen。接着执行main函数里的内容。
- 绘制游戏界面
我们需要画出这个框,同时需要填入数字。
绘制语句用screen.addstr(‘字符串’ + ‘\n’)来绘制。
def draw(self, screen):
help_string1 = 'W(up) S(down) A(left) D(right)'
help_string2 = ' R(restart) Q(exit)'
gameover_string = ' GAME OVER'
win_string = ' You Win'
def draw_line():
line = '+' + ('+------' * self.width + '+')[1:]
separator = defaultdict(lambda : line)
if not hasattr(draw_line, "counter"):
draw_line.counter = 0
screen.addstr(separator[draw_line.counter] + '\n')
draw_line.counter += 1
#screen.addstr('+' + "------+" * 4 + '\n')
def draw_nums(row_num):
#给定一行(默认4个)数字,如[0, 0, 0, 4],以列表存放,该函数将其画在screen上
screen.addstr(''.join('|{: ^5} '.format(num) if num > 0 else '| ' for num in row_num) + '|' + '\n')
#开始draw
screen.clear()
screen.addstr('SCORE: 0' + '\n')
for row in self.field:
draw_line()
draw_nums(row)
draw_line()
if self.win ==1:
screen.addstr(win_string + '\n')