2048

作者: musaly | 来源:发表于2020-05-07 14:05 被阅读0次

    no.1

    项目:
    2048小游戏

    游戏规则:
    2048游戏共有16个格子,初始时初始数字由2或者4构成。
    1、手指向一个方向滑动,所有格子会向那个方向运动。
    2、相同数字的两个格子,相撞时数字会相加。
    3、每次滑动时,空白处会随机刷新出一个数字的格子。
    4、当界面不可运动时(当界面全部度被数字填满时),游戏结束;当界面中最大数字是2048时,游戏胜利。

    开发思路分解:由于项目较小,先用简单函数
    1.游戏类2048棋盘,棋盘可wasd移动
    2.移动时间内生成至少2个数字2或者4,并将相邻相同数字相加

    需要数据:2种
    1.输入指令识别
    2.棋盘列表

    函数功能:10个
    1.生成新棋盘1个
    2.方向移动4个,加转置棋盘1个
    3.判断生成新数字还是游戏结束1个
    4.打印棋盘函数1个
    5.主函数一个

    源码:game_2048_no.1

    import random
    list_2048=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    def get_new():
        for i in range(16):
            list_2048[i]=0
        generate_number()
    def generate_number():
        count=2
        zero=0
        zero_list=[]
        for i in range(16):
            if list_2048[i]==0:
                zero+=1
                zero_list.append(i)
        if zero==0:
            pass
        else:
            x=random.randint(0,zero-1)
            y=random.randint(0,zero-1)
        # print(x,y)
        # print(zero_list)
        list_2048[zero_list[x]]=list_2048[zero_list[y]]=2
    def move_left():
        for i in range(15,-1,-1):
            if list_2048[i]==0:
                list_2048.insert(4+4*(i//4),0)
                del list_2048[i]
        for i in range(4):
            for x in range(3):
                if list_2048[i*4+x]==list_2048[i*4+x+1]:
                    temp=list_2048[i*4+x]*2
                    list_2048[i*4+x]=temp
                    list_2048[i*4+x+1]=0
        for i in range(15,-1,-1):
            if list_2048[i]==0:
                list_2048.insert(4+4*(i//4),0)
                del list_2048[i]
        # generate_number()
    def print_2048():
        for i in range(4):
            print(list_2048[(i*4):(i*4+4)])
    def turn_list():
        list_2048[0],list_2048[3],list_2048[12],list_2048[15]=list_2048[12],list_2048[0],list_2048[15],list_2048[3]
        list_2048[5],list_2048[6],list_2048[9],list_2048[10]=list_2048[9],list_2048[5],list_2048[10],list_2048[6]
        list_2048[1],list_2048[7],list_2048[14],list_2048[8]=list_2048[8],list_2048[1],list_2048[7],list_2048[14]
        list_2048[4],list_2048[2],list_2048[11],list_2048[13]=list_2048[13],list_2048[4],list_2048[2],list_2048[11]
    def move_right():
        turn_list()
        turn_list()
        move_left()
        turn_list()
        turn_list()
    def move_down():
        turn_list()
        move_left()
        turn_list()
        turn_list()
        turn_list()
    def move_up():
        turn_list()
        turn_list()
        turn_list()
        move_left()
        turn_list()
    get_new()
    while True:
        # print("欢迎参加2048小游戏试玩")
        print_2048()
        direct=input("请输入移动方向:")
        if direct=="w":
            move_up()
            generate_number()
        elif direct=="s":
            move_down()
            generate_number()
        elif direct=="a":
            move_left()
            generate_number()
        elif direct=="d":
            move_right()
            generate_number()
    

    改进:
    1.代码简化,
    2.界面优化
    3.算法简化
    4.可读性差

    no.2

    1.入口简化,可模块化
    2.功能增强,界面优化

    import random
    list_2048=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    win_sign=4
    
    def get_new():
        for i in range(16):
            list_2048[i]=0
        generate_number()
    def generate_number():
        zero=0
        global sign
        sign=0
        zero_list=[]
        for i in range(16):
            if list_2048[i]==0:
                zero+=1
                zero_list.append(i)
            elif list_2048[i]==win_sign:
                sign=2
        if zero==0:
            sign=1
        else:
            x=random.randint(0,zero-1)
            y=random.randint(0,zero-1)
            list_2048[zero_list[x]]=list_2048[zero_list[y]]=2
    def print_2048():
        print("*"*10+"2048小游戏"+"*"*10)
        print("w:向上移动","s:向下移动","a:向左移动","d:向右移动")
        for x in range(4):
            print()
            for y in range(4):
                print(list_2048[x*4+y],end="\t")
    
    def move_left():
        for i in range(15,-1,-1):
            if list_2048[i]==0:
                list_2048.insert(4+4*(i//4),0)
                del list_2048[i]
        for i in range(4):
            for x in range(3):
                if list_2048[i*4+x]==list_2048[i*4+x+1]:
                    temp=list_2048[i*4+x]*2
                    list_2048[i*4+x]=temp
                    list_2048[i*4+x+1]=0
        for i in range(15,-1,-1):
            if list_2048[i]==0:
                list_2048.insert(4+4*(i//4),0)
                del list_2048[i]
    def turn_list():
        list_2048[0],list_2048[3],list_2048[12],list_2048[15]=list_2048[12],list_2048[0],list_2048[15],list_2048[3]
        list_2048[5],list_2048[6],list_2048[9],list_2048[10]=list_2048[9],list_2048[5],list_2048[10],list_2048[6]
        list_2048[1],list_2048[7],list_2048[14],list_2048[8]=list_2048[8],list_2048[1],list_2048[7],list_2048[14]
        list_2048[4],list_2048[2],list_2048[11],list_2048[13]=list_2048[13],list_2048[4],list_2048[2],list_2048[11]
    def move_right():
        turn_list()
        turn_list()
        move_left()
        turn_list()
        turn_list()
    def move_down():
        turn_list()
        move_left()
        turn_list()
        turn_list()
        turn_list()
    def move_up():
        turn_list()
        turn_list()
        turn_list()
        move_left()
        turn_list()
    
    def main():
        get_new()
        print("欢迎参加2048小游戏试玩")
        while True:
            print_2048()
            if sign == 1:
                print("游戏失败")
                break
            elif sign == 2:
                print("游戏胜利")
                break
            direct=input("\n请输入移动方向:")
            if direct=="w":
                move_up()
                generate_number()
            elif direct=="s":
                move_down()
                generate_number()
            elif direct=="a":
                move_left()
                generate_number()
            elif direct=="d":
                move_right()
                generate_number()
    main()
    

    no.3

    1.项目化
    2.面向对象编程
    3.增加注释

    """
        2048游戏核心代码区
    """
    import random
    # 游戏胜利标号
    win_sign = 4
    # 游戏棋盘控制
    class Game_2048:
        # 参数设置
        def __init__(self):
            self.list_2048 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
            self.sign = 0
        # 重建游戏
        def get_new(self):
            for i in range(16):
                self.list_2048[i] = 0
            self.__generate_number()
        # 打印2048
        def print_2048(self):
            print("*" * 10 + "2048小游戏" + "*" * 10)
            print("w:向上移动", "s:向下移动", "a:向左移动", "d:向右移动")
            print("n:重新开局")
            for x in range(4):
                print()
                for y in range(4):
                    print(self.list_2048[x * 4 + y], end="\t")
        # 生成数字
        def __generate_number(self):
            zero = 0
            zero_list = []
            for i in range(16):
                if self.list_2048[i] == 0:
                    zero += 1
                    zero_list.append(i)
                elif self.list_2048[i] == win_sign:
                    self.sign = 2
            if zero == 0:
                self.sign = 1
            else:
                x = random.randint(0, zero - 1)
                y = random.randint(0, zero - 1)
                self.list_2048[zero_list[x]] = self.list_2048[zero_list[y]] = 2
        # 转置矩阵
        def __turn_list(self):
            self.list_2048[0], self.list_2048[3], self.list_2048[12], self.list_2048[15] = self.list_2048[12], \
                                                                                           self.list_2048[0], \
                                                                                           self.list_2048[15], \
                                                                                           self.list_2048[3]
            self.list_2048[5], self.list_2048[6], self.list_2048[9], self.list_2048[10] = self.list_2048[9], self.list_2048[
                5], self.list_2048[10], self.list_2048[
                                                                                              6]
            self.list_2048[1], self.list_2048[7], self.list_2048[14], self.list_2048[8] = self.list_2048[8], self.list_2048[
                1], self.list_2048[7], self.list_2048[
                                                                                              14]
            self.list_2048[4], self.list_2048[2], self.list_2048[11], self.list_2048[13] = self.list_2048[13], \
                                                                                           self.list_2048[4], \
                                                                                           self.list_2048[2], \
                                                                                           self.list_2048[
                                                                                               11]
        # 方向移动
        def move_left(self):
            for i in range(15, -1, -1):
                if self.list_2048[i] == 0:
                    self.list_2048.insert(4 + 4 * (i // 4), 0)
                    del self.list_2048[i]
            for i in range(4):
                for x in range(3):
                    if self.list_2048[i * 4 + x] == self.list_2048[i * 4 + x + 1]:
                        temp = self.list_2048[i * 4 + x] * 2
                        self.list_2048[i * 4 + x] = temp
                        self.list_2048[i * 4 + x + 1] = 0
            for i in range(15, -1, -1):
                if self.list_2048[i] == 0:
                    self.list_2048.insert(4 + 4 * (i // 4), 0)
                    del self.list_2048[i]
            self.__generate_number()
        def move_right(self):
            self.__turn_list()
            self.__turn_list()
            self.move_left()
            self.__turn_list()
            self.__turn_list()
        def move_down(self):
            self.__turn_list()
            self.move_left()
            self.__turn_list()
            self.__turn_list()
            self.__turn_list()
        def move_up(self):
            self.__turn_list()
            self.__turn_list()
            self.__turn_list()
            self.move_left()
            self.__turn_list()
    # 游戏界面控制
    def main():
        game = Game_2048()
        print("欢迎参加2048小游戏试玩")
        while True:
            game.print_2048()
            if game.sign == 1:
                print("游戏失败")
                break
            elif game.sign == 2:
                print("游戏胜利")
                break
            direct = input("\n请输入移动方向:")
            if direct == "w":
                game.move_up()
            elif direct == "s":
                game.move_down()
            elif direct == "a":
                game.move_left()
            elif direct == "d":
                game.move_right()
            elif direct =="n":
                game.get_new()
            # os.system("clear")
    
    """
        游戏入口
    """
    from code2048 import *
    
    if __name__ == '__main__':
        main()
    
    总结

    基本达成目标,游戏界面可以也用面向对象编程,而且可以GUI和exe做成小游戏的形式

    相关文章

      网友评论

          本文标题:2048

          本文链接:https://www.haomeiwen.com/subject/oxvoghtx.html