求Python大神给个200行左右的代码,多做注释,做最后的功课。
进口?诅咒?#介绍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)