鱼C论坛

 找回密码
 立即注册
查看: 1828|回复: 0

[技术交流] 2048小游戏,第一次做,希望大家指点指点

[复制链接]
发表于 2022-3-12 10:47:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下
import random
import os
import keyboard
import copy 
import sys

class Game_2048:
    randomNum = [2, 4]
    probability = [0.65, 0.35]
    mainList = []
    lastMainList = []
    theNewNum = []
    length = 0
    grade = 0
    bestGrade = 0
    # emptyPosition  []  # 用于记录空位置

    # 初始化4*4方格
    def __init__(self, length = 4, count = 2):
        '''
        length : 表示初始化网格大小
        count : 表示初始化几个元素
        '''
        self.mainList = []
        self.length = length
        for i in range(length):
            sonList = []
            for j in range(length):
                sonList.append(0)
            self.mainList.append(sonList)
        self.writeNum(count)
        self.getUserdata()
        self.printMap()
        print("The map has already init...", end = "\r")

    # 判断该处是否为空
    def isEmpty(self, i, j):
        if self.mainList[i][j] == 0:
            return True
        else:
            return False
            
    # 按给定的概率生成数字
    def getCertainProbability(self):
        x = random.uniform(0, 1)
        cumulativeProbability = 0.0
        for item, itemProbability in zip(self.randomNum, self.probability):
            cumulativeProbability += itemProbability
            if x < cumulativeProbability:
                break
        return item

    # 随机写入数字
    def writeNum(self, count):
        while count:
            xAxis = random.randint(0, self.length-1)
            yAxis = random.randint(0, self.length-1)
            if self.isEmpty(xAxis, yAxis):
                self.mainList[xAxis][yAxis] = self.getCertainProbability()
                count -= 1

    # 键盘事件对应操作
    def pressKey(self, anyKey):
        flag = 0
        anyKey = str(anyKey)
        self.lastMainList = copy.deepcopy(self.mainList)
        if "w up" in anyKey or "W up" in anyKey:
            self.pressW()
            flag = 1
        elif "a up" in anyKey or "A up" in anyKey:
            self.pressA()
            flag = 1
        elif "s up" in anyKey or "S up" in anyKey:
            self.pressS()
            flag = 1
        elif "d up" in anyKey or "D up" in anyKey:
            self.pressD()
            flag = 1
        else:
            if "a down" not in anyKey and "w down" not in anyKey and "s down" not in anyKey and "d down" not in anyKey\
               and "A down" not in anyKey and "W down" not in anyKey and "S down" not in anyKey and "D down" not in anyKey:
                print('''Please press one of the "wasd" in the keyboard !''', end = "\r")
            else:
                 pass
        if flag == 1:
            if self.isFall():
                print("You fall...")
                input("\b"*100 + "please any key for exit...")
                exit()
        self.theNewNum = []
        
    def pressW(self):
        listTemp = []
        for c in range(self.length):
            for r in range(self.length):
                listTemp.append(self.mainList[r][c])
            listTemp = self.addNum(listTemp)
            for r in range(self.length):
                self.mainList[r][c] = listTemp[r]
            listTemp = []
        if self.lastMainList != self.mainList:
            if self.isWin() == 1024:
                self.writeNum(1)
                self.grade += self.getGrade()
                self.printMap()
                print("You win...")
                input("\b"*100, "please any key to exit...")
                exit()
            else:
                self.writeNum(1)
        self.grade += self.getGrade()
        self.printMap()
        print("You press W...", end = "\r")
            
    def pressA(self):
        listTemp = []
        for i in range(self.length):
            listTemp = self.mainList[i]
            listTemp = self.addNum(listTemp)
            self.mainList[i] = listTemp
        if self.lastMainList != self.mainList:
            if self.isWin() == 1024:
                self.writeNum(1)
                self.grade += self.getGrade()
                self.printMap()
                print("You win...")
                input("\b"*100, "please any key to exit...")
                exit()
            else:
                self.writeNum(1)
        self.grade += self.getGrade()
        self.printMap()
        print("You press A...", end = "\r")

    def pressD(self):
        listTemp = []
        for i in range(self.length):
            listTemp = list(reversed(self.mainList[i]))
            listTemp = self.addNum(listTemp)
            self.mainList[i] = list(reversed(listTemp))
        if self.lastMainList != self.mainList:
            if self.isWin() == 1024:
                self.writeNum(1)
                self.grade += self.getGrade()
                self.printMap()
                print("You win...")
                input("\b"*100, "please any key to exit...")
                exit()
            else:
                self.writeNum(1)
        self.grade += self.getGrade()
        self.printMap()
        print("You press D...", end = "\r")

    def pressS(self):
        listTemp = []
        for c in range(self.length):
            for r in range(self.length):
                listTemp.insert(0, self.mainList[r][c])
            listTemp = self.addNum(listTemp)
            for r in range(self.length):
                self.mainList[r][c] = listTemp[self.length-r-1]
            listTemp = []
        if self.lastMainList != self.mainList:
            if self.isWin() == 1024:
                self.writeNum(1)
                self.grade += self.getGrade()
                self.printMap()
                print("You win...")
                input("\b"*100, "please any key to exit...")
                exit()
            else:
                self.writeNum(1)
        self.grade += self.getGrade()
        self.printMap()
        print("You press S...", end = "\r")
     
    # 数字变换逻辑
    def addNum(self, listNum):
        temp = 0
        count = 0
        for each in listNum:
            if each != 0 and temp == 0:
                temp = each    
            elif each != 0:
                if each == temp:
                    temp = temp*2
                    self.theNewNum.append(temp)
                    listNum[count] = temp
                    count += 1
                    temp = 0
                else:
                    listNum[count] = temp
                    count += 1
                    temp = each
            elif each == 0:
                continue
        if temp != 0:
            listNum[count] = temp
            count += 1
            temp = each
        for i in range(count, len(listNum)):
            listNum[i] = 0
        return listNum

    # 打印游戏界面
    def printMap(self):
        os.system("cls") # 清空命令行
        if self.grade > self.bestGrade:
            self.bestGrade = self.grade
            self.writeUserdata()
        print("The current grade is %d, the best grade is %d" % (self.grade, self.bestGrade))
        print("-" * int(6.1*self.length))
        for sonList in self.mainList:
            print("|", end = "")
            for elem in sonList:
                if elem != 0:
                    if elem == 2:
                        print(str(elem).ljust(5) +"|", end = "")
                    elif elem == 4 or elem == 1024:
                        print('\033[;32;41m'+str(elem).ljust(5) + '\033[0m' +"|", end = "")
                    elif elem == 8 or elem == 2048:
                        print('\033[1;33;42m'+str(elem).ljust(5) + '\033[0m' +"|", end = "")
                    elif elem == 16:
                        print('\033[1;34;43m'+str(elem).ljust(5) + '\033[0m' +"|", end = "")
                    elif elem == 32:
                        print('\033[1;36;44m'+str(elem).ljust(5) + '\033[0m' +"|", end = "")
                    elif elem == 64:
                        print('\033[1;36;45m'+str(elem).ljust(5) + '\033[0m' +"|", end = "")
                    elif elem == 128:
                        print('\033[1;37;46m'+str(elem).ljust(5) + '\033[0m' +"|", end = "")
                    else:
                        print('\033[1;30;47m'+str(elem).ljust(5) + '\033[0m' +"|", end = "")
                else:
                    print(" ".ljust(5) + "|", end = "")
            print("\n" , end = "")
            print("-" * int(6.1*self.length))

    def getGrade(self):
        '''合成多少加多少分'''
        return sum(self.theNewNum)
    
    # 读取用户数据
    def getUserdata(self):
        if not os.path.exists("C:\\UserData"):
            os.makedirs("C:\\UserData")
        if not os.path.exists("C:\\UserData\\init.dta"):
            with open("C:\\UserData\\init.dta", "w") as f:
                f.write("theBestGrade:0")
        with open("C:\\UserData\\init.dta", "r") as f:
            self.bestGrade = int(list(f)[0].split(":")[-1])

    def writeUserdata(self):
        with open("C:\\UserData\\init.dta", "w") as f:
            f.write("theBestGrade:%d" % self.bestGrade)
            

    # 出现1024即为成功
    def isWin(self):
        for i in self.mainList:
            for j in i:
                if j == 2048:
                    return 1024
        return -1

    # 判断是否失败
    def isFall(self):
        count = 0
        for eachList in self.mainList:
            for eachElem in eachList:
                if eachElem == 0:
                    return False
                if self.getCommon(eachElem, count):
                    # print(count)
                    return False
                count += 1
        return True

    # 检测一个元素周围是否有相同的元素
    def getCommon(self, elem, now):
        right = (now+1) - int(now/self.length)*self.length
        down = int((now+self.length)/self.length)
        row = int(now / self.length)
        column =  now % self.length
        if right < self.length and elem == self.mainList[row][right]:
            return True
        if down < self.length and elem == self.mainList[down][column]:
            return True
        return False

# 程序入口
def main():
    mainGame = Game_2048()
    keyboard.hook(mainGame.pressKey)
    keyboard.wait()
    
if __name__ == "__main__":
    main()

评分

参与人数 1贡献 +3 收起 理由
python爱好者. + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 07:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表