74340da14d79fae0a21de03d44699f80b6c624f3.jpg

2048 游戏

wiki:《2048》是一款单人在线和移动端游戏,由19岁的意大利人 Gabriele Cirulli 于2014年3月开发。游戏任务是在一个网格上滑动小方块来进行组合,直到形成一个带有有数字2048的方块。

代码

# -*- coding: utf-8 -*-
import sys
import random
import curses
from itertools import chainclass Action(object):'''游戏控制显示'''UP = 'up'LEFT = 'left'DOWN = 'down'RIGHT = 'right'RESTART = 'restart'EXIT = 'exit'letter_codes = [ord(ch) for ch in 'WASDRQwasdrq']# 字母编码,ord返回对应的十进制整数actions = [UP, LEFT, DOWN, RIGHT, RESTART, EXIT]# 用户行为actions_dict = dict(zip(letter_codes, actions * 2))# 将字母的十进制整数和用户行为一一对应组合起来,并转换成字典类型# 因为不区分大小写,所以这里用户行为需要*2def __init__(self, stdscr):self.stdscr = stdscrdef get(self):char = "N"while char not in self.actions_dict:char = self.stdscr.getch()return self.actions_dict[char]class Grid(object):def __init__(self, size):self.size = sizeself.cells = Noneself.reset()def reset(self):self.cells = [[0 for i in range(self.size)] for j in range(self.size)]# 初始化一个二维数组,值都是0,作为棋盘的每格。self.add_random_item()self.add_random_item()def add_random_item(self):'''随机在某个格子输出2或4'''empty_cells = [(i, j) for i in range(self.size) for j in range(self.size) if self.cells[i][j] == 0](i, j) = random.choice(empty_cells)self.cells[i][j] = 4 if random.randrange(100) >= 90 else 2def transpose(self):'''利用 Python 内置的 zip(*) 方法来进行矩阵转置'''self.cells = [list(row) for row in zip(*self.cells)]def invert(self):'''将矩阵的每一行倒序'''self.cells = [row[::-1] for row in self.cells]@staticmethoddef move_row_left(row):'''一行向左合并'''def tighten(row):'''把零散的非零单元挤到一块'''new_row = [i for i in row if i != 0]# 先将非零的元素全拿出来加入到新列表new_row += [0 for i in range(len(row) - len(new_row))]# 按照原列表的大小,给新列表后面补零return new_rowdef merge(row):'''对邻近元素进行合并'''pair = Falsenew_row = []for i in range(len(row)):if pair:new_row.append(2 * row[i])# 合并后,加入乘 2 后的元素在 0 元素后面GameManager.score += 2 * row[i]# 更新分数pair = Falseelse:# 判断邻近元素能否合并if i + 1 < len(row) and row[i] == row[i + 1]:pair = Truenew_row.append(0)# 可以合并时,新列表加入元素 0else:new_row.append(row[i])# 不能合并,新列表中加入该元素# 断言合并后不会改变行列大小,否则报错assert len(new_row) == len(row)return new_row# 先挤到一块再合并再挤到一块return tighten(merge(tighten(row)))def move_left(self):self.cells = [self.move_row_left(row) for row in self.cells]def move_right(self):self.invert()self.move_left()self.invert()def move_up(self):self.transpose()self.move_left()self.transpose()def move_down(self):self.transpose()self.move_right()self.transpose()@staticmethoddef row_can_move_left(row):def change(i):if row[i] == 0 and row[i + 1] != 0:return Trueif row[i] != 0 and row[i + 1] == row[i]:return Truereturn Falsereturn any(change(i) for i in range(len(row) - 1))def can_move_left(self):return any(self.row_can_move_left(row) for row in self.cells)def can_move_right(self):self.invert()can = self.can_move_left()self.invert()return candef can_move_up(self):self.transpose()can = self.can_move_left()self.transpose()return candef can_move_down(self):self.transpose()can = self.can_move_right()self.transpose()return candef can_move_restart(self):self.transpose()can = self.can_move_down()self.transpose()return candef can_move_exit(self):self.transpose()can = self.can_move_up()self.transpose()return canclass Screen(object):'''棋盘类'''help_string1 = '(W)up (S)down (A)left (D)right'help_string2 = '     (R)Restart (Q)Exit'over_string = '           GAME OVER'win_string = '          YOU WIN!'def __init__(self, screen=None, grid=None, score=0, best_score=0, over=False, win=False):self.grid = gridself.score = scoreself.over = overself.win = winself.screen = screenself.counter = 0def cast(self, string):'''绘制函数'''self.screen.addstr(string + '\n')# addstr() 方法将传入的内容展示到终端def draw_row(self, row):'''绘制竖直分割线的函数'''self.cast(''.join('|{: ^5}'.format(num) if num > 0 else '|     ' for num in row) + '|')def draw(self):self.screen.clear()# 清空屏幕self.cast('SCORE: ' + str(self.score))for row in self.grid.cells:self.cast('+-----' * self.grid.size + '+')self.draw_row(row)self.cast('+-----' * self.grid.size + '+')# 绘制分数if self.win:self.cast(self.win_string)else:if self.over:self.cast(self.over_string)else:self.cast(self.help_string1)self.cast(self.help_string2)# 绘制提示文字class GameManager(object):score = 0'''游戏状态控制类'''def __init__(self, size=4, win_num=2048):self.size = size # 棋盘宽高self.win_num = win_num # 过关分数self.reset()# 重置清屏def reset(self):self.state = 'init'# 初始化状态self.win = False# 胜利状态self.over = False# 失败状态# self.score = GameManager.score# 当前分数self.grid = Grid(self.size)# 创建棋盘self.grid.reset()# 棋盘清屏@propertydef screen(self):'''显示棋盘'''return Screen(screen=self.stdscr, score=GameManager.score, grid=self.grid, win=self.win, over=self.over)def move(self, direction):# 判断棋盘操作是否存在且可行if self.can_move(direction):getattr(self.grid, 'move_' + direction)()# getattr会调用grid类中的move_left、move_right# move_up、move_downself.grid.add_random_item()return Trueelse:return False@propertydef is_win(self):'''判断是否胜利'''self.win = max(chain(*self.grid.cells)) >= self.win_numreturn self.win@propertydef is_over(self):'''判断是否失败'''self.over = not any(self.can_move(move) for move in self.action.actions)return self.overdef can_move(self, direction):# getattr会调用grid类中的can_move__left、can_move_right# can_move_up、can_move_downreturn getattr(self.grid, 'can_move_' + direction)()def state_init(self):'''初始化状态'''self.reset()return 'game'def state_game(self):'''游戏状态'''self.screen.draw()# 显示得分和棋盘action = self.action.get()# 获取当前用户行为if action == Action.RESTART:return 'init'if action == Action.EXIT:return 'exit'if self.move(action):if self.is_win:return 'win'if self.is_over:return 'over'return 'game'def _restart_or_exit(self):'''重置游戏或退出游戏'''self.screen.draw()return 'init' if self.action.get() == Action.RESTART else 'exit'def state_win(self):'''胜利状态'''return self._restart_or_exit()def state_over(self):'''失败状态'''return self._restart_or_exit()def __call__(self, stdscr):curses.use_default_colors()self.stdscr = stdscrself.action = Action(stdscr)while self.state != 'exit':self.state = getattr(self, 'state_' + self.state)()# getattr会依次调用当前类中的state_init、state_gameif __name__ == '__main__':recursionlimit = sys.getrecursionlimit()# 因为此游戏中的递归调用可能会超过最大递归深度,# 这里判断python中的最大递归深度是否小于2000,# 没有则赋值2000if recursionlimit < 2000:sys.setrecursionlimit(2000)curses.wrapper(GameManager())

创建 2048.py,内容如上。

执行

python3 2048.py
Screen Shot 2020-07-21 at 5.13.42 PM.png


http://www.taodudu.cc/news/show-4284407.html

相关文章:

  • python2048游戏撤销上一部功能怎么实现_python 实现 2048 游戏 (一)
  • python写的2048游戏,源代码,pygame
  • python 2048游戏的设计_Python练习:100行代码实现一个简易的2048游戏
  • 基于6818粤嵌开发板的2048游戏项目
  • 基于python的2048游戏设计_用python写一个2048游戏
  • android2048项目报告,Android项目开发实战-2048游戏
  • 2048游戏代码java总结_软件工程——Java版2048游戏学习报告
  • javaweb基于内容的图片搜索(2)_java爬虫
  • 相似图片搜索的三种哈希算法
  • php怎么实现根据图片搜索图片功能
  • Asp.Net Web Api 部署------在云服务器IIS上部署Web Api程序
  • asp.net控件,服务器标记的格式不正确问题解决方法
  • asp(动态服务器页面)
  • Tesseract中文语言包 chi_sim.traineddata,免费下载 而且还是最新的
  • laravel配置语言包,实现网站中英文切换
  • plsql developer 怎么卸掉中文语言包
  • JAVA(一)依赖注入的简单理解
  • win产品密钥大搜集
  • 【艺术硕士论文】现代婚嫁服饰中传统缠花艺术的运用分析(节选)
  • 非常全的 matlab 函数
  • 命令集matlab,Matlab常用命令集2
  • chi2inv函数 matlab_matlab中ltiview怎么使用啊
  • matlab计算一组数的函数值_matlab中怎么求一组数据概率最大的数
  • cisco路由器启动过程
  • 思科路由器地址转换配置
  • 数字图像处理 低通、高通、带阻和带通滤波器
  • 低通,高通,带通滤波器,π型滤波器的工作原理
  • 基于tkinter制作的一个策略小游戏
  • 恋与制作人 服务器错误,恋与制作人登陆不了怎么办 登录失败无法登录DNS劫持全解析...
  • Activity标签设置

Python 《Python 实现 2048 游戏》实验报告相关推荐

  1. python200行代码小游戏_200 行python 代码实现 2048 游戏

    创建游戏文件 2048.py 首先导入需要的包: import curses from random import randrange, choice from collections import ...

  2. java弹弹球实验报告_Java弹球游戏实验报告—chen

    Java弹球游戏实验报告-chen 课 程 设 计 报 告 题 目 弹球小游戏 姓 名 方成 学 号 20 专 业 java 指导教师 陈华恩 2013年 12 月 30 目录 一.实验目的2 二.需 ...

  3. 拼图游戏C语言课设实验报告,C语言拼图游戏实验报告.doc

    C语言拼图游戏实验报告 课程设计实验报告 班级:光电104-2 姓名:刘云龙 学号:201058501220 一.实验题目:使用C语言编写一个小游戏(拼图游戏) 二.实验目的:C语言是每一个通信学生的 ...

  4. 2048java课程设计报告_软件工程——Java版2048游戏学习报告

    2048游戏学习报告 姓名:王浩 专业:计算机科学与技术 年级:15级4班 学号:201510411420 目录 一. 前言                                       ...

  5. java小游戏实训目的_Java弹球小游戏实验报告.doc

    Java弹球小游戏实验报告 滨江学院 Java程序设计实验报告 题 目 弹球小游戏 姓 名 许浩 学 号 20112346064 学 院 滨江学院 专 业 网络工程 年 级 2011级 指导教师 张舒 ...

  6. 2048游戏代码java总结_软件工程——Java版2048游戏学习报告

    2048游戏学习报告 姓名:王浩 专业:计算机科学与技术 年级:15级4班 学号:201510411420 目录 一. 前言                                       ...

  7. 【人工智能】作业1: Bait游戏 实验报告

    作业1: Bait游戏 实验报告 151220129 计科 吴政亿 任务一 深度优先搜索 变量简介 变量类型 变量名 变量含义 ArrayList closeList 存储已经走过的历史路径 bool ...

  8. 扫雷c语言课程设计报告,扫雷游戏实验报告.docx

    扫雷游戏实验报告剖析 课程设计软件综合课程设计班 级:姓 名:学 号:指导教师:成 绩:电子与信息工程学院信息与通信工程系目录1.任务概述------------------------------- ...

  9. 【人工智能】作业3: Aliens游戏 实验报告

    作业3: Aliens游戏 实验报告 吴政亿 151220129 wuzy.nju@gmail.com (南京大学 计算机科学与技术系, 南京 210093) 摘要:使用监督学习来模仿人玩游戏的动作, ...

  10. C语言中猜数大小的实验报告,猜数字游戏实验报告

    <猜数字游戏实验报告>由会员分享,可在线阅读,更多相关<猜数字游戏实验报告(17页珍藏版)>请在人人文库网上搜索. 1.C语言课程设计报告题 目:猜数字游戏班 级:通信工程组 ...

最新文章

  1. document.body.offsetWidth 网页可见区域高宽,offset、client、scroll使用方法详解,页面位置距离
  2. Vue body样式修改
  3. 那个花457万美元拍下巴菲特20周年慈善午宴的90后是他!
  4. node怎么把token放到redis_从零开始手写 redis(八)朴素 LRU 淘汰算法性能优化
  5. JVM----类的加载机制
  6. 查找和杀掉postgresql堵塞的会话
  7. ELK 收集多个日志文件
  8. simulink中积分环节、惯性环节、比例环节
  9. 六子棋 c语言程序设计,六子棋计算机博弈系统的研究与实现
  10. eclipse插件开发:把自定义的文件类型使用xml编辑器打开
  11. 如何修改作为背景图片的svg颜色
  12. 好嗨游戏:20款最好玩的运动游戏:足球、篮球、网球等等(上)
  13. 微信小程序:小程序开发者注册步骤
  14. 声扬科技声纹识别技术,为工商银行构建多模态反欺诈能力
  15. mac与mac传输文件_Mac上传输的最佳选择
  16. 严重: 异常将上下文初始化事件发送到类的侦听器实例.[org.springframework.web.co
  17. Eclipse 注释乱码
  18. 从哪里租vps远程桌面服务器,vps远程桌面服务器出租
  19. oracle 获取第三行,Oracle 11g 第三章知识点总结——单行函数
  20. 浅析嵌入式系统的发展趋势

热门文章

  1. mmdetectionV2.x版本 训练自己的VOC数据集
  2. 网页中title乱码问题解决方案
  3. Python 获取当前时间 年-月-日-时-分-秒
  4. findx2鸿蒙系统,OPPO Find X2 Pro 官方降价 1000 华为全新系统来了
  5. 计算机专业cad 办公 ps,厦门集美办公、商务办公、CAD、PS、平面设计培训
  6. 在ubantu下安装搜狗
  7. sql server实现简繁转换
  8. OpenCV4探索学习:OpenCV-4.1.0 Samples官方示例说明
  9. TiDB 实战优化之 SQL 常见问题与优化案例
  10. Android获取OAID