python练手小项目2048

开始页面
在这里插入图片描述

如果你想体验一下
http://gabrielecirulli.github.io/2048

源代码
https://pan.baidu.com/s/1_LoS5QsQwjG3NQz_8pAGHg
提取码2sgz
在这里插入图片描述

借鉴一下大佬的
https://blog.csdn.net/weixin_42668123/article/details/82381568

2048游戏规则:简单的移动方向键让数字叠加,并且获得这些数字每次叠加后的得分,当出现2048这个数字时游戏胜利。同时每次移动方向键时,都会在这个4*4的方格矩阵的空白区域随机产生一个数字2或者4,如果方格被数字填满了,那么就GameOver了

生成一个4*4的矩阵用于进行游戏

field = [[0 for j in range(4)] for i in range(4)]

调用random函数在矩阵中随机位置创建数字

import random
def random_create():
    i = random.choice(range(4))
    j = random.choice(range(4))
    value = random.choice([2224])
    field[i][j] = value

将生成的图像画出来

def draw_sep():
    print('+-----' * 4 + '+')



def draw_num(row):
    print(''.join('|{:^5}'.format(num) if num != 0 else '|     ' for num in row) + '|')


for row in li:
    draw_sep()
    draw_num(row)
draw_sep()

在这里插入图片描述

判断一下你的数字是否可以移动
如果第一个是0下一个不是0就可以移动

def is_row_change(row):
    # row
    # 判断一行内容是否可以移动
    def is_change(i):
        # 判断每两个元素之间是否可以移动
        if row[i] == 0 and row[i + 1] != 0:
            return True
        if row[i] != 0 and row[i + 1] == row[i]:
            return True
        else:
            return False

    return any([is_change(index) for index in range(len(row) - 1)])

如果可以移动,具体怎么操作

def is_move_left(field):
    return any([is_row_change(row) for row in field])


def is_move_right(field):
    #  对于列表元素进行反转
    field = invert(field)
    print(field)
    return is_move_left(field)

def is_move_up(field):
    # 对于列表元素进行转置
    field = transpose(field)
    return is_move_left(field)

def is_move_down(field):
    # 反转+ 转置
    field = transpose(field)
    return is_move_right(field)

棋盘移动在相加

def tight(row):   # [2, 0, 2, 0]
    # 最快的方式, 通过排序实现...........
    return sorted(row, key=lambda x: if  x == 0 )
score = 0
# 相加
def merge(row): # [2,2,0,0]
    # [0,1,2]
    for i in range(len(row)-1):
        # 如果两个值相等, 前一个元素*2, 后一个元素改为0。
        if row[i] == row[i+1]:
            row[i] *= 2
            row[i+1] = 0
            # 如果覆盖成功, 就给得分
            global score
            score += row[i]
    return row

具体的上下左右的移动

 def move_row_left(self, row):
        return self.tight(self.merge(self.tight(row)))

    def move_left(self, field):
        return [self.move_row_left(row) for row in field]

    def move_right(self, field):
        field = self.invert(field)
        return self.invert([self.move_row_left(row) for row in field])

    def move_up(self, field):
        return self.transpose([self.move_row_left(row) for row in self.transpose(field)])

    def move_down(self, field):
        return self.invert(self.transpose([self.move_row_left(row)
                                           for row in self.invert(self.transpose(field))]))

判断胜负
出现2048为胜利
无法移动为输

def victory(field):
    li = [y for row in li for y in row]
    if max(li) >= 2048:
        print('Victory')
def game_over(filed):
    if all((is_move_left(filed), is_move_right(filed), is_move_up(filed), is_move_down(filed))) == False:
        print('Game Over') 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值