ホームページ ウェブフロントエンド jsチュートリアル JavaScript_javascript スキルを使用して家主ゲームを実装するためのアイデア

JavaScript_javascript スキルを使用して家主ゲームを実装するためのアイデア

May 16, 2016 pm 03:13 PM

この記事の知識は、js を使用して Landlord を記述するためのアイデアを共有します。コードがうまく書かれていない場合はご容赦ください。

ここでは、Doudizhu の主な機能について説明します: シャッフル、ディーリング、プレーヤーのトランプ、コンピューター トランプ、プレイ ルールの検証、勝ち負けの判断はありません。これらの主な機能を実装するだけです。以下は次のとおりです。順番にいくつかの関数の実装について話しましょう:

1. シャッフル:

1

2

3

4

5

6

7

8

var pukes=this.manage.pukes;//存放扑克牌的数组

//洗牌

for(var i=;i<pukes.length;i++){

var tmp=pukes[i];

var index=util.random(i,pukes.length);//随机交换两张牌

pukes[i]=pukes[index];

pukes[index]=tmp;

}

ログイン後にコピー

2. カードを配る (簡易版のデフォルトでは、プレイヤーが家主、コンピューターが農民です) 前回のシャッフル中にカードの順序が崩れています。 、カードを配るのは単純なゲロのループです。 の要素が各プレイヤー インスタンスのゲロ フィールドに追加されます。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

//发牌

var start=;

for(var i=;i<this.manage.pukes.length-;i++) {

if(start==this.manage.players.length){

start=;

}

this.manage.pukes[i].status=true;

this.manage.players[start].pukesLen++;

this.manage.players[start++].pukes.push(this.manage.pukes[i]);

}

for(var i=this.manage.pukes.length-;i<this.manage.pukes.length;i++){

//地主多三张

this.manage.pukes[i].status=true;

this.manage.players[this.manage.curPlayerIndex].pukesLen++;

this.manage.players[this.manage.curPlayerIndex].pukes.push(this.manage.pukes[i]);

}

ログイン後にコピー

3. プレイヤーはカードをプレイします プレイヤーは、コンピューターとプレイヤー自身がカードをプレイする非常に愚かな方法です。カードがあり次第):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

//出牌

if(this.options.playerIndex==this.manage.curPlayerIndex) {

var spks = [],gz=false;

if (this.manage.curMaxPlayerIndex == this.options.playerIndex) {

this.manage.deskPukes = [];

}

if (this.isCompute) {

//电脑自动出牌

var start = ;

var len=this.manage.deskPukes.length||;

while (start < this.pukes.length) {

spks = [];

for (var i = ,j=start; i <len&&j<this.pukes.length; i++) {

//随便选一张 可以出就行

if(this.pukes[j].status) {

spks.push(this.pukes[j++]);

}

}

if(spks.length) {

if (rules.valids(spks, this.manage.deskPukes)) {

gz = true;

break;

}

}

start++;

}

}

else {

//玩家选择出牌

for (var i = ; i < this.pukes.length; i++) {

if (this.pukes[i].selected && this.pukes[i].status) {

spks.push(this.pukes[i]);

}

}

if (rules.valids(spks, this.manage.deskPukes)) {

gz=true;

}

else{

alert("出牌不符合规则!");

}

}

if(gz){

this.manage.curMaxPlayerIndex=this.options.playerIndex;

this.manage.deskPukes = [];

for (var i = ; i < spks.length; i++) {

this.pukesLen--;

this.manage.deskPukes.push(spks[i]);

spks[i].status = false;

}

}

this.manage.renderPukes();

this.manage.renderCurDiscard();

if(this.isCompute||gz) {

this.manage.nextPlayer();

}

}

else{

alert("没轮到你出牌!");

}

ログイン後にコピー

4. トランプのルールの検証、 は多くの関数の組み合わせであり、true が返された場合、トランプのプレイはルールに準拠しています。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

//以下为出牌规则

var rules={

_rules:[

new danzRule(),

new duiRule(),

new sandRule(),

new zandRule(),

new shunzRule(),

new liandRule()

],

valids:function(_pukes,_curPukes){

for(var i=;i<this._rules.length;i++){

if(this._rules[i].valid(_pukes,_curPukes)){

return true;

}

}

return false;

}

};

function danzRule(){

//单张规则

}

danzRule.prototype.valid=function(_pukes,_curPukes){

//校验

var pukes=_pukes;//玩家的牌

var curPukes=_curPukes;//左面的牌

if(pukes&&pukes.length==){

//比较牌面值

if(!curPukes||!curPukes.length){

return true;

}

if(curPukes[].dians==&&pukes[].dians<){

//特殊处理

return false;

}

if(pukes[].dians==&&curPukes[].dians<){

//特殊处理

return true;

}

return pukes[].dians>curPukes[].dians;

}

return false;

}

function duiRule(_pukes,_curPukes){

//两张规则

}

duiRule.prototype.valid=function(_pukes,_curPukes){

//校验

var pukes=_pukes;//玩家的牌

var curPukes=_curPukes;//左面的牌

if(pukes&&pukes.length==){

//比较牌面值

if(pukes[].dians>&&pukes[].dians>){

return true;

}

if(pukes[].dians!=pukes[].dians){

return false;

}

if(!curPukes||!curPukes.length){

return true;

}else {

if(curPukes.length!=){

return false;

}

if (curPukes[].dians > && curPukes[].dians > ) {

return false;

}

if (curPukes[].dians != curPukes[].dians) {

return false;

}

if (curPukes[].dians == ) {

return false;

}

}

if(pukes[].dians==){

return true;

}

return pukes[].dians>curPukes[].dians;

}

return false;

}

function sandRule(){

//三带

}

sandRule.prototype.valid=function(_pukes,_curPukes){

//校验

var pukes=_pukes;//玩家的牌

var curPukes=_curPukes;//左面的牌

if(pukes&&(pukes.length>=)){

//比较牌面值

var books=getBooks(pukes);

if(!valid(books))return false;

if(!curPukes||!curPukes.length)return true;

if(curPukes.length!=books.length)return false;

var books=getBooks(curPukes);

if(!valid(books))return false;

return getSum(books)>getSum(books);

}

return false;

function getSum(books){

var sum=;

for(var i=;i<books.length;i++) {

if(books[i]==){

if(i==)return ;

sum+=i;

}

}

return sum;

}

function valid(books){

//验证三带是否有效

var counts= ,countsd= ,d=true,start=false,startIndex=-;

for(var i=;i<books.length;i++) {

if(start&&books[i]==&&startIndex!=(i-)){

return false;

}else{

startIndex=i;

}

if(books[i]==){

if(!start) {

start = true;

startIndex = i;

}

counts++;

}

if(books[i]==){

d=false;

}

}

for(var i=;i<books.length;i++) {

if(d&&books[i]==){

countsd++;

}

else if(!d&&books[i]==){

countsd++;

}

}

return counts>&&counts==countsd;

}

function getBooks(pukes){

//返回三带的每个点数的个数

var books=[];

for(var i=;i<pukes.length;i++){

if(!books[pukes[i].dians]){

books[pukes[i].dians]=;

}else{

books[pukes[i].dians]++;

}

}

return books;

}

}

function zandRule(){

//炸弹

}

zandRule.prototype.valid=function(_pukes,_curPukes){

var pukes=_pukes;//玩家的牌

var curPukes=_curPukes;//左面的牌

if(pukes&&pukes.length==) {

if(!allEqual(pukes)){

return false;

}

if(!curPukes||(curPukes.length>&&curPukes.length!=)||!allEqual(curPukes)){

return true;

}

else{

if(pukes[].dians==){

return true;

}

if(curPukes[].dians==){

return false;

}

return pukes[].dians>curPukes[].dians;

}

}

return false;

function allEqual(pukes){

if(!pukes||!pukes.length)return false;

var base=pukes[].dians;

for(var i=;i<pukes.length;i++){

if(base!=pukes[i].dians){

return false;

}

}

return true;

}

}

function liandRule(){

//连对

}

liandRule.prototype.valid=function(_pukes,_curPukes) {

var pukes=_pukes;//玩家的牌

var curPukes=_curPukes;//左面的牌

if(pukes&&pukes.length>=) {

if(!verificationCoherence(pukes)){

return false;

}

if(!curPukes||curPukes.length<=){

return true;

}

if(!verificationCoherence(curPukes)){

return false;

}

if(pukes.length!=curPukes.length){

return false;

}

return getSumDians(pukes)>getSumDians(curPukes);

}

return false;

function getSumDians(pukes){

var sum=;

for(var i=;i<pukes.length;i++) {

sum+=pukes[i].dians;

}

return sum;

}

function verificationCoherence(pukes){

//验证连贯性

if(!pukes||!pukes.length)return false;

var books=[];

for(var i=;i<pukes.length;i++){

if(pukes[i].dians==||pukes[i].dians>){

return false;

}

if(!books[pukes[i].dians]){

books[pukes[i].dians]=;

}else{

books[pukes[i].dians]++;

}

if(books[pukes[i].dians]>){

return false;

}

}

var start=false;

for(var i=;i<books.length;i++) {

if(books[i]&&books[i]!=){

return false;

}

if(books[i]==&&!start){

start=true;

}

if(start&&books[i]!=){

return false;

}

}

return true;

}

}

function shunzRule(){

//顺子

}

shunzRule.prototype.valid=function(_pukes,_curPukes){

var pukes=_pukes;//玩家的牌

var curPukes=_curPukes;//左面的牌

if(pukes&&pukes.length>=) {

if(!verificationCoherence(pukes)){

return false;

}

if(!curPukes||curPukes.length<=){

return true;

}

if(!verificationCoherence(curPukes)){

return false;

}

if(pukes.length!=curPukes.length){

return false;

}

return getSumDians(pukes)>getSumDians(curPukes);

}

return false;

function getSumDians(pukes){

var sum=;

for(var i=;i<pukes.length;i++) {

sum+=pukes[i].dians;

}

return sum;

}

function verificationCoherence(pukes){

//验证连贯性

if(!pukes||!pukes.length)return false;

var books=[];

for(var i=;i<pukes.length;i++){

if(pukes[i].dians==||pukes[i].dians>){

return false;

}

if(!books[pukes[i].dians]){

books[pukes[i].dians]=;

}else{

return false;

}

}

var start=false;

for(var i=;i<books.length;i++) {

if(books[i]==&&!start){

start=true;

}

if(start&&!books[i]){

return false;

}

}

return true;

}

}

ログイン後にコピー
上記の 4 つのステップが主要な 4 つの機能であると考えられます。その他の初期化、イベント登録などの機能は、ソース コードにすでにコメントされています。うまく記述されていない場合は、コメントしないでください。


JavaScript を使用して Landlord ゲームを実装するためのアイデアは以上です。お役に立てば幸いです。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? Apr 04, 2025 pm 02:06 PM

フロントエンドのVSCodeと同様に、パネルドラッグアンドドロップ調整機能の実装を調べます。フロントエンド開発では、VSCODEと同様のVSCODEを実装する方法...

See all articles