2048游戏(面向对象版)
文章目录
- 主要思想
- 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游戏(面向对象版)相关推荐
- 2048游戏java版
最近上java看,写了个2048游戏 分3个文件,一个是Game类写算法的,一个是Win类写图形界面的,一个是游戏的主类my2048 主要算法思路:每次上下左右,分割成单独一行或者一列处理,就变成了对 ...
- Java猜拳小游戏(面向对象版)
主要功能: 1)选取对战角色 2)猜拳 3)记录分数 4)显示比分以及结果 完整代码: import java.util.Scanner;/** @author: wyh* @classname: G ...
- 2048小游戏(网页版)
这是JS文件 ↓ /*这是JS文件*/ (function(window, document, $) {function Game2048(opt) {var prefix = opt.prefix, ...
- C++的学习心得和知识总结(十八)|基于EasyX实现 2048游戏 项目(C/C++版)
目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.网络热门游戏 2048,点击前往 2.EasyX官方链接,点击前往 3.中国色谱 颜色代码对照表(RGB多用于easyX ...
- Web版2048游戏制作
写在前面 工作之余参与了<慕课网2048游戏制作>的学习视频,视频断断续续看完了,游戏也制作成功了.因为其他的事情也没来的及总结,一拖时间也就过去了,整理磁盘的时候发现了2048源码,思考 ...
- 一个用 C 语言写的迷你版 2048 游戏,只有 500个字符
Jay Chan 用 C 语言写的一个迷你版 2048 游戏,只有 487 个字符.来围观吧 M[16],X=16,W,k;main(){T(system("stty cbreak" ...
- 一个用 C 语言写的迷你版 2048 游戏,仅仅有 500个字符
Jay Chan 用 C 语言写的一个迷你版 2048 游戏,仅仅有 487 个字符. 来围观吧 M[16],X=16,W,k;main(){T(system("stty cbreak&qu ...
- 网页版《2048游戏》
源码下载: https://gitee.com/cheng-hanyuan/example_projec/tree/main/%E6%A1%88%E4%BE%8B%E9%A1%B9%E7%9B%AE/ ...
- 适合编程初学者的开源项目:小游戏2048(iOS-SwiftUI版)
目标 为编程初学者打造入门学习项目,使用各种主流编程语言来实现. 2048游戏规则 一共16个单元格,初始时由2或者4构成. 1.手指向一个方向滑动,所有格子会向那个方向运动. 2.相同数字的两个格子 ...
- Cocos2d-x 3.x版2048游戏开发
Cocos2d-x 3.x版2048游戏开发 本篇博客给大家介绍如何快速开发2048这样一款休闲游戏,理解整个2048游戏的开发流程,从本篇博客你将可以学习到以下内容: 这里注明一下,本教程来自极客学 ...
最新文章
- mysql 虚表_mysql虚拟表
- oracle 将查询出的数据加1-10_PostgreSQL数据库跨库访问
- 1.API的调用过程(3环部分)
- 【iOS篇】从容面对App崩溃
- [视频教程] ubuntu系统下安装最新版PHP7.3.X环境
- TLS1.3握手流程以及参数详解
- Android Framework 全面分析 BootAnimation
- linux+镜像命令在哪里,怎么查看 linux 镜像文件
- Android 签名板
- 《Qt 5/PyQt 5实战指南》目录
- C++银行账户管理程序2
- SCI Translate 11安装教程
- 字体pt和WORD里的字号是怎么对应
- 大数据联姻“互联网+”驱动绿色变革
- Android—ImageView—自定义四个圆角角度
- 线索二叉树(Threaded BinaryTree)
- 仿百度联想词下拉列表,键盘上下键选值
- Wireshark各版本下载地址
- 相似图片搜索原理一(ahash—c++实现)
- OneNote 2007 无法启动的问题
热门文章
- 新能源汽车充电桩跑马圈地的时代已经到来
- 求1阶乘+2阶乘+3阶乘+4阶乘到+n阶乘
- html css text align,css – text-indent不起作用,而text-align:right
- auto.js开发_赚钱( $ _ $ )app脚本_ZHOU125disorder_
- 配置eslint+prettier报错Error: Cannot read config file: /Users/qiandingwei/Documents/projects/creams-main
- server.js文件配置
- 陈冠希翻车都十年了,还有人在疯狂偷窥你的照片
- Python简单使用正则表达式爬取古诗
- 比特大陆发布蚂蚁矿机S17 Pro,搭载第二代7nm芯片...
- 招募|友盟手游开放日全国巡回-盘活你的玩家