文章目录

  • 主要思想
  • GameCoreController.py
  • model.py
  • usl.py
  • main.py

主要思想

1、将2048核心算法定义到核心类中GameCoreController,作为实例成员

2、产生新数字
–随机2(90%)或者4(10%)

3、判定游戏是否结束
–如果有空位置,游戏不能结束
–如果横向可以移动,游戏不能结束
–纵向
–以上条件不满足,游戏结束

4、创建控制台游戏视图GameConsoleView
–游戏开始时,产生2个新数字,绘制界面
–游戏逻辑,获取玩家输入wsad移动地图,产生新数字,判断游戏是否结束

GameCoreController.py

"""
游戏核心逻辑控制器
"""
import randomfrom model import LocationModelclass GameCoreController:def __init__(self):self.__list_merge = Noneself.__map = [[2, 0, 0, 2],[2, 4, 4, 2],[0, 4, 2, 0],[2, 0, 2, 0],]self.__list_empty_location = []@propertydef map(self):return self.__map# 1、将列表零元素移动到末尾def __zero_to_end(self):"""零元素移动到末尾思路:从后向前依次判断,如果是零元素,则删除零元素后追加零:return:"""for i in range(len(self.__list_merge) - 1, -1, -1):if self.__list_merge[i] == 0:del self.__list_merge[i]self.__list_merge.append(0)# 2、将list_merge中的元素进行合并(相邻且相同)def __merge(self):"""合并思路:将零元素后移判断如果相邻且相同则合并:return:"""self.__zero_to_end()for i in range(len(self.__list_merge) - 1):if self.__list_merge[i] == self.__list_merge[i + 1]:self.__list_merge[i] += self.__list_merge[i + 1]del self.__list_merge[i + 1]self.__list_merge.append(0)# merge()# print(list_merge)# 3、将二维列表map中的元素向左移动def move_left(self):"""向左移动思路:将每行(一维列表)赋值给全职变量list_merge再通过merge函数操作数据:return:"""for line in self.map:self.__list_merge = lineself.__merge()# move_left()# print(map)# 4、将二维列表map中的元素向右移动def move_right(self):"""向右移动思路:将每行(反向切片)赋值给全局变量list_merge再通过merge函数操作数据再对list_merge(反向切片):return:"""for line in self.map:self.__list_merge = line[::-1]  # 因为切片,所以创建了新列表self.__merge()  # 操作的是新列表line[::-1] = self.__list_merge# 矩阵转置def __square_matrix_tranpose(self):for c in range(len(self.map) - 1):for r in range(c + 1, len(self.map)):self.map[r][c], self.map[c][r] = self.map[c][r], self.map[r][c]# 5、将二维列表map中元素向上移动def move_up(self):"""思想:方阵转置调用向左移动方阵转置:return:"""self.__square_matrix_tranpose()self.move_left()self.__square_matrix_tranpose()# 6、将二维列表map中元素向下移动def move_down(self):"""思想:方阵转置调用向右移动方阵转置:return:"""self.__square_matrix_tranpose()self.move_right()self.__square_matrix_tranpose()
#    产生新数字def generate_new_number(self):#选择位置#计算所有空位置self.__calculate_empty_location()if len(self.__list_empty_location) == 0:return#随机选择一个loc = random.choice(self.__list_empty_location)#计算数字# self.map[loc[0][loc[1]]] = self.__select_random_number()self.map[loc.r][loc.c] = self.__select_random_number()def __select_random_number(self):return 4 if random.randint(1, 10) == 1 else 2def __calculate_empty_location(self):self.__list_empty_location.clear()for r in range(len(self.map)):for c in range(len(self.map[r])):if self.map[r][c] == 0:# self.__list_empty_location.append((r, c))self.__list_empty_location.append(LocationModel(r,c))def is_game_over(self):if len(self.__list_empty_location) > 0:return Falsefor r in range(len(self.map)):for c in range(len(self.map[r])-1):if self.map[r][c] == self.map[r][c+1] and self.map[r][c] == self.map[c+1][r]:return False# for r in range(len(self.map)):#     for c in range(len(self.map[r])-1):#         if self.map[r][c] == self.map[r][c+1]:#             return False# for c in range(len(self.map)):#     for r in range(len(self.map)-1):#         if self.map[r][c] == self.map[r+1][c]#             return Falsereturn Trueif __name__ == '__main__':controller = GameCoreController()controller.generate_new_number()controller.generate_new_number()controller.move_down()print(controller.map)

model.py

class LocationModel:"""位置模型"""def __init__(self,r,c):self.r = rself.c = c

usl.py

"""
游戏界面逻辑模块
"""
import osfrom GameCoreController import GameCoreControllerclass GameConsoleView:"""控制台界面类"""def __init__(self):self.__controller = GameCoreController()def __start(self):self.__controller.generate_new_number()self.__controller.generate_new_number()self.__draw_map()def __update(self):while True:self.__move_map_for_input()self.__controller.generate_new_number()self.__draw_map()if self.__controller.is_game_over():print("游戏结束!")def __move_map_for_input(self):dir = input("请输入方向:")if dir == "w":self.__controller.move_up()elif dir == "s":self.__controller.move_down()elif dir == "a":self.__controller.move_left()elif dir == "d":self.__controller.move_right()def main(self):self.__start()self.__update()def __draw_map(self):# os.system("clear")#linux清空for line in self.__controller.map:for item in line:print(item,end="\t")print()

main.py

"""
游戏入口
"""
from usl import GameConsoleViewif __name__ == '__main__':view = GameConsoleView()view.main()

2048游戏(面向对象版)相关推荐

  1. 2048游戏java版

    最近上java看,写了个2048游戏 分3个文件,一个是Game类写算法的,一个是Win类写图形界面的,一个是游戏的主类my2048 主要算法思路:每次上下左右,分割成单独一行或者一列处理,就变成了对 ...

  2. Java猜拳小游戏(面向对象版)

    主要功能: 1)选取对战角色 2)猜拳 3)记录分数 4)显示比分以及结果 完整代码: import java.util.Scanner;/** @author: wyh* @classname: G ...

  3. 2048小游戏(网页版)

    这是JS文件 ↓ /*这是JS文件*/ (function(window, document, $) {function Game2048(opt) {var prefix = opt.prefix, ...

  4. C++的学习心得和知识总结(十八)|基于EasyX实现 2048游戏 项目(C/C++版)

    目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.网络热门游戏 2048,点击前往 2.EasyX官方链接,点击前往 3.中国色谱 颜色代码对照表(RGB多用于easyX ...

  5. Web版2048游戏制作

    写在前面 工作之余参与了<慕课网2048游戏制作>的学习视频,视频断断续续看完了,游戏也制作成功了.因为其他的事情也没来的及总结,一拖时间也就过去了,整理磁盘的时候发现了2048源码,思考 ...

  6. 一个用 C 语言写的迷你版 2048 游戏,只有 500个字符

    Jay Chan 用 C 语言写的一个迷你版 2048 游戏,只有 487 个字符.来围观吧 M[16],X=16,W,k;main(){T(system("stty cbreak" ...

  7. 一个用 C 语言写的迷你版 2048 游戏,仅仅有 500个字符

    Jay Chan 用 C 语言写的一个迷你版 2048 游戏,仅仅有 487 个字符. 来围观吧 M[16],X=16,W,k;main(){T(system("stty cbreak&qu ...

  8. 网页版《2048游戏》

    源码下载: https://gitee.com/cheng-hanyuan/example_projec/tree/main/%E6%A1%88%E4%BE%8B%E9%A1%B9%E7%9B%AE/ ...

  9. 适合编程初学者的开源项目:小游戏2048(iOS-SwiftUI版)

    目标 为编程初学者打造入门学习项目,使用各种主流编程语言来实现. 2048游戏规则 一共16个单元格,初始时由2或者4构成. 1.手指向一个方向滑动,所有格子会向那个方向运动. 2.相同数字的两个格子 ...

  10. Cocos2d-x 3.x版2048游戏开发

    Cocos2d-x 3.x版2048游戏开发 本篇博客给大家介绍如何快速开发2048这样一款休闲游戏,理解整个2048游戏的开发流程,从本篇博客你将可以学习到以下内容: 这里注明一下,本教程来自极客学 ...

最新文章

  1. mysql 虚表_mysql虚拟表
  2. oracle 将查询出的数据加1-10_PostgreSQL数据库跨库访问
  3. 1.API的调用过程(3环部分)
  4. 【iOS篇】从容面对App崩溃
  5. [视频教程] ubuntu系统下安装最新版PHP7.3.X环境
  6. TLS1.3握手流程以及参数详解
  7. Android Framework 全面分析 BootAnimation
  8. linux+镜像命令在哪里,怎么查看 linux 镜像文件
  9. Android 签名板
  10. 《Qt 5/PyQt 5实战指南》目录
  11. C++银行账户管理程序2
  12. SCI Translate 11安装教程
  13. 字体pt和WORD里的字号是怎么对应
  14. 大数据联姻“互联网+”驱动绿色变革
  15. Android—ImageView—自定义四个圆角角度
  16. 线索二叉树(Threaded BinaryTree)
  17. 仿百度联想词下拉列表,键盘上下键选值
  18. Wireshark各版本下载地址
  19. 相似图片搜索原理一(ahash—c++实现)
  20. OneNote 2007 无法启动的问题

热门文章

  1. 新能源汽车充电桩跑马圈地的时代已经到来
  2. 求1阶乘+2阶乘+3阶乘+4阶乘到+n阶乘
  3. html css text align,css – text-indent不起作用,而text-align:right
  4. auto.js开发_赚钱( $ _ $ )app脚本_ZHOU125disorder_
  5. 配置eslint+prettier报错Error: Cannot read config file: /Users/qiandingwei/Documents/projects/creams-main
  6. server.js文件配置
  7. 陈冠希翻车都十年了,还有人在疯狂偷窥你的照片
  8. Python简单使用正则表达式爬取古诗
  9. 比特大陆发布蚂蚁矿机S17 Pro,搭载第二代7nm芯片...
  10. 招募|友盟手游开放日全国巡回-盘活你的玩家