2048

2020-05-07  本文已影响0人  musaly

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做成小游戏的形式

上一篇下一篇

猜你喜欢

热点阅读