当前位置:网站首页 / W53048 / 正文

Python2048游戏源代码

时间:2019年11月19日 | 作者 : admin | 分类 : W53048 | 浏览: 4864次 | 评论 0

原标题:python 2048游戏源代码

随机导入

导入诅咒

#最初生成两个方块

STARTUP_TILES = 2

#随机生成的方块中出现4的概率

四种可能性= 0.1

#游戏棋盘

棋盘= [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]

#游戏分数

SCORE = 0

#有2048吗

HAS_2048 =假

#不再可能移动了吗

被卡住=假

#你问过你是否需要继续游戏吗?

要求继续=假

#方向

左、右、上、下= 0、1、2、3

#常量用于表示游戏是否可以结束

CAN_END =真

向量=[·[-1,0],[1,0],[0,-1],[0,1]]

成功=真

失败=假

#诅咒关联

屏幕=无

展开全文

def剪辑(编号,下限,上限):

如果数量<。lowerbound:

返回lowerbound

elif数量>个。upperbound:

返回upperbound

否则:

退货数量

def print_score():

global SCREEN

SCREEN.addstr(9,0“”。加入(['游戏结束,得分:',字符串(得分),')])

def print_prompt(提示):

global SCREEN

SCREEN.addstr(10,0,提示符)

def get_user_input(提示,请求输入):

global SCREEN

error_prompt_str = ' '。加入(

['请输入','加入(请求输入中x的[字符串(x)),'。"])

print_prompt(提示)

user_input = SCREEN.getkey()

当用户输入不在请求的输入中时:

print_prompt(error_prompt_str)

user_input = SCREEN.getkey()

返回用户输入(_ I)

def get_random_tile_number():

如果随机,返回4。随机()& lt=四_可能性其他2

def get_empty_pos():

结果= []

对于y,枚举(BOARD)中的行:

对于x,_在枚举(行)中:

如果董事会[y][x] == 0:

结果.追加((x,y))

回送结果

def get_random_empty_pos():

#因为get_empty_pos返回(x,y),相应的横坐标(即列数)和横坐标(行数)

尝试:

col,row = random . choice(get _ empty _ pos())

返回行,列

除索引错误:

不返回

def gen_tile():

pos = get_random_empty_pos()

如果位置为无:

return FAILED

行,列=位置

number = get_random_tile_number()

[行][列] =数字

返回SUCCESS

#开始新游戏

def new_game():

全球委员会,分数,HAS_2048,停滞,要求继续

#空纸板和分数

棋盘= [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]

SCORE = 0

HAS_2048 =假

被卡住=假

要求继续=假

#随机生成开始框

对于范围内(STARTUP_TILES):

gen_tile()

虽然为真:

打印板()

check_board()

如果HAS_2048未被要求继续:

user_choice = get_user_input(

你合并了2048年!您想继续吗?(输入“是”继续,输入“问”结束游戏)[“是/问]:”,

['Y ',' Q ',' Y ',' q']

如果用户在“yY”中选择:

打印提示(‘好的,继续游戏...’)

要求继续=真

“qQ”中的elif用户选择:

Print_prompt('好,结束游戏...')

破裂

elif IS _ STUCK:

破裂

#接受用户输入

方向= get_user_input(

请按方向键移动盒子。(按下问放弃这个游戏)',

['向上键','向下键','向左键','向右键','问','问']

“qQ”中的if方向:

破裂

elif方向== 'KEY_LEFT ':

方向=左侧

elif方向== 'KEY_RIGHT ':

方向=右侧

elif方向== '向上键':

方向=向上

elif方向== '向下键':

方向=向下

moved_result = move_tile(方向)

如果移动了_结果:

gen_tile()

打印分数()

#这里是这样的:整个板分为(1)顶部边框和(2)数字和数字下方的边框。

#以同样的方式水平地,它被分成(1)数字的左边界和(2)数字的右边界。

def print_board():

#顶部边框

SCREEN.addstr(0,0,'+ - + - + - + - +')

对于y,枚举(BOARD)中的行:

#左边框

SCREEN.addstr(y * 2 + 1,0,' | ')

#号码

对于x,枚举(行)中的数字:

#我们用0表示当前位置没有方块

numstr =字符串(num ),如果num!= 0否则“”

SCREEN.addstr(y * 2 + 1,x * 5 + 1,numstr +)

(' ' * (4镜头(numstr))) + '| ')

#数字下的边框

SCREEN.addstr(y * 2 + 2,0,'+ - + - + - + - +')

def move_tile(方向):

global SCORE

def get_line(偏移量:int,方向:int):

\ ' \ '

沿方向取所有偏移行/列的框。例如,当您需要向左移动第2行时,请使用

Get_line(1,左)获取此行。

\ ' \ '

global BOARD

如果方向==左:

返回板[偏移]

elif方向==右侧:

返回列表(反转(板[偏移])

elif方向==向上:

返回范围(4)中y的[板[y][偏移量]

elif方向==向下:

返回范围(3,-1,-1)]内y的[板[y][偏移量]

def put_line(line: list,offset: int,direction: int):

\ ' \ '

按照方向指示的方向在游戏板上放置一个正方形。

\ ' \ '

global BOARD

如果方向==左:

纸板[偏移量] =线

elif方向==右侧:

纸板[偏移量] =列表(反转(行))

elif方向==向上:

对于范围(4)中的y:

[y][偏移量]=[y线]

elif方向==向下:

对于范围(4)中的y:

[y][偏移量]=[线3 - y]

定义移动(行:列表):

\ ' \ '

移动一个正方形。

\ ' \ '

新线= []

获得的分数= 0

i = 0

当我和lt。4:

如果行[i] == 0:

i += 1

否则:

旧瓷砖=[I线]

i += 1

当我和lt。4和[i线] == 0:

i += 1

如果我。= 4或[i线]!=旧瓷砖:

new_line.append(old_tile)

否则:

获得的分数+=[I线] +旧瓷砖

新_行.追加([i行)+旧_平铺)

i += 1

而len(new _ line)& lt;4:

new_line.append(0)

#这里有三种情况:

# 1。动不了了。

# 2。移动,但没有得分。

# 3。移动并得分。

#在这里,当第一种情况发生时,返回无,当第二种/第三种情况发生时,返回移动的方块

#在这一步赢得点数。

如果new_line == line:

不返回

否则:

返回新行,获得分数

纸板_移动=假

对于范围(4)内的偏移:

line = get_line(偏移,方向)

moved_line = move(行)

如果移动行不是无:

纸板_移动=真

行,获得的分数=移动的行

put_line(直线、偏移、方向)

SCORE +=获得_score

put_line(直线、偏移、方向)

#在这里,对于整个游戏板,有两种情况:

# 1。至少移动了一行/一列。

# 2。不,他们都没动。

#在第二种情况下,不应生成新方块。返回游戏板是否移动到这里:

返回板_已移动

def get _ neighbor(x,y,宽度,高度):

global VECTOR

结果= []

对于vecTOR中的VEC:

新_x = x +矢量[0]

新[1]

如果0 <。= new_x <。宽度和0 <。= new_y <。高度:

result.append((new_x,new_y))

回送结果

def check_board():

全球板,HAS_2048,IS _ STUCK

对于y,枚举(BOARD)中的行:

对于x,枚举(行)中的数字:

#如果有2048年,那么记住有2048年。

如果num == 2048:

HAS_2048 =真

返回

#如果有空间,那么你可以继续前进。

elif num == 0:

被卡住=假

返回

否则:

对于get _ neighbor(x,y,4,4)中的new_x,new_y:

如果董事会[新_ y][新_x] ==数字:

被卡住=假

返回

卡住=真

返回

def main(stdscr):

global SCREEN

SCREEN = stdscr

虽然为真:

屏幕.清除()

新游戏()

user_choice = get_user_input(

你想开始下一集吗?(输入Y开始下一张磁盘,输入Q退出)[Y/Q]',[‘Y’、‘Q’、‘Y’、‘Q’])

如果用户选择“qQ”:

打印_提示符('退出...')

破裂

yY中的elif用户选择:

打印_提示(“下一步开始...”)

继续

#在交互模式下加载时,不要启动它。

如果_ _ name _ _ = = ' _ _ main _ _ ':

诅咒包装(主)返回搜狐查看更多

负责任的编辑:

推荐您阅读更多有关于“”的文章

请在这里放置你的在线分享代码

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。