GithubHelp home page GithubHelp logo

bridge's Introduction

bridge

基于Android的Surfaceview组件实现的桥牌游戏,有机-机、人-机、人-人(WiFi)等三种游戏模式。

1 功能介绍

1.1 游戏流程描述(预期达到的流程)

  • []开始后在界面上显示准备按钮
  • []所有玩家就绪后,游戏开始
  • []发牌动画,显示提示信息
  • [*]显示叫牌界面
  • []叫牌结束后,提示信息位置显示提示信息
  • [*]首家攻牌后,显示明手
  • []打牌结束后,显示结算画面
  • []打牌结束后,重新显示准备按钮,进入下一局

1.2 其他游戏设定

  • 竖屏显示,在上方设置区域显示额外内容(叫牌提示,赢墩等信息)
  • 用户不显示头像
  • 叫牌结束后用户不更换座位(只针对人-机游戏模式)

2 代码介绍

2.1 各部分代码的功能

  • engine:这部分是对游戏底层实现的一个抽象,将SurfaceView和SurfaceView的更新线程做了封装
    • game:这是基于SurfaceView更新机制制作的一个简单demo,可以用自己的游戏类继承并重写这个类的函数来制作自己的游戏
    • view/thread:分别对应SurfaceView和SurfaceView的更新线程SurfaceThread
    • util:包含一个用户计算触摸范围的辅助类
  • game:这部分是游戏业务的实现代码,继承自engine/game类
    • main:包含Game(游戏主类),Call(负责叫牌的类),Table(负责出牌的类)等公共类
    • direction:主要包含参与游戏的三类不同的游戏角色Player,Robot,RemotePlayer和它们的父类AbstractPlayer
    • res:用于加载绘图资源的辅助类

3 开发纪要

游戏引擎要解决的问题有

  • 如何隐藏底层实现,简化业务逻辑
  • 如何分离触摸事件和绘图事件
  • 只提供了GameView,是否要提供View接口
  • 如何实现基于热点的局域网联机
    • []通过UDP广播发送IP和端口,客户端接收到后向服务端发出连接请求
    • []广播功能在所有位置满后停止广播,在有人退出后再次广播(或者在开始游戏后,广播游戏中状态)
    • []广播功能结束后,叫牌和出牌的过程还需要和各个客户端不断的沟通信息

游戏业务要解决的问题

  • 解决对不同屏幕的适配(18:27)(已解决)
  • 解决玩家位置分配问题(已经解决)
    • 本地主机绘制需要Left,Right,Top,Bottom
    • 不同主机之间协调需要Position和东西南北
    • 应该把position和stage建立联系——position不应该和stage建立联系
    • position应该和绘制逻辑无关,应该根据另外的一个变量来决定绘制逻辑
  • 解决远程玩家链接和不同类型玩家的抽象(未解决)
    • 本地玩家由game直接建立,不使用代理玩家
    • 本地其他玩家由于可以在运行时切换,需要使用代理玩家进行代理
      • 本地建立的机器人玩家被代理的情况,可以使用ProxyPlayer.realPlayer的方式
      • 本地玩家代理远程玩家?
  • 解决Robot叫牌问题
  • 解决Robot打牌问题
    • 第二三四家打出的牌优先以第一家打出的花色(否则判违规)

TODO

  • []绘制加倍和再加倍按钮
  • []绘制准备界面
  • [x]给机器人加延时
  • []从机制上保证刷新率
  • []解决显示四张牌的Bug
  • []两侧玩家侧面显示的时候不能暴露花色分布
  • []优化性能表现
    • []启动时加载的资源过多
    • []正在绘制的时候返回,会触发一个NullPointerException的错误(initcanvas)
  • []解决联机协议问题
    • []加入别人的游戏不需要广播游戏内容
    • []修改GameBean,增加IP和协议内容标志
    • []加入游戏之后,需要先同步direction和cards,这也意味着,在Ready阶段之前不应该完成direction和cards的分配
      • []新的就绪函数包含了对direction的检测——这是没必要的,只要在ready.finish的时候同步所有的cards的directions就可以了
      • []只有加入游戏模式下,需要从远程获得direction
      • []
    • []通讯协议
      • []玩家状态
        • []玩家就绪状态
      • []玩家打牌
        • []玩家x叫x牌
      • []玩家出牌
        • []玩家x出x牌
    • []通信类
      • GameServer:维护ServerSocket
      • GameClient:维护Socket
      • GameBroadcast:向所有客户端广播
      • GameReceiver:接收广播消息
    • []通信类应该向上层隐藏实现
      • []创建游戏时,区分服务器和客户端
      • []处理游戏逻辑时,向逻辑层隐藏底层实现
      • []底层实现包括两层
        • []建立连接,保证连接有效性
        • []向连接写入消息和读取消息
    • []注意事项:业务逻辑中不应该有直接操作socket的行为
    • []信息模型:
      • []客户端发送,本机消费,服务端消费,其他客户端消费
      • []服务端发送,本机消费,其他所有客户端消费
  • []解决叫牌提示问题
    • []实现几个统计函数,写一个树状函数,对同级的几个进行有效值评估
    • []按照新瑞的做法,识别用户当前应该具有的行为,按照行为进行推荐
  • []记录叫牌结果
  • []对叫牌结果进行评分

BUG

  • []解决出第四张牌时不显示的问题
  • []解决叫三张PASS后不能正常绘制的BUG
  • []人机模式下,当对家是庄家时,不能正常的显示
  • []正在打牌的时候,使用home键,内容会丢失
  • []绘制加倍,处理加倍逻辑
  • []第二次进入游戏会强制弹出

More

  • []使用HandlerThread代替普通的Thread
  • []叫牌策略:1. 象棋树形图 2. 分布空间

Finish

  • [x]增加一个提示调整座位的提示(不做了)
  • [x]修改Call显示和触摸逻辑(什么意思)
  • [x]解决人机模式下明牌问题(人机模式以旁观者视角)
  • [*]Call需要给出庄家和定约,方便之后出牌
  • [x]机机模式下增加触摸 - 有必要吗
  • [*]解决gc问题
  • [*]修改牌面为对称形状
  • [*]将Bitmap和Paint等做成参数,减少GC——对减少GC收效甚微
  • [*]加载图片浪费了太多时间,考虑改变图片的分辨率——不是分辨率的问题,更多的时间浪费在加载图片和GC
  • [*]解决返回MainActivity后,线程没有退出的问题——停顿一段时间后会自动退出
  • [*]解决process线程内容过多导致draw更新慢的问题——不是process内容过多的问题
  • [*]1. 修改成被动更新——没必要,新睿桥牌就采用了主动更新的方式,且没有影响效率
  • [*]出牌时CPU占有率过高——有一处资源加载方式没有改进
  • [*]关闭时,将资源释放——解决,内存压下去了
  • [*]首攻是第一个出牌的人
  • [*]首攻打出之前,明手不能展示手牌
  • [*]叫了三个pass的时候,应该显示遮罩
  • [*]随机分配座位
  • [*]解决人机模式下,叫牌遮罩问题
    • [*]叫牌模式下,当轮到其他玩家时,界面覆盖灰色
  • [*]解决人机模式下,触摸事件依然有效的问题(解决了)
  • [*]人机模式下,玩家要能替明手出牌
    • [*]人机模式下,当明手是玩家时,显示庄家的牌面
  • [*]机机模式下,玩家需要替明手出牌
  • [*]打牌时计算牌面大小的逻辑也需要修改——现在还是有点bug
  • [*]三种模式下,准备阶段的表现不同
  • [*]将发牌的操作转移到准备阶段,方便之后重复进行牌局
  • [*]将玩家类进一步抽象,区分需要绘制的玩家和不需要绘制的玩家
  • [*]proxyplayer和robot持有的牌的关系?
    • [*]监听列表需要去重
    • [*]监听不到后,需要从列表删除
    • [*]晚上game.stage,使之能反映玩家加入的情况
    • [*]玩家要发出准备信号

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.