接上篇,本人之前使用一直做微信小程序,现初学SWIFT,主要通过这种小游戏练下手,不正之处请高手指定,不胜感谢。本人V信号:948943912。

// 广东麻将简化版
//
// Created by terry on 2018/8/21.
// 功能:
// 1.在控制台操作。麻将有东西南北中发白,用2颗骰子。
// 2. 创建一幅麻将并洗牌,丢骰子后根据点数发牌,并显示每个玩家的牌面。按点数确定谁是庄家,
// 3.发牌后,对每人的牌面进行排序并显示出来
// 3.可以碰,杠,不能吃牌;没有癞子。只能自摸。胡牌后显示结果(但由于是控制台,此项省略,后续再补上。)
// 4. IOS10.13+xcode8编译通过
// 5.运行效果:

开始创建玩家。。。
创建 4 个玩家,玩家创建结束。。。。
创建麻将成功。。。。
第1次洗牌。。。
第2次洗牌。。。
第3次洗牌。。。
第4次洗牌。。。
第5次洗牌。。。
第6次洗牌。。。
第7次洗牌。。。
第8次洗牌。。。
第9次洗牌。。。
第10次洗牌。。。
洗牌结束。。。
2个骰子分别是:2:4,结果是6
庄家是2…
1号玩家牌面是:
[7万]、[7万]、[8万]、[8万]、[8条]、[9条]、[2筒]、[3筒]、[5筒]、[6筒]、[8筒]、[南]、[北]、
2号玩家牌面是:
[1万]、[3万]、[5万]、[8万]、[2条]、[9条]、[1筒]、[1筒]、[1筒]、[7筒]、[东]、[东]、[北]、[中]、
3号玩家牌面是:
[1万]、[3万]、[4万]、[4万]、[7万]、[8万]、[5条]、[3筒]、[4筒]、[5筒]、[9筒]、[发]、[白]、
4号玩家牌面是:
[5万]、[9万]、[4条]、[4条]、[6条]、[7条]、[7条]、[东]、[西]、[中]、[中]、[发]、[白]、
Program ended with exit code: 0

设计思路:
// 1.设置4个玩家,位置定义:自己是1,左边是2,对面是3,右边是4
创建以下类:
MaJiang : 麻将父类;
MaJiangNumber : 数字牌类,继承自麻将父类。
MaJiangWind : 风牌类,继承自麻将父类。
MaJiangFactory : 麻将工厂类,用于生成麻将
MaJiangType : 枚举类型,设定麻将10种牌型
Tools : 工具类,专门用来进行计算
Player : 描述玩家;
Game:控制游戏流程
每个方法 和属性都有详细注释

import Foundation

/// 玩家类
class Player{
var id:Int = 0 //ID
var name:String = “” //姓名
var playerMaJiangs:[MaJiang]=[] //玩家手上的牌
var fullNmae:String { //玩家的完整信息
return String(id)+”号玩家:”+name
}

init(id:Int,name:String) {self.id=idself.name=name
}

}

/// 麻将的类型
///
/// - Wan: 万
/// - Tiao: 条
/// - Tong: 筒
/// - Dong: 东风
/// - Nan: 南风
/// - Xi: 西风
/// - Bei: 北分
/// - HongZhong: 红中
/// - FaCai: 发财
/// - BaiBan: 白板
enum MaJiangType:Int{
case Wan=1
case Tiao=2
case Tong=3
case Dong=4
case Nan=5
case Xi=6
case Bei=7
case HongZhong=8
case FaCai=9
case BaiBan=10
}

/// 根据座位图确定编号,自己是1
///
/// - zuo: 左边是2
/// - DuiMian: 对面是3
/// - You: 右边是4
enum ZuoWei:Int{
case zuo=2
case DuiMian=3
case You=4
}

/// 麻将的父类
class MaJiang {
var type:MaJiangType

/// 得到麻将的类型
///
/// - Returns: 返回麻将的类型--枚举值
func getType() -> MaJiangType {return type
}init(type:MaJiangType) {self.type=type
}func toString() -> String {return "[" + String(type.rawValue) + "]"
}

}

/// 数字麻将类=数字+类型
class MaJiangNumber: MaJiang {
var number:Int=0

func setNumber(number:Int)  {self.number=number
}/// 显示牌面
///
/// - Returns: 牌面
override func toString() -> String {var str:String = "["+String( self.number)switch self.getType() {case MaJiangType.Wan:str = str + "万"case MaJiangType.Tiao:str = str + "条"case MaJiangType.Tong:str = str + "筒"default:str="error"}return str+"]、"
}

}

/// 风牌类,此类没有数字 ,只有类型
class MaJiangWind: MaJiang {

/// 返回一张风牌
///
/// - Returns:
override func toString() -> String {var str:String = "["switch self.getType() {case MaJiangType.Dong:str=str+"东"case MaJiangType.Nan:str=str+"南"case MaJiangType.Xi:str=str+"西"case MaJiangType.Bei:str=str+"北"case MaJiangType.HongZhong:str=str+"中"case MaJiangType.FaCai:str=str+"发"case MaJiangType.BaiBan:str=str+"白"default:str="error"}str=str+"]、"return str
}

}

class MaJiangFactory{
/// 麻将工厂类的生成方法,一次只能生成一张麻将
///
/// - Parameter type: 类型
/// - Returns: 返回一张麻将,此时数字牌没有大小
func createMajiang(type:MaJiangType) -> MaJiang {
//一次只能生成一张麻将
var maJiang:MaJiang
if type.rawValue<=3{
maJiang = MaJiangNumber(type: type)
}
else{
maJiang = MaJiangWind(type:type)
}
return maJiang
}
}

/// 骰子类
class Dice{
var number:Int=0
func getNumber()->Int {
return self.number
}
//一次性丢2个骰子
func sendDice() -> Int{
var rm1:Int=0
var rm2:Int=0
var result:Int
for _ in 0..<5{
rm1=Int(arc4random_uniform(6))+1
rm2=Int(arc4random_uniform(6))+1
}
result = rm1+rm2
print(“2个骰子分别是:(rm1):(rm2),结果是(result)”)
return result
}
}

//工具类
class Tools {

/// 返回某一花色的牌,同时按从小到大排序
///
/// - Parameters:
///   - type: 花色类型
///   - maJiangs: 某位玩家的牌
/// - Returns: 根据type返回那个花色的牌。
static  func getHuaSeAndSort(type:Int,maJiangs:[MaJiang]) -> [MaJiang] {var tmp:[MaJiang]=[] //临时数组//1.先选出这种花色的牌for x in 0..<maJiangs.count{if maJiangs[x].getType().rawValue==type{tmp.append(maJiangs[x])}}//2.进行排序if tmp.isEmpty  || tmp.count==1 {return tmp //如果为空或只有1个则直接返回空数组}if tmp[0].getType().rawValue>3{return tmp   //如果为风直接返回}//冒泡法排序var tmp1:MaJiangfor x in 0..<(tmp.count-1){for y in 0..<(tmp.count-1-x){if (tmp[y] as! MaJiangNumber).number > (tmp[y+1] as!MaJiangNumber).number{tmp1=tmp[y]tmp[y]=tmp[y+1]tmp[y+1]=tmp1}}}return tmp
}/// 输出一组牌
///
/// - Parameter maJiangs: 一组牌的数组
static func printMaJiangs(maJiangs:[MaJiang])  {var resultStr=""for x in 0..<maJiangs.count{let tmpType=maJiangs[x].getType()if tmpType==MaJiangType.Wan || tmpType==MaJiangType.Tiao || tmpType==MaJiangType.Tong{resultStr = resultStr +  ( maJiangs[x] as! MaJiangNumber).toString()}else{resultStr = resultStr + (maJiangs[x] as! MaJiangWind).toString()}}print(resultStr)
}

}

/// 游戏主类
class Game {

var maJiangs:[MaJiang]=[]  //麻将数组
var players:[Player]=[]    //玩家数组var maJiangFactory:MaJiangFactory=MaJiangFactory()  //创建麻将数组/// 创建玩家
///
/// - Returns: <#return value description#>
func createPlayer() {print("开始创建玩家。。。")players.append(Player(id:1,name:"自己"))players.append(Player(id:2,name:"左"))players.append(Player(id:3,name:"对家"))players.append(Player(id:4,name:"右"))print("创建 \(players.count) 个玩家,玩家创建结束。。。。")}/// 创建一幅麻将
func createMaJiang() {var tmptype:MaJiangType = MaJiangType.Wan //默认值var tmpMajiang:MaJiangNumbervar tmpMaJiangWind:MaJiangWind//创建数字牌,x为万条筒,数字 为1-9,每张牌有4张for x in 1...3 {if x==1 { tmptype=MaJiangType.Wan}if x==2 { tmptype=MaJiangType.Tiao}if x==3 { tmptype=MaJiangType.Tong}for number in 1...9{for _ in 0..<4{tmpMajiang=maJiangFactory.createMajiang(type: tmptype) as! MaJiangNumbertmpMajiang.setNumber(number: number)maJiangs.append(tmpMajiang)}}}for x in 4...10{if x==4 { tmptype=MaJiangType.Dong}if x==5 { tmptype=MaJiangType.Nan}if x==6 { tmptype=MaJiangType.Xi}if x==7 { tmptype=MaJiangType.Bei}if x==8 { tmptype=MaJiangType.HongZhong}if x==9 { tmptype=MaJiangType.FaCai}if x==10 { tmptype=MaJiangType.BaiBan}for _ in 0..<4{tmpMaJiangWind=maJiangFactory.createMajiang(type: tmptype) as! MaJiangWindmaJiangs.append(tmpMaJiangWind)}}print("创建麻将成功。。。。")//  Tools.printMaJiangs(maJiangs: maJiangs)
}/// 10次洗牌
func changeMaJiang()  {var rm:Int=0 //随机数var tmp:MaJiangfor x in 1...10{print("第\(x)次洗牌。。。")for y in 0..<136{rm = Int( arc4random_uniform(135)) + 1tmp=maJiangs[y]maJiangs[y]=maJiangs[rm]maJiangs[rm]=tmp}}print("洗牌结束。。。")//  Tools.printMaJiangs(maJiangs: maJiangs)
}/// 丢骰子后,每人发14张牌
func sendMaJiang()  {let dice=Dice()var diceNumber = dice.sendDice() //骰子的点数//从庄家开始,先每人发4张,发3轮,再由庄家取2张//按点数%4确定谁是庄家,自己是1,左是2,对面是3,右是4if diceNumber > 4 {let x:Int = diceNumber%4if x==0  {diceNumber=4}else{diceNumber = x}}//实际方位自己1,左2,对面3,右4print("庄家是\(diceNumber)...")diceNumber -= 1 //换算成4个方位的数组下标//现在确定发牌顺序//记录发牌循序,将发牌顺序记入数组中var faPaiShunXu:[Int]=[]for _ in 0..<4{if diceNumber<4 {faPaiShunXu.append(diceNumber)}else{faPaiShunXu.append(diceNumber%4)}diceNumber += 1}//下面开始发牌var maJiangsId :Int=0//麻将牌中的id下标//先发3轮,每轮每人4张for _ in 0..<3{//每轮要给4个人发牌,根据faPaiShunXu[]的顺序发牌for y in 0..<4{//每人每次发4张for _ in 0..<4{players[ faPaiShunXu[y] ].playerMaJiangs.append(maJiangs[maJiangsId])maJiangsId += 1}}}//庄家连摸2张牌players[faPaiShunXu[0]].playerMaJiangs.append(maJiangs[maJiangsId])maJiangsId+=1players[faPaiShunXu[0]].playerMaJiangs.append(maJiangs[maJiangsId])//后面3家每人摸一张maJiangsId+=1players[faPaiShunXu[1]].playerMaJiangs.append(maJiangs[maJiangsId])maJiangsId+=1players[faPaiShunXu[2]].playerMaJiangs.append(maJiangs[maJiangsId])maJiangsId+=1players[faPaiShunXu[3]].playerMaJiangs.append(maJiangs[maJiangsId])//  for x in 0..<4{// print("玩家\(x+1)的牌面是:")//Tools.printMaJiangs(maJiangs: players[x].playerMaJiangs)//   }//下面是方法结束}
}//将每人牌面排序
func soft() {var tmpMaJiangs:[MaJiang] //临时数组,var resultMaJiangs:[MaJiang] //某个玩家最后的排序结果//4个玩家都需要排序for i in 0..<4{tmpMaJiangs=[]resultMaJiangs=[]//按万条筒。。。。。,10种花色依次排序for j in 1...10{tmpMaJiangs=Tools.getHuaSeAndSort(type: j, maJiangs: players[i].playerMaJiangs) //返回的是某个花色排����后的数组resultMaJiangs += tmpMaJiangs}players[i].playerMaJiangs=resultMaJiangsprint("\(i+1)号玩家牌面是:")Tools.printMaJiangs(maJiangs: players[i].playerMaJiangs)}//下面是结束的}
}func gemaPk()  {}

}

let game=Game()
game.createPlayer()
game.createMaJiang()
game.changeMaJiang()
game.sendMaJiang()
game.soft()
game.gemaPk()

swift--广东麻将简化版相关推荐

  1. unity3d广东麻将算法

    欢迎一起学习交流 QQ:51267195 电话:18816791911 微信同号 package com.linyun.xgame.service.impl; import java.util.Arr ...

  2. 闲来广东麻将V1.0.7提审用图

  3. swift--广东麻将v2.0(带胡牌、听牌算法和自动打牌功能)

    本程序实现了广东麻将的全部功能:自动摸牌.打牌.碰.杠.听牌.胡牌(其中庄家手动打牌,其它电脑玩家自动打牌),具体功能有: 系统通过骰子确定庄家,然后发牌,最开始从庄家手动打牌. 可以碰,杠,不能吃牌 ...

  4. 麻将胡牌算法,带癞子

    貌似去年去面试一家公司,问了麻将的算法.虽然之前做过广东麻将,但是胡牌算法在服务端,就没有在意. 现在在网上搜了一些算法试了试 = =! 麻将普通的胡牌就是刻子+顺子+将.癞子可以充当任意一张牌. 参 ...

  5. 浪人棋牌游戏德闲麻将简介

    游戏简介: <德闲麻将>是一款十分经典地道的广东麻将游戏,由深圳浪人棋牌开发出的一款产品.简约清新的游戏画面,多人在线激情竞技,实时语音聊天,多种游戏玩法可供选择,喜欢的玩家欢迎来网下载体 ...

  6. 腾讯加速推进防沉迷新规:新增21款产品 微信/QQ小游戏接入

    4月21日,据腾讯游戏公众号消息,腾讯正在加速推进防沉迷新规在旗下游戏中的落实工作,继<和平精英>等12款产品已启用新的防沉迷规则后,从3月下旬至今再新增21款产品完成新规落实. 这21款 ...

  7. 国产Linux系统深度商店应用更新记录汇总(2021-12)

    新增应用 序号 状态 应用分类 应用名称 应用类型 1 上架 网络应用 远程协助 Linux 2 上架 效率办公 即时设计 Linux 3 上架 编程开发 Eclipse for PHP Develo ...

  8. 2个月就上线的微信小游戏,是如何诞生的?| TAPD经验谈

    导读 无论是男女老少都在玩的"跳一跳",还是刷爆微信群的其他小游戏,相信这些你一定不陌生. 那么,微信小游戏与一般手游的研发有什么不一样?小游戏研发管理过程中会遇到哪些坑,又该如何 ...

  9. 微信小程序放大招,微信小游戏重磅上线

    ​微信新版本重磅首发,该版本正式上线微信小游戏,玩家可直接进行游戏体验,无需下载安装,即点即玩. 微信小程序游戏刚上线,微信小游戏平台就共上线15款小游戏,其中有6款棋牌,6款休闲,2款消除,1款数值 ...

最新文章

  1. 关于WinCE中config.bib的问题
  2. vue-lazyload vue图片懒加载插件的使用记录
  3. 上传卡正在交付_建行实体卡、虚拟卡一起秒批,不面签不面取,有卡直提8w!...
  4. 全球与中国调频广播发射机市场深度研究分析报告
  5. 随便看看AutoGluon-Tabular
  6. spark 程序配置日志级别 通过log4j
  7. 试图速成的RPG Maker MV 学习笔记(三)
  8. 利用PS和抠图软件轻松换证件照背景
  9. 激光雕刻机装上AI,混合材料T恤上都能雕出花,自动变换力度保证不割破
  10. 股票量化对冲策略的黄金时期要来了?
  11. 青少年编程究竟应该从什么语言学起?
  12. 一种通过物理分离实现WSUS伸缩性的方案
  13. Sort sort =new Sort(Sort.Direction.ASC,“id“)
  14. cjson解析器说明
  15. Cisco Packet Tracer 交换机的VLAN划分
  16. 山西大同大学计算机科学与技术在哪个校区,山西大同大学有几个校区及校区地址 哪...
  17. 记一次sftp服务器搭建
  18. matlab 绘制图标,用于Matlab绘图的自定义标记
  19. 开源Markdown电子书制作工具,平替GitBook!
  20. 被网络诈骗的162名群众,警察蜀黍喊你登记,要给你网上返款啦!

热门文章

  1. 查询李姓学生的学号、姓名、性别和所在系信息
  2. embedding = torch.nn.Embedding(10, 3)
  3. MATLAB 调用 p文件,MATLAB代码加密生成.p文件
  4. mariadb pam_mysql_FTP基于PAM和MySQL/MariaDB实现虚拟用户访问控制
  5. 编程英语:常见代码错误 error 语句学习(6)
  6. idoc java_IDOC - 学习笔记NO.1 - 博客园
  7. 代码洁癖系列(一):什么是整洁代码
  8. 学堂云计算机二级论文排版的模板,计算机二级教案模板.doc
  9. 【讲清楚,说明白!】使用iperf3监测网络吞吐量
  10. jenkins 集成 redmine 账户验证的方案