鱼C论坛

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

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

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

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

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

x
代码如下
  1. import random
  2. import os
  3. import keyboard
  4. import copy
  5. import sys

  6. class Game_2048:
  7.     randomNum = [2, 4]
  8.     probability = [0.65, 0.35]
  9.     mainList = []
  10.     lastMainList = []
  11.     theNewNum = []
  12.     length = 0
  13.     grade = 0
  14.     bestGrade = 0
  15.     # emptyPosition  []  # 用于记录空位置

  16.     # 初始化4*4方格
  17.     def __init__(self, length = 4, count = 2):
  18.         '''
  19.         length : 表示初始化网格大小
  20.         count : 表示初始化几个元素
  21.         '''
  22.         self.mainList = []
  23.         self.length = length
  24.         for i in range(length):
  25.             sonList = []
  26.             for j in range(length):
  27.                 sonList.append(0)
  28.             self.mainList.append(sonList)
  29.         self.writeNum(count)
  30.         self.getUserdata()
  31.         self.printMap()
  32.         print("The map has already init...", end = "\r")

  33.     # 判断该处是否为空
  34.     def isEmpty(self, i, j):
  35.         if self.mainList[i][j] == 0:
  36.             return True
  37.         else:
  38.             return False
  39.             
  40.     # 按给定的概率生成数字
  41.     def getCertainProbability(self):
  42.         x = random.uniform(0, 1)
  43.         cumulativeProbability = 0.0
  44.         for item, itemProbability in zip(self.randomNum, self.probability):
  45.             cumulativeProbability += itemProbability
  46.             if x < cumulativeProbability:
  47.                 break
  48.         return item

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

  57.     # 键盘事件对应操作
  58.     def pressKey(self, anyKey):
  59.         flag = 0
  60.         anyKey = str(anyKey)
  61.         self.lastMainList = copy.deepcopy(self.mainList)
  62.         if "w up" in anyKey or "W up" in anyKey:
  63.             self.pressW()
  64.             flag = 1
  65.         elif "a up" in anyKey or "A up" in anyKey:
  66.             self.pressA()
  67.             flag = 1
  68.         elif "s up" in anyKey or "S up" in anyKey:
  69.             self.pressS()
  70.             flag = 1
  71.         elif "d up" in anyKey or "D up" in anyKey:
  72.             self.pressD()
  73.             flag = 1
  74.         else:
  75.             if "a down" not in anyKey and "w down" not in anyKey and "s down" not in anyKey and "d down" not in anyKey\
  76.                and "A down" not in anyKey and "W down" not in anyKey and "S down" not in anyKey and "D down" not in anyKey:
  77.                 print('''Please press one of the "wasd" in the keyboard !''', end = "\r")
  78.             else:
  79.                  pass
  80.         if flag == 1:
  81.             if self.isFall():
  82.                 print("You fall...")
  83.                 input("\b"*100 + "please any key for exit...")
  84.                 exit()
  85.         self.theNewNum = []
  86.         
  87.     def pressW(self):
  88.         listTemp = []
  89.         for c in range(self.length):
  90.             for r in range(self.length):
  91.                 listTemp.append(self.mainList[r][c])
  92.             listTemp = self.addNum(listTemp)
  93.             for r in range(self.length):
  94.                 self.mainList[r][c] = listTemp[r]
  95.             listTemp = []
  96.         if self.lastMainList != self.mainList:
  97.             if self.isWin() == 1024:
  98.                 self.writeNum(1)
  99.                 self.grade += self.getGrade()
  100.                 self.printMap()
  101.                 print("You win...")
  102.                 input("\b"*100, "please any key to exit...")
  103.                 exit()
  104.             else:
  105.                 self.writeNum(1)
  106.         self.grade += self.getGrade()
  107.         self.printMap()
  108.         print("You press W...", end = "\r")
  109.             
  110.     def pressA(self):
  111.         listTemp = []
  112.         for i in range(self.length):
  113.             listTemp = self.mainList[i]
  114.             listTemp = self.addNum(listTemp)
  115.             self.mainList[i] = listTemp
  116.         if self.lastMainList != self.mainList:
  117.             if self.isWin() == 1024:
  118.                 self.writeNum(1)
  119.                 self.grade += self.getGrade()
  120.                 self.printMap()
  121.                 print("You win...")
  122.                 input("\b"*100, "please any key to exit...")
  123.                 exit()
  124.             else:
  125.                 self.writeNum(1)
  126.         self.grade += self.getGrade()
  127.         self.printMap()
  128.         print("You press A...", end = "\r")

  129.     def pressD(self):
  130.         listTemp = []
  131.         for i in range(self.length):
  132.             listTemp = list(reversed(self.mainList[i]))
  133.             listTemp = self.addNum(listTemp)
  134.             self.mainList[i] = list(reversed(listTemp))
  135.         if self.lastMainList != self.mainList:
  136.             if self.isWin() == 1024:
  137.                 self.writeNum(1)
  138.                 self.grade += self.getGrade()
  139.                 self.printMap()
  140.                 print("You win...")
  141.                 input("\b"*100, "please any key to exit...")
  142.                 exit()
  143.             else:
  144.                 self.writeNum(1)
  145.         self.grade += self.getGrade()
  146.         self.printMap()
  147.         print("You press D...", end = "\r")

  148.     def pressS(self):
  149.         listTemp = []
  150.         for c in range(self.length):
  151.             for r in range(self.length):
  152.                 listTemp.insert(0, self.mainList[r][c])
  153.             listTemp = self.addNum(listTemp)
  154.             for r in range(self.length):
  155.                 self.mainList[r][c] = listTemp[self.length-r-1]
  156.             listTemp = []
  157.         if self.lastMainList != self.mainList:
  158.             if self.isWin() == 1024:
  159.                 self.writeNum(1)
  160.                 self.grade += self.getGrade()
  161.                 self.printMap()
  162.                 print("You win...")
  163.                 input("\b"*100, "please any key to exit...")
  164.                 exit()
  165.             else:
  166.                 self.writeNum(1)
  167.         self.grade += self.getGrade()
  168.         self.printMap()
  169.         print("You press S...", end = "\r")
  170.      
  171.     # 数字变换逻辑
  172.     def addNum(self, listNum):
  173.         temp = 0
  174.         count = 0
  175.         for each in listNum:
  176.             if each != 0 and temp == 0:
  177.                 temp = each   
  178.             elif each != 0:
  179.                 if each == temp:
  180.                     temp = temp*2
  181.                     self.theNewNum.append(temp)
  182.                     listNum[count] = temp
  183.                     count += 1
  184.                     temp = 0
  185.                 else:
  186.                     listNum[count] = temp
  187.                     count += 1
  188.                     temp = each
  189.             elif each == 0:
  190.                 continue
  191.         if temp != 0:
  192.             listNum[count] = temp
  193.             count += 1
  194.             temp = each
  195.         for i in range(count, len(listNum)):
  196.             listNum[i] = 0
  197.         return listNum

  198.     # 打印游戏界面
  199.     def printMap(self):
  200.         os.system("cls") # 清空命令行
  201.         if self.grade > self.bestGrade:
  202.             self.bestGrade = self.grade
  203.             self.writeUserdata()
  204.         print("The current grade is %d, the best grade is %d" % (self.grade, self.bestGrade))
  205.         print("-" * int(6.1*self.length))
  206.         for sonList in self.mainList:
  207.             print("|", end = "")
  208.             for elem in sonList:
  209.                 if elem != 0:
  210.                     if elem == 2:
  211.                         print(str(elem).ljust(5) +"|", end = "")
  212.                     elif elem == 4 or elem == 1024:
  213.                         print('\033[;32;41m'+str(elem).ljust(5) + '\033[0m' +"|", end = "")
  214.                     elif elem == 8 or elem == 2048:
  215.                         print('\033[1;33;42m'+str(elem).ljust(5) + '\033[0m' +"|", end = "")
  216.                     elif elem == 16:
  217.                         print('\033[1;34;43m'+str(elem).ljust(5) + '\033[0m' +"|", end = "")
  218.                     elif elem == 32:
  219.                         print('\033[1;36;44m'+str(elem).ljust(5) + '\033[0m' +"|", end = "")
  220.                     elif elem == 64:
  221.                         print('\033[1;36;45m'+str(elem).ljust(5) + '\033[0m' +"|", end = "")
  222.                     elif elem == 128:
  223.                         print('\033[1;37;46m'+str(elem).ljust(5) + '\033[0m' +"|", end = "")
  224.                     else:
  225.                         print('\033[1;30;47m'+str(elem).ljust(5) + '\033[0m' +"|", end = "")
  226.                 else:
  227.                     print(" ".ljust(5) + "|", end = "")
  228.             print("\n" , end = "")
  229.             print("-" * int(6.1*self.length))

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

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

  247.     # 出现1024即为成功
  248.     def isWin(self):
  249.         for i in self.mainList:
  250.             for j in i:
  251.                 if j == 2048:
  252.                     return 1024
  253.         return -1

  254.     # 判断是否失败
  255.     def isFall(self):
  256.         count = 0
  257.         for eachList in self.mainList:
  258.             for eachElem in eachList:
  259.                 if eachElem == 0:
  260.                     return False
  261.                 if self.getCommon(eachElem, count):
  262.                     # print(count)
  263.                     return False
  264.                 count += 1
  265.         return True

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

  277. # 程序入口
  278. def main():
  279.     mainGame = Game_2048()
  280.     keyboard.hook(mainGame.pressKey)
  281.     keyboard.wait()
  282.    
  283. if __name__ == "__main__":
  284.     main()
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-23 16:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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