用Python实现2048游戏

今天带大家完成一份终端版2048游戏

2048游戏还是很经典的

首先还是新建一个空白的棋盘

def screen_into():#棋盘初始化
    for i in range(4):
        list_width = []
        for j in range(4):
            list_width.append(' ')
        screen.append(list_width)

然后是棋盘的显示函数

def screen_print():#打印棋盘
    print('——' * 13)
    for i in range(4):
        print('|',end=' ')
        for j in range(4):
            print(' '+screen[i][j],end='  | ')
        print()
        print('——'*13)

2048必不可少的随机生成棋子

def produce_chess():#随机生成棋子
    global screen
    while True:
        x=random.randint(0,3)
        y=random.randint(0,3)
        if screen[x][y]==' ':
            screen[x][y]=str(num[random.randint(0,2)])
            break

然后是判断是否游戏结束

def referee():#裁判
    dete=False
    for i in range(4):
        for j in range(4):
            if screen[i][j]==' ':
                dete=True
    if not dete:
        for i in range(4):
            for j in range(3):
                if screen[i][j]==screen[i][j+1]:
                    dete=True
        for j in range(4):
            for i in range(3):
                if screen[i][j]==screen[i+1][j]:
                    dete=True
    return dete

游戏操作的上下左右 四个函数

def move_w():#往上
    global screen
    dete=False
    for k in range(3):
        for i in range(1,4):#判断是否可以移动
            for j in range(4):
                if screen[i][j]!=screen[i-1][j] and screen[i-1][j]==' ':
                    screen[i][j],screen[i-1][j]=screen[i-1][j],screen[i][j]
                    dete=True
                    if i>1:
                        if screen[i-1][j]!=screen[i-2][j] and screen[i-2][j]==' ':
                            screen[i-1][j],screen[i-2][j]=screen[i-2][j],screen[i-1][j]
                            if i>2:
                                if screen[i-2][j]!=screen[i-3][j] and screen[i-3][j]==' ':
                                    screen[i-2][j],screen[i-3][j]=screen[i-3][j],screen[i-2][j]
        for i in range(1,4):#判定是否相同 相同则合成(下同)
            for j in range(4):
                if screen[i][j]==screen[i-1][j] and screen[i][j]!=' ':
                    screen[i-1][j]=str(int(screen[i][j])+int(screen[i-1][j]))
                    screen[i][j]=' '
                    dete = True
                    if i>1:
                        if screen[i][j]==screen[i-1][j] and screen[i][j]!=' ':
                            screen[i-1][j]=str(int(screen[i][j])+int(screen[i-1][j]))
                            screen[i][j]=' '
                            screen[i-1][j],screen[i-2][j]=screen[i-2][j],screen[i-1][j]
                            if i>2:
                                if screen[i][j]==screen[i-1][j] and screen[i][j]!=' ':
                                    screen[i-1][j]=str(int(screen[i][j])+int(screen[i-1][j]))
                                    screen[i][j]=' '
                                    screen[i-1][j],screen[i-2][j]=screen[i-2][j],screen[i-1][j]
                                    screen[i-2][j],screen[i-3][j]=screen[i-3][j],screen[i-2][j]
    if dete:
        produce_chess()
    screen_print()

def move_s():#往下
    global screen
    dete=False
    for k in range(3):
        for i in range(2,-1,-1):
            for j in range(4):
                if screen[i][j]!=screen[i+1][j] and screen[i+1][j]==' ':
                    screen[i][j],screen[i+1][j]=screen[i+1][j],screen[i][j]
                    dete = True
                    if i<2:
                        if screen[i+1][j]!=screen[i+2][j] and screen[i+2][j]==' ':
                            screen[i+1][j],screen[i+2][j]=screen[i+2][j],screen[i+1][j]
                            if i<1:
                                if screen[i+2][j]!=screen[i+3][j] and screen[i+3][j]==' ':
                                    screen[i+2][j],screen[i+3][j]=screen[i+3][j],screen[i+2][j]
        for i in range(2,-1,-1):
            for j in range(4):
                if screen[i][j]==screen[i+1][j] and screen[i][j]!=' ':
                    screen[i+1][j]=str(int(screen[i][j])+int(screen[i+1][j]))
                    screen[i][j]=' '
                    dete = True
                    if i<2:
                        if screen[i][j]==screen[i+1][j] and screen[i][j]!=' ':
                            screen[i+1][j]=str(int(screen[i][j])+int(screen[i+1][j]))
                            screen[i][j]=' '
                            screen[i+1][j],screen[i+2][j]=screen[i+2][j],screen[i+1][j]
                            if i<2:
                                if screen[i][j]==screen[i+1][j] and screen[i][j]!=' ':
                                    screen[i+1][j]=str(int(screen[i][j])+int(screen[i+1][j]))
                                    screen[i][j]=' '
                                    screen[i+1][j],screen[i+2][j]=screen[i+2][j],screen[i+1][j]
                                    screen[i+2][j],screen[i+3][j]=screen[i+3][j],screen[i+2][j]
    if dete:
        produce_chess()
    screen_print()

def move_a():#往左
    global screen
    dete = False
    for k in range(3):
        for i in range(4):
            for j in range(1,4):
                if screen[i][j]!=screen[i][j-1] and screen[i][j-1]==' ':
                    screen[i][j],screen[i][j-1]=screen[i][j-1],screen[i][j]
                    dete = True
                    if j>1:
                        if screen[i][j-1]!=screen[i][j-2] and screen[i][j-2]==' ':
                            screen[i][j-1],screen[i][j-2]=screen[i][j-2],screen[i][j-1]
                            if j>2:
                                if screen[i][j-2]!=screen[i][j-3] and screen[i][j-3]==' ':
                                    screen[i][j-2],screen[i][j-3]=screen[i][j-3],screen[i][j-2]
        for i in range(4):
            for j in range(1,4):
                if screen[i][j]==screen[i][j-1] and screen[i][j]!=' ':
                    screen[i][j-1]=str(int(screen[i][j])+int(screen[i][j-1]))
                    screen[i][j]=' '
                    dete = True
                    if j>1:
                        if screen[i][j]==screen[i][j-1] and screen[i][j]!=' ':
                            screen[i][j-1]=str(int(screen[i][j])+int(screen[i][j-1]))
                            screen[i][j]=' '
                            screen[i][j-1],screen[i][j-2]=screen[i][j-2],screen[i][j-1]
                            if j>2:
                                if screen[i][j]==screen[i][j-1] and screen[i][j]!=' ':
                                    screen[i][j-1]=str(int(screen[i][j])+int(screen[i][j-1]))
                                    screen[i][j]=' '
                                    screen[i][j-1],screen[i][j-2]=screen[i][j-2],screen[i][j-1]
                                    screen[i][j-2],screen[i][j-3]=screen[i][j-3],screen[i][j-2]
    if dete:
        produce_chess()
    screen_print()

def move_d():#往右
    global screen
    dete = False
    for k in range(3):
        for i in range(4):
            for j in range(2,-1,-1):
                if screen[i][j]!=screen[i][j+1] and screen[i][j+1]==' ':
                    screen[i][j],screen[i][j+1]=screen[i][j+1],screen[i][j]
                    dete = True
                    if j<2:
                        if screen[i][j+1]!=screen[i][j+2] and screen[i][j+2]==' ':
                            screen[i][j+1],screen[i][j+2]=screen[i][j+2],screen[i][j+1]
                            if j<1:
                                if screen[i][j+2]!=screen[i][j+3] and screen[i][j+3]==' ':
                                    screen[i][j+2],screen[i][j+3]=screen[i][j+3],screen[i][j+2]
        for i in range(4):
            for j in range(2,-1,-1):
                if screen[i][j]==screen[i][j+1] and screen[i][j]!=' ':
                    screen[i][j+1]=str(int(screen[i][j])+int(screen[i][j+1]))
                    screen[i][j]=' '
                    dete = True
                    if j<2:
                        if screen[i][j]==screen[i][j+1] and screen[i][j]!=' ':
                            screen[i][j+1]=str(int(screen[i][j])+int(screen[i][j+1]))
                            screen[i][j]=' '
                            screen[i][j+1],screen[i][j+2]=screen[i][j+2],screen[i][j+1]
                            if j<3:
                                if screen[i][j]==screen[i][j+1] and screen[i][j]!=' ':
                                    screen[i][j+1]=str(int(screen[i][j])+int(screen[i][j+1]))
                                    screen[i][j]=' '
                                    screen[i][j+1],screen[i][j+2]=screen[i][j+2],screen[i][j+1]
                                    screen[i][j+2],screen[i][j+3]=screen[i][j+3],screen[i][j+2]
    if dete:
        produce_chess()
    screen_print()

计算总成绩的函数

def score():#总成绩
    score_sum=0
    for i in range(4):
        for j in range(4):
            score_sum+=int(screen[i][j])
    return score_sum

完整代码如下

import random

screen=[]
num=[2,4,8]

def screen_into():#棋盘初始化
    for i in range(4):
        list_width = []
        for j in range(4):
            list_width.append(' ')
        screen.append(list_width)

def screen_print():#打印棋盘
    print('——' * 13)
    for i in range(4):
        print('|',end=' ')
        for j in range(4):
            print(' '+screen[i][j],end='  | ')
        print()
        print('——'*13)

def produce_chess():#随机生成棋子
    global screen
    while True:
        x=random.randint(0,3)
        y=random.randint(0,3)
        if screen[x][y]==' ':
            screen[x][y]=str(num[random.randint(0,2)])
            break

def referee():#裁判
    dete=False
    for i in range(4):
        for j in range(4):
            if screen[i][j]==' ':
                dete=True
    if not dete:
        for i in range(4):
            for j in range(3):
                if screen[i][j]==screen[i][j+1]:
                    dete=True
        for j in range(4):
            for i in range(3):
                if screen[i][j]==screen[i+1][j]:
                    dete=True
    return dete

def move_w():#往上
    global screen
    dete=False
    for k in range(3):
        for i in range(1,4):#判断是否可以移动
            for j in range(4):
                if screen[i][j]!=screen[i-1][j] and screen[i-1][j]==' ':
                    screen[i][j],screen[i-1][j]=screen[i-1][j],screen[i][j]
                    dete=True
                    if i>1:
                        if screen[i-1][j]!=screen[i-2][j] and screen[i-2][j]==' ':
                            screen[i-1][j],screen[i-2][j]=screen[i-2][j],screen[i-1][j]
                            if i>2:
                                if screen[i-2][j]!=screen[i-3][j] and screen[i-3][j]==' ':
                                    screen[i-2][j],screen[i-3][j]=screen[i-3][j],screen[i-2][j]
        for i in range(1,4):#判定是否相同 相同则合成(下同)
            for j in range(4):
                if screen[i][j]==screen[i-1][j] and screen[i][j]!=' ':
                    screen[i-1][j]=str(int(screen[i][j])+int(screen[i-1][j]))
                    screen[i][j]=' '
                    dete = True
                    if i>1:
                        if screen[i][j]==screen[i-1][j] and screen[i][j]!=' ':
                            screen[i-1][j]=str(int(screen[i][j])+int(screen[i-1][j]))
                            screen[i][j]=' '
                            screen[i-1][j],screen[i-2][j]=screen[i-2][j],screen[i-1][j]
                            if i>2:
                                if screen[i][j]==screen[i-1][j] and screen[i][j]!=' ':
                                    screen[i-1][j]=str(int(screen[i][j])+int(screen[i-1][j]))
                                    screen[i][j]=' '
                                    screen[i-1][j],screen[i-2][j]=screen[i-2][j],screen[i-1][j]
                                    screen[i-2][j],screen[i-3][j]=screen[i-3][j],screen[i-2][j]
    if dete:
        produce_chess()
    screen_print()

def move_s():#往下
    global screen
    dete=False
    for k in range(3):
        for i in range(2,-1,-1):
            for j in range(4):
                if screen[i][j]!=screen[i+1][j] and screen[i+1][j]==' ':
                    screen[i][j],screen[i+1][j]=screen[i+1][j],screen[i][j]
                    dete = True
                    if i<2:
                        if screen[i+1][j]!=screen[i+2][j] and screen[i+2][j]==' ':
                            screen[i+1][j],screen[i+2][j]=screen[i+2][j],screen[i+1][j]
                            if i<1:
                                if screen[i+2][j]!=screen[i+3][j] and screen[i+3][j]==' ':
                                    screen[i+2][j],screen[i+3][j]=screen[i+3][j],screen[i+2][j]
        for i in range(2,-1,-1):
            for j in range(4):
                if screen[i][j]==screen[i+1][j] and screen[i][j]!=' ':
                    screen[i+1][j]=str(int(screen[i][j])+int(screen[i+1][j]))
                    screen[i][j]=' '
                    dete = True
                    if i<2:
                        if screen[i][j]==screen[i+1][j] and screen[i][j]!=' ':
                            screen[i+1][j]=str(int(screen[i][j])+int(screen[i+1][j]))
                            screen[i][j]=' '
                            screen[i+1][j],screen[i+2][j]=screen[i+2][j],screen[i+1][j]
                            if i<2:
                                if screen[i][j]==screen[i+1][j] and screen[i][j]!=' ':
                                    screen[i+1][j]=str(int(screen[i][j])+int(screen[i+1][j]))
                                    screen[i][j]=' '
                                    screen[i+1][j],screen[i+2][j]=screen[i+2][j],screen[i+1][j]
                                    screen[i+2][j],screen[i+3][j]=screen[i+3][j],screen[i+2][j]
    if dete:
        produce_chess()
    screen_print()

def move_a():#往左
    global screen
    dete = False
    for k in range(3):
        for i in range(4):
            for j in range(1,4):
                if screen[i][j]!=screen[i][j-1] and screen[i][j-1]==' ':
                    screen[i][j],screen[i][j-1]=screen[i][j-1],screen[i][j]
                    dete = True
                    if j>1:
                        if screen[i][j-1]!=screen[i][j-2] and screen[i][j-2]==' ':
                            screen[i][j-1],screen[i][j-2]=screen[i][j-2],screen[i][j-1]
                            if j>2:
                                if screen[i][j-2]!=screen[i][j-3] and screen[i][j-3]==' ':
                                    screen[i][j-2],screen[i][j-3]=screen[i][j-3],screen[i][j-2]
        for i in range(4):
            for j in range(1,4):
                if screen[i][j]==screen[i][j-1] and screen[i][j]!=' ':
                    screen[i][j-1]=str(int(screen[i][j])+int(screen[i][j-1]))
                    screen[i][j]=' '
                    dete = True
                    if j>1:
                        if screen[i][j]==screen[i][j-1] and screen[i][j]!=' ':
                            screen[i][j-1]=str(int(screen[i][j])+int(screen[i][j-1]))
                            screen[i][j]=' '
                            screen[i][j-1],screen[i][j-2]=screen[i][j-2],screen[i][j-1]
                            if j>2:
                                if screen[i][j]==screen[i][j-1] and screen[i][j]!=' ':
                                    screen[i][j-1]=str(int(screen[i][j])+int(screen[i][j-1]))
                                    screen[i][j]=' '
                                    screen[i][j-1],screen[i][j-2]=screen[i][j-2],screen[i][j-1]
                                    screen[i][j-2],screen[i][j-3]=screen[i][j-3],screen[i][j-2]
    if dete:
        produce_chess()
    screen_print()

def move_d():#往右
    global screen
    dete = False
    for k in range(3):
        for i in range(4):
            for j in range(2,-1,-1):
                if screen[i][j]!=screen[i][j+1] and screen[i][j+1]==' ':
                    screen[i][j],screen[i][j+1]=screen[i][j+1],screen[i][j]
                    dete = True
                    if j<2:
                        if screen[i][j+1]!=screen[i][j+2] and screen[i][j+2]==' ':
                            screen[i][j+1],screen[i][j+2]=screen[i][j+2],screen[i][j+1]
                            if j<1:
                                if screen[i][j+2]!=screen[i][j+3] and screen[i][j+3]==' ':
                                    screen[i][j+2],screen[i][j+3]=screen[i][j+3],screen[i][j+2]
        for i in range(4):
            for j in range(2,-1,-1):
                if screen[i][j]==screen[i][j+1] and screen[i][j]!=' ':
                    screen[i][j+1]=str(int(screen[i][j])+int(screen[i][j+1]))
                    screen[i][j]=' '
                    dete = True
                    if j<2:
                        if screen[i][j]==screen[i][j+1] and screen[i][j]!=' ':
                            screen[i][j+1]=str(int(screen[i][j])+int(screen[i][j+1]))
                            screen[i][j]=' '
                            screen[i][j+1],screen[i][j+2]=screen[i][j+2],screen[i][j+1]
                            if j<3:
                                if screen[i][j]==screen[i][j+1] and screen[i][j]!=' ':
                                    screen[i][j+1]=str(int(screen[i][j])+int(screen[i][j+1]))
                                    screen[i][j]=' '
                                    screen[i][j+1],screen[i][j+2]=screen[i][j+2],screen[i][j+1]
                                    screen[i][j+2],screen[i][j+3]=screen[i][j+3],screen[i][j+2]
    if dete:
        produce_chess()
    screen_print()

def score():#总成绩
    score_sum=0
    for i in range(4):
        for j in range(4):
            score_sum+=int(screen[i][j])
    return score_sum

def main():
    screen_into()
    produce_chess()
    screen_print()
    while referee():
        user=input('请输入你的操作(wasd代表上下左右)')
        if user=='w' or user=='W':
            move_w()
        elif user=='s' or user=='S':
            move_s()
        elif user=='a' or user=='A':
            move_a()
        elif user=='d' or user=='D':
            move_d()
        else:
            print('指令错误,重新输入')
    print('游戏结束,你的成绩为:',score())
    input('输入任何字符退出游戏')

if __name__=='__main__':
    main()

效果图如下:


在这里插入图片描述

一起学习python,小白指导,教学分享记得私信我

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容