《人工智能及其应用》
大作业论文
《基于python2048能运行python的软件小游戏设计》
设计说明书
学生姓名                    
学    号                
专    业          
班    级                
信息工程学院



基于python的2048小游戏设计
1引言
1.1开发工具
PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。
1.2开发环境
    pycharm下的解释器和所有加入的第三方库。分别是解释器python3.7.6版本和pip20.2.3版本。以及与解释器相对应的pygame1.9.6版本和setuptools41.2.0版本。
2系统需求分析
现代社会对休闲小游戏的需求是:提高游戏的操作可行性,降低游戏的操作难度,降低游戏的上手难度,降低游戏的竞争需求,对使用设备的要求趋于简单化和多样化,游戏界面更加人性化,功能更加贴合使用。
3系统概要设计
3.1设计目标
本游戏主要是对 python的基础知识的运用,包括 python 的语法、类、函数、条件判断、引入模块、类的继承等基础知识和canvas 组件的创建及其属性、方法、事件等的操作的基础知识。通过对本游戏的学习,将强化对这些知识的理解和运用,为进一步学习打下良好的基础。
游戏规则
在一个单独的图形窗口中运行。游戏初始化后,在游戏窗口点击鼠标左键开始游戏。2048
游戏共有16个格子,初始时初始数字由2或者4构成。手指向一个方向滑动,所有格子会向d那个方向运动。相同数字的两个格子,相撞时数字会相加。每次滑动时,空白处会随机刷新出一个数字的格子。当界面不可运动时(当界面全部被数字填满时),游戏结束;当界面中最大数字是2048时,游戏胜利。
3.2系统功能模块
该案例只有一个程序文件:pinball_game.py,其包含的功能模块为:
4系统详细设计
4.1程序设计
4.1.1界面的实现
这里创建了棋盘,初始化棋盘的参数,可以指定棋盘的高和宽以及游戏胜利条件,默认是最经典的4x4~2048。
import curses
from random import randrange, choice
from collections import defaultdict
class GameField(object):
def __init__(self, height=4, width=4, win=2048):
self.height = height      #高
self.width = width        #宽
self.win_value = 2048      #过关分数
self.score = 0            #当前分数
self.highscore = 0        #最高分
set()              #棋盘重置4.1.2主要算法
4.1.2游戏元素的设置
用户在玩游戏的主要输入分为六种,"上,下,左,右,游戏重置,退出"用 actions 表示
(actions = ['Up', 'Left', 'Down', 'Right', 'Restart', 'Exit']
分别用 W(上),A(左),S(下),D(右),R(重置),Q(退出),进行输入来操作游戏,这里考虑到大写锁定键锁定的情况:
letter_codes = [ord(ch) for ch in 'WASDRQwasdrq']
将输入与行为进行关联:
actions_dict = dict(zip(letter_codes, actions * 2))
随机生成一个 2 或者 4
def spawn(self):
        new_element = 4 if randrange(100) > 89 else 2
        (i,j) = choice([(i,j) for i in range(self.width) for j in range(self.height) if self.field[i][j] == 0])
        self.field[i][j] = new_element
4.1.3游戏状态的判断设置
判断输赢
def is_win(self):
return any(any(i >= self.win_value for i in row) for row in self.field)
def is_gameover(self):
return not ve_is_possible(move) for move in actions)
def move_is_possible(self, direction):
def row_is_left_movable(row):
def change(i):
if row[i] == 0 and row[i + 1] != 0: # 可以移动
return True
if row[i] != 0 and row[i + 1] == row[i]: # 可以合并
  return True
return False
return any(change(i) for i in range(len(row) - 1))
check = {}
check['Left']  = lambda field: any(row_is_left_movable(row) for row in field)
check['Right'] = lambda field: check['Left'](invert(field))
check['Up']    = lambda field: check['Left'](transpose(field))
check['Down']=lambda field: check['Right'](transpose(field))
if direction in check:
return check[direction](self.field)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。