用Python实现2048小游戏(终端升级版)相比上篇 增添了撤回功能和历史最高分数的统计

时隔数天,我又回来了
最近工作稍微有点忙,没有更新
昨晚给学生上课,写2048的时候,被学生提了需求,一个撤回功能和历史分数的记录
就拿过来给大家也看一下

下方链接为原游戏代码
用Python实现2048小游戏(终端版)

首先是增添的撤回功能
每局游戏有三次撤回的机会

    # 撤销
    def revoke(self):
        if self.count > 0:
            self.count -= 1
            self.screen = copy.deepcopy(self.h[-2])
            del self.h[-2:]
        else:
            print('您已经没有撤销机会了')
        self.screen_print()

然后是历史分数
这边我是写入了一个文件中保存
因为代码是整合在主体当中了
就不单独放代码了

游戏的主体相比上篇文章也进行了重构
写了类, 一些判断也稍微优化了一点

完整代码如下:

import random
import copy


class Game:
    def __init__(self):
        # 棋盘信息存储
        self.screen = []
        self.h = []
        self.count = 3

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

    # 打印棋盘
    def screen_print(self):
        print('-' * 25)
        for i in range(4):
            print('|', end=' ')
            for j in range(4):
                print(' ' + str(self.screen[i][j]), end='  | ')
            print()
            print('-' * 25)

    # 随机生成棋子
    def produce_chess(self):
        while True:
            # 随机一个坐标
            x = random.randint(0, 3)
            y = random.randint(0, 3)
            if self.screen[x][y] == ' ':
                self.screen[x][y] = random.choice([2, 4])
                break

    # 向上移动
    def move_w(self):
        flag = False
        for k in range(3):
            # 判断是否可以移动
            for i in range(1, 4):
                for j in range(4):
                    if self.screen[i][j] != self.screen[i - 1][j] and self.screen[i - 1][j] == ' ':
                        self.screen[i][j], self.screen[i - 1][j] = self.screen[i - 1][j], self.screen[i][j]
                        flag = True
            # 判断是否可以合并
            for i in range(1, 4):
                for j in range(4):
                    if self.screen[i][j] == self.screen[i - 1][j] and self.screen[i - 1][j] != ' ':
                        self.screen[i - 1][j] = self.screen[i - 1][j] * 2
                        self.screen[i][j] = ' '
                        flag = True
        if flag:
            self.produce_chess()
        self.screen_print()

    # 向下移动
    def move_s(self):
        flag = False
        for k in range(3):
            # 判断是否可以移动
            for i in range(2, -1, -1):
                for j in range(4):
                    if self.screen[i][j] != self.screen[i + 1][j] and self.screen[i + 1][j] == ' ':
                        self.screen[i][j], self.screen[i + 1][j] = self.screen[i + 1][j], self.screen[i][j]
                        flag = True
            # 判断是否可以合并
            for i in range(2, -1, -1):
                for j in range(4):
                    if self.screen[i][j] == self.screen[i + 1][j] and self.screen[i + 1][j] != ' ':
                        self.screen[i + 1][j] = self.screen[i + 1][j] * 2
                        self.screen[i][j] = ' '
                        flag = True
        if flag:
            self.produce_chess()
        self.screen_print()

    # 向左移动
    def move_a(self):
        flag = False
        for k in range(3):
            # 判断是否可以移动
            for i in range(4):
                for j in range(1, 4):
                    if self.screen[i][j] != self.screen[i][j - 1] and self.screen[i][j - 1] == ' ':
                        self.screen[i][j], self.screen[i][j - 1] = self.screen[i][j - 1], self.screen[i][j]
                        flag = True
            # 判断是否可以合并
            for i in range(4):
                for j in range(1, 4):
                    if self.screen[i][j] == self.screen[i][j - 1] and self.screen[i][j - 1] != ' ':
                        self.screen[i][j - 1] = self.screen[i][j - 1] * 2
                        self.screen[i][j] = ' '
                        flag = True
        if flag:
            self.produce_chess()
        self.screen_print()

    # 向右移动
    def move_d(self):
        flag = False
        for k in range(3):
            # 判断是否可以移动
            for i in range(4):
                for j in range(2, -1, -1):
                    if self.screen[i][j] != self.screen[i][j + 1] and self.screen[i][j + 1] == ' ':
                        self.screen[i][j], self.screen[i][j + 1] = self.screen[i][j + 1], self.screen[i][j]
                        flag = True
            # 判断是否可以合并
            for i in range(4):
                for j in range(2, -1, -1):
                    if self.screen[i][j] == self.screen[i][j + 1] and self.screen[i][j + 1] != ' ':
                        self.screen[i][j + 1] = self.screen[i][j + 1] * 2
                        self.screen[i][j] = ' '
                        flag = True
        if flag:
            self.produce_chess()
        self.screen_print()

    # 判断游戏是否可以继续运行
    def referee(self):
        flag = False
        # 是否还有空格
        for i in range(4):
            for j in range(4):
                if self.screen[i][j] == ' ':
                    flag = True
        # 是否还能继续想加
        if not flag:
            # 判断是否可以左右移动
            for i in range(4):
                for j in range(3):
                    if self.screen[i][j] == self.screen[i][j + 1]:
                        flag = True
            # 判断是否可以上下移动
            for i in range(3):
                for j in range(4):
                    if self.screen[i][j] == self.screen[i + 1][j]:
                        flag = True
        return flag

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

    # 撤销
    def revoke(self):
        if self.count > 0:
            self.count -= 1
            self.screen = copy.deepcopy(self.h[-2])
            del self.h[-2:]
        else:
            print('您已经没有撤销机会了')
        self.screen_print()


if __name__ == '__main__':
    f = open('score_h.txt', 'r+', encoding='utf-8')
    score_h = [int(i) for i in f.read().split('\n') if i]
    max_score = max(score_h) if score_h else 0
    while True:
        # 游戏对象实例化
        game_2048 = Game()
        # 创造棋盘
        game_2048.screen_init()
        # 开始游戏
        game_2048.produce_chess()
        game_2048.screen_print()
        while game_2048.referee():
            # user = input('请输入你的操作(wasd代表上下左右,SOS代表撤销)\n>>>')
            user = random.choice('wasd')
            if user in ['W', 'w']:
                game_2048.move_w()
            elif user in ['S', 's']:
                game_2048.move_s()
            elif user in ['A', 'a']:
                game_2048.move_a()
            elif user in ['D', 'd']:
                game_2048.move_d()
            elif user == 'SOS':
                game_2048.revoke()
            else:
                print('输入的指令错误,请重新输入')
            game_2048.h.append(copy.deepcopy(game_2048.screen))
        score = game_2048.score()
        print('本局游戏结束!')
        print('您的成绩为:{}'.format(score))
        max_score = score if score > max_score else max_score
        print('您的历史最高成绩为:{}'.format(max_score))
        f.write(str(score) + '\n')
        if not input('是否继续游戏,继续游戏请输入任意字符'):
            break
    print('退出游戏!')
    f.close()

效果图:

在这里插入图片描述
一起学习python,小白指导,教学分享记得私信我

猜你喜欢

转载自blog.csdn.net/Miku_wx/article/details/112704635
今日推荐