求Python大神给个200行左右的代码,多做注释,做最后的功课。

#-*-?编码:utf-8?-*-

进口?诅咒?#介绍curses模块,curses是Linux/Unix下广泛使用的图形函数库,可以在DOS下绘制用户界面和漂亮的图形。

从哪里?随机?进口?randrange?选择?#?介绍rand范围和随机模块的选择。

从哪里?收藏?进口?defaultdict?#从集合中引入defaultdict。

字母代码?=?【ord(ch)?为了什么?ch?在?WASDRQwasdrq']?#ord函数是将字符转换成相应的数字。

行动?=?【‘上’,?左',?向下',?对吗?重新启动',?退出']?#向上、向左、向下、向右、重新启动、退出

actions_dict?=?dict(zip(letter_codes,行动?*?2))?#将字母与动作搭配起来。?Zip是为了对应元组中的值。

#############################

w?向上

答?左边的

s?向下

d?对吧

r?重新开始

q?出口

w?向上

答?左边的

s?向下

d?对吧

r?重新开始

q?出口

##############################################?

def?get_user_action(键盘):

夏尔?=?" N "#char的初始值是Nwhile?夏尔?不是吗?在?动作_字典:

夏尔?=?keyboard.getch()return?actions_dict[char]?# Blocks+loops,并且直到获得有效的用户输入才返回相应的行为定义?转置(字段):返回?【列表(排)?为了什么?划?在?zip(*field)]?在#zip函数中添加*号意味着将行变为列,将列变为行。所以这段代码是行列转置def?invert(field):返回?[row[::-1]?为了什么?划?在?场】?#这段代码是要把类颠倒过来。游戏场(对象):?#创建一个名为GameField的类来创建棋盘def?__init__(self,身高=4,?宽度=4,?win=2048):?这个类的三个参数是self.height?=?身高?#高自我.宽度?=?宽度?#宽己. win_value?=?Win#通关分数self.score?=?0#当前得分self.highscore?=?0#最高分self.reset()#重置棋盘def?Reset(self):#定义一个Reset函数if?self.score?& gt?Self.highscore:#如果当前分数大于最高分,则将当前分数赋给最高分Self.highscore?=?self.scoreself.score?=?0#当前分数恢复到self.field?=?[[0?为了什么?我?在?范围(self.width)]?为了什么?j?在?Range(self.height)]#纵横坐标还原为(0,0)self.spawn()#调用spawn来函数self.spawn()def?动(自己,?方向):#定义移动函数def?Move_row_left(row):#将def向左移动?拧紧(row):?#?挤压?非零?元素?一起?将分散的非零单元格挤在一起

new_row?=?【我?为了什么?我?在?划?如果?我?!=?0]?#如果I不等于零,则将它们赋给元组new_row。

new_row?+=?[0?为了什么?我?在?range(len(row)?-?Len(new_row))]#其余位置补0返回?New_row#返回这个元组定义?Merge(row):#定义合并函数,用于合并单元格。

配对?=?True # pair初始值为false。

new_row?=?[]#new_row初始值为空?我?在?Range(len(row)):#让我在网格中循环if?Pair:如果pair为真。

new_row.append(2?*?Row[i])#然后将rowi的值乘以2,追加到new_row之后self.score?+=?2?*?Row[i]#并且分数是rowi的值乘以2。

配对?=?True # pair重新分配给false else: if pair为true if?我?+?1?& lt?len(排)?然后呢。排[i]?==?排[我?+?1]:#如果i+1还没有到达边界,此时rowi=rowi+1。

配对?=?真的吗?#所以配对是真的

New _ row.append (0) #在New _ row后添加零else:

New_row.append(row[i])#否则,添加rowi。

断言?len(new_row)?==?len(排)?#提醒他们要一样长。回归?new_rowreturn?收紧(合并(收紧(行)))?#反复合并,直到知道不能合并为止。

动作?=?{}

移动['左']?=?λ?场:?\

【move_row_left(row)?为了什么?划?在?字段]#移动

移动['右']?=?λ?场:?\

invert(moves[' left '](invert(field))# invert是反转。

moves['Up']=?λ?场:?\

Transpose(moves[' left '](Transpose(field))# Transpose是一种移调。

移动['向下']?=?λ?场:?\

transpose(移动['右'](transpose(field)))if?方向?在?招式:如果?自我。move _ is _ possible(方向):#如果移动方向是四个方向,self.field?=?Moves[direction](self.field)然后调用Moves函数self.spawn()#生成随机数返回?Trueelse:返回?Falsedef?is_win(self):返回?任何(任何(我?& gt=?self.win_value?为了什么?我?在?排)?为了什么?划?在?self.field)def?is_gameover(self):回归?不是吗?any(self.move_is_possible(move)?为了什么?搬家?在?动作)定义?画(自己,?屏幕):

help_string1?=?(W)涨?(S)下来了?(一)左?“权利”

help_string2?=??(R)重启?“退出”

gameover_string?=?游戏?结束

win_string?=??你呢。赢了!def?转换(字符串):

screen.addstr(string?+?\n ')定义?draw_hor_separator():

线?=?'+'?+?('+ - '?*?self.width?+?'+')[1:]

分离器?=?default dict(λ:?行)如果?不是吗?hasattr(draw_hor_separator,?“计数器”):

draw_hor_separator.counter?=?0

cast(分隔符[draw_hor_separator.counter])

draw_hor_separator.counter?+=?1def?draw_row(row):

强制转换(')。join('|{:?^5}?'。格式(数字)?如果?num?& gt?0?不然呢?'|?'?为了什么?num?在?排)?+?'|')

screen.clear()

演员表('分数:')?+?str(self.score))如果?0?!=?self.highscore:

cast('HGHSCORE:')?+?str(self.highscore))for?划?在?自我字段:

绘图_水平_分隔符()

draw_row(行)

draw_hor_separator()if?self.is_win():

cast(win_string)else:if?self.is_gameover():

cast(gameover_string)else:

cast(help_string1)

cast(help_string2)def?产卵(自己):

新元素?=?4?如果?randrange(100)?& gt?89?不然呢?2

(I,j)?=?choice((I,j)?为了什么?我?在?范围(self.width)?为了什么?j?在?范围(self.height)?如果?self.field[i][j]?==?0])self.field[i][j]?=?new_elementdef?move_is_possible(自我,方向):def?row _ is _ left _ mobile(row):?

def?变化(一):?#?真的吗?如果?会有吗?是吗?改变?在?我……tileif?排[i]?==?0?然后呢。排[我?+?1]?!=?0:?#?Movereturn?Trueif?排[i]?!=?0?然后呢。排[我?+?1]?==?第[i]行:#?Mergereturn?Truereturn?Falsereturn?任何(变化(一)?为了什么?我?在?range(len(row)?-?1))

检查?=?{}

检查['左']?=?λ?场:?\

any(row _ is _ left _ mobile(row)?为了什么?划?在?场)

检查['右']?=?λ?场:?\

check['Left'](反转(字段))

check['Up']=?λ?场:?\

check['Left'](转置(字段))

检查['向下']?=?λ?场:?\

检查['右'](转置(字段))如果?方向?在?检查:退货?检查【方向】(self.field)else:返回?Falsedef?main(stdscr):def?Init():#重置游戏板。

game_field.reset()返回?游戏清晰度?Not_game(状态):#平局?GameOver?还是?赢?的接口

游戏_领域。draw (stdcr) #读取用户输入获取动作,判断是重启游戏还是结束游戏。

行动?=?获取用户操作

回应?=?default dict(λ:?状态)?#默认为当前状态。如果没有行为,它将一直在当前界面中循环。

响应['Restart'],?响应['退出']?=?Init ',?退出吗?#转换成不同的状态对应不同的行为返回?响应[动作]定义?Game():#绘制当前棋盘状态。

Game _ field.draw (stdcr) #读取用户输入以获取动作。

行动?=?get_user_action(stdscr)if?行动?==?'重启':返回?初始化“如果”?行动?==? ''退出':返回?'退出'如果?game_field.move(动作):?#?搬家?成功吗?' game_field.is_win():return?'如果赢了呢?' game _ field . is _ game over():return?'游戏结束了吗?游戏

state_actions?=?{'Init ':?init,' Win ':λ:?not_game('Win '),' Gameover ':?λ:?not_game('gameover '),' Game ':?比赛

}

curses.use_default_colors()

游戏_领域?=?游戏场(胜利=32)

状态?=?“Init”#状态机开始循环,而?状态?!=?退出':

状态?=?状态_操作[状态]()

curses.wrapper(main)