Java实现两人五子棋游戏(五) 判断是否有一方胜出

2025-05-29 0 40

之前的两篇文章:java实现两人五子棋游戏(二) 画出棋盘;java实现两人五子棋游戏(三) 画出棋子;java实现两人五子棋游戏(四) 落子动作的实现,可以点击查看。

Java实现两人五子棋游戏(五) 判断是否有一方胜出

前面我们已经画好了棋盘、棋子并且可以自由的落子了,那么接下来要实现的功能是判断是否有五连珠(暂时不考虑行棋方)。

我们采用遍历棋盘已经落子的位置,查看每个落子点,在它的上下,左右,左下右上,左上右下四个方向的任一方向上是否有五个连续的棋子。

第一步,对棋子类进行改造,之前我们的棋子类只有颜色信息和落子状态,现在要新增一个int型的数据,用于记录遍历过程中当前有几个珠子已知连续。

Java实现两人五子棋游戏(五) 判断是否有一方胜出

chessman.java

?

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
package xchen.test.simplegobang;

public class chessman {

private int color;//1-white,0-black

private boolean placed = false;

int matchcount = 1;

public chessman(int color,boolean placed){

this.color=color;

this.placed=placed;

}

public boolean getplaced() {

return placed;

}

public void setplaced(boolean placed) {

this.placed = placed;

}

public int getcolor() {

return color;

}

public void setcolor(int color) {

this.color = color;

}

}

第二步,先从一个方向上判断是否有五连珠,这里采用左右方向作为尝试。

添加了一个iswin函数,用遍历整个棋盘上的有效棋子的方式,来进行胜出判断。

drawchessboard.java

?

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
package xchen.test.simplegobang;

import java.awt.graphics;

import java.awt.graphics2d;

import java.awt.radialgradientpaint;

import java.awt.image;

import java.awt.toolkit;

import java.awt.event.mouseevent;

import java.awt.event.mouselistener;

import java.awt.color;

import javax.swing.jpanel;

public class drawchessboard extends jpanel implements mouselistener{

final static int black=0;

final static int white=1;

public int chesscolor = black;

int chessman_width=30;

public image boardimg;

final private int rows = 19;

chessman[][] chessstatus=new chessman[rows+1][rows+1];

public drawchessboard() {

boardimg = toolkit.getdefaulttoolkit().getimage("res/drawable/chessboard2.png");

if(boardimg == null)

system.err.println("png do not exist");

addmouselistener(this);

}

@override

protected void paintcomponent(graphics g) {

// todo auto-generated method stub

super.paintcomponent(g);

int imgwidth = boardimg.getheight(this);

int imgheight = boardimg.getwidth(this);

int fwidth = getwidth();

int fheight= getheight();

int x=(fwidth-imgwidth)/2;

int y=(fheight-imgheight)/2;

int span_x=imgwidth/rows;

int span_y=imgheight/rows;

g.drawimage(boardimg, x, y, null);

//画横线

for(int i=0;i<rows;i++)

{

g.drawline(x, y+i*span_y, fwidth-x,y+i*span_y);

}

//画竖线

for(int i=0;i<rows;i++)

{

g.drawline(x+i*span_x, y, x+i*span_x,fheight-y);

}

//画棋子

for(int i=0;i<rows+1;i++)

{

for(int j=0;j<rows+1;j++)

{

if(chessstatus[i][j]!=null&&chessstatus[i][j].getplaced()==true)

{

//system.out.println("draw chessman "+i+" "+j);

int pos_x=x+i*span_x;

int pos_y=y+j*span_y;

float radius_b=40;

float radius_w=80;

float[] fractions = new float[]{0f,1f};

java.awt.color[] colors_b = new java.awt.color[]{color.black,color.white};

color[] colors_w = new color[]{color.white,color.black};

radialgradientpaint paint;

if(chessstatus[i][j].getcolor()==1)

{

//system.out.println("draw white chess");

paint = new radialgradientpaint(pos_x-chessman_width/2f, pos_y-chessman_width/2f, radius_w*2, fractions, colors_w);

}else{

//system.out.println("draw black chess");

paint = new radialgradientpaint(pos_x-chessman_width/2f, pos_y-chessman_width/2f, radius_b*2, fractions, colors_b);

}

((graphics2d)g).setpaint(paint);

((graphics2d)g).filloval(pos_x-chessman_width/2,pos_y-chessman_width/2,chessman_width,chessman_width);

}

}

}

}

@override

//当用户按下鼠标按钮时发生

public void mousepressed(mouseevent e) {

int point_x=e.getx();

int point_y=e.gety();

int imgwidth = boardimg.getheight(this);

int imgheight = boardimg.getwidth(this);

int fwidth = getwidth();

int fheight= getheight();

int x=(fwidth-imgwidth)/2;

int y=(fheight-imgheight)/2;

int span_x=imgwidth/rows;

int span_y=imgheight/rows;

//system.out.println("press");

int status_x = 0;

int status_y = 0;

if(point_x>=x && point_x<=x+imgwidth && point_y>=y && point_y <= y+imgheight)

{

//system.out.println("合法");

for(int i=0;i<rows+1;i++)

{

if(point_x>=x-chessman_width/2+1+i*span_x)

{

if(point_x<=x+chessman_width/2-1+i*span_x)//如果是width/2会在中间点出现两个匹配值

{

//system.out.println("point x "+i+" "+point_x+" "+(x-chessman_width/2+i*span_x)+" "+(x+chessman_width/2+i*span_x));

status_x = i;

}

}

}

for(int i=0;i<rows+1;i++)

{

if(point_y>=y-chessman_width/2+1+i*span_y)

{

if(point_y <= y+chessman_width/2-1+i*span_y)

{

//system.out.println("point y "+i+" "+point_y+" "+(y-chessman_width/2+1+i*span_y)+" "+(y+chessman_width/2-1+i*span_y));

status_y = i;

}

}

}

chessman chessman = new chessman(black, true);

chessstatus[status_x][status_y]=chessman;

repaint();

if(iswin(status_x, status_y, chessstatus))

{

system.out.println("win!!!!!");

}

}

}

@override

//当用户按下并松开鼠标按钮时发生

public void mouseclicked(mouseevent e) {

// todo auto-generated method stub

}

@override

public void mousereleased(mouseevent e) {

// todo auto-generated method stub

}

@override

public void mouseentered(mouseevent e) {

// todo auto-generated method stub

}

@override

public void mouseexited(mouseevent e) {

// todo auto-generated method stub

}

boolean iswin(int point_x,int point_y,chessman[][] cm)

{

//int matchcount = 1;//记录连珠的数目

//横向查找

for(int i=0;i<rows+1;i++)

{

for(int j=0;j<rows+1;j++)

{

if(chessstatus[i][j]!=null&&chessstatus[i][j].getplaced()==true)

{

//system.out.println("iswin:"+i+" "+j);

//向右侧查找

for(int n=1;n<=4;n++)

{

if((i+n>=0)&&(i+n)<=rows)

{

if(chessstatus[i+n][j]!=null&&chessstatus[i+n][j].getplaced()==true)

{

chessstatus[i][j].matchcount++;

system.out.println("pos:"+i+" "+j+" right count++:"+(i+n)+" "+j+" count:"+chessstatus[i][j].matchcount);

if(chessstatus[i][j].matchcount==5)

{

return true;

}

}else

{

break;

}

}

}

//向左侧查找

for(int n=1;n<=4;n++)

{

if((i-n>=0)&&(i-n)<=rows)

{

if(chessstatus[i-n][j]!=null&&chessstatus[i-n][j].getplaced()==true)

{

chessstatus[i][j].matchcount++;

system.out.println("pos:"+i+" "+j+" "+"left count++:"+(i-n)+" "+j+" count:"+chessstatus[i][j].matchcount);

if(chessstatus[i][j].matchcount==5)

{

return true;

}

}else

{

if(chessstatus[i-n][j]!=null)

{

chessstatus[i][j].matchcount = 1;

}

break;

}

}

}

chessstatus[i][j].matchcount=1;//refresh count

}

}

}

return false;

}

}

第三步,主模块不变,运行测试一下我们的算法是否正确

main.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24
package xchen.test.simplegobang;

import java.awt.container;

import javax.swing.jframe;

import xchen.test.simplegobang.drawchessboard;

public class main extends jframe{

private drawchessboard drawchessboard;

public main() {

drawchessboard = new drawchessboard();

//frame标题

settitle("单机五子棋");

container containerpane =getcontentpane();

containerpane.add(drawchessboard);

}

public static void main(string[] args) {

main m = new main();

m.setsize(800, 800);

m.setvisible(true);

}

}

Java实现两人五子棋游戏(五) 判断是否有一方胜出

第四步,现在我们一个方向上的判断已经做好了,接下来补全其他三个方向上的判断代码

补足drawchessboard.java中的iswin()函数

?

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

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388
package xchen.test.simplegobang;

import java.awt.color;

import java.awt.graphics;

import java.awt.graphics2d;

import java.awt.image;

import java.awt.radialgradientpaint;

import java.awt.toolkit;

import java.awt.event.mouseevent;

import java.awt.event.mouselistener;

import javax.swing.jpanel;

public class drawchessboard extends jpanel implements mouselistener{

final static int black=0;

final static int white=1;

public int chesscolor = black;

int chessman_width=30;

public image boardimg;

final private int rows = 19;

chessman[][] chessstatus=new chessman[rows+1][rows+1];

public drawchessboard() {

boardimg = toolkit.getdefaulttoolkit().getimage("res/drawable/chessboard2.png");

if(boardimg == null)

system.err.println("png do not exist");

addmouselistener(this);

}

@override

protected void paintcomponent(graphics g) {

// todo auto-generated method stub

super.paintcomponent(g);

int imgwidth = boardimg.getheight(this);

int imgheight = boardimg.getwidth(this);

int fwidth = getwidth();

int fheight= getheight();

int x=(fwidth-imgwidth)/2;

int y=(fheight-imgheight)/2;

int span_x=imgwidth/rows;

int span_y=imgheight/rows;

g.drawimage(boardimg, x, y, null);

//画横线

for(int i=0;i<rows;i++)

{

g.drawline(x, y+i*span_y, fwidth-x,y+i*span_y);

}

//画竖线

for(int i=0;i<rows;i++)

{

g.drawline(x+i*span_x, y, x+i*span_x,fheight-y);

}

//画棋子

for(int i=0;i<rows+1;i++)

{

for(int j=0;j<rows+1;j++)

{

if(chessstatus[i][j]!=null&&chessstatus[i][j].getplaced()==true)

{

//system.out.println("draw chessman "+i+" "+j);

int pos_x=x+i*span_x;

int pos_y=y+j*span_y;

float radius_b=40;

float radius_w=80;

float[] fractions = new float[]{0f,1f};

java.awt.color[] colors_b = new java.awt.color[]{color.black,color.white};

color[] colors_w = new color[]{color.white,color.black};

radialgradientpaint paint;

if(chessstatus[i][j].getcolor()==1)

{

//system.out.println("draw white chess");

paint = new radialgradientpaint(pos_x-chessman_width/2f, pos_y-chessman_width/2f, radius_w*2, fractions, colors_w);

}else{

//system.out.println("draw black chess");

paint = new radialgradientpaint(pos_x-chessman_width/2f, pos_y-chessman_width/2f, radius_b*2, fractions, colors_b);

}

((graphics2d)g).setpaint(paint);

((graphics2d)g).filloval(pos_x-chessman_width/2,pos_y-chessman_width/2,chessman_width,chessman_width);

}

}

}

}

@override

//当用户按下鼠标按钮时发生

public void mousepressed(mouseevent e) {

int point_x=e.getx();

int point_y=e.gety();

int imgwidth = boardimg.getheight(this);

int imgheight = boardimg.getwidth(this);

int fwidth = getwidth();

int fheight= getheight();

int x=(fwidth-imgwidth)/2;

int y=(fheight-imgheight)/2;

int span_x=imgwidth/rows;

int span_y=imgheight/rows;

//system.out.println("press");

int status_x = 0;

int status_y = 0;

if(point_x>=x && point_x<=x+imgwidth && point_y>=y && point_y <= y+imgheight)

{

//system.out.println("合法");

for(int i=0;i<rows+1;i++)

{

if(point_x>=x-chessman_width/2+1+i*span_x)

{

if(point_x<=x+chessman_width/2-1+i*span_x)//如果是width/2会在中间点出现两个匹配值

{

//system.out.println("point x "+i+" "+point_x+" "+(x-chessman_width/2+i*span_x)+" "+(x+chessman_width/2+i*span_x));

status_x = i;

}

}

}

for(int i=0;i<rows+1;i++)

{

if(point_y>=y-chessman_width/2+1+i*span_y)

{

if(point_y <= y+chessman_width/2-1+i*span_y)

{

//system.out.println("point y "+i+" "+point_y+" "+(y-chessman_width/2+1+i*span_y)+" "+(y+chessman_width/2-1+i*span_y));

status_y = i;

}

}

}

chessman chessman = new chessman(black, true);

chessstatus[status_x][status_y]=chessman;

repaint();

if(iswin(status_x, status_y, chessstatus))

{

system.out.println("win!!!!!");

}

}

}

@override

//当用户按下并松开鼠标按钮时发生

public void mouseclicked(mouseevent e) {

// todo auto-generated method stub

}

@override

public void mousereleased(mouseevent e) {

// todo auto-generated method stub

}

@override

public void mouseentered(mouseevent e) {

// todo auto-generated method stub

}

@override

public void mouseexited(mouseevent e) {

// todo auto-generated method stub

}

boolean iswin(int point_x,int point_y,chessman[][] cm)

{

for(int i=0;i<rows+1;i++)

{

for(int j=0;j<rows+1;j++)

{

//横向查找

if(chessstatus[i][j]!=null&&chessstatus[i][j].getplaced()==true)

{

//向右侧查找

for(int n=1;n<=4;n++)

{

if((i+n>=0)&&(i+n)<=rows)

{

if(chessstatus[i+n][j]!=null&&chessstatus[i+n][j].getplaced()==true)

{

chessstatus[i][j].matchcount++;

system.out.println("pos:"+i+" "+j+" right count++:"+(i+n)+" "+j+" count:"+chessstatus[i][j].matchcount);

if(chessstatus[i][j].matchcount==5)

{

return true;

}

}else

{

break;

}

}

}

//向左侧查找

for(int n=1;n<=4;n++)

{

if((i-n>=0)&&(i-n)<=rows)

{

if(chessstatus[i-n][j]!=null&&chessstatus[i-n][j].getplaced()==true)

{

chessstatus[i][j].matchcount++;

system.out.println("pos:"+i+" "+j+" "+"left count++:"+(i-n)+" "+j+" count:"+chessstatus[i][j].matchcount);

if(chessstatus[i][j].matchcount==5)

{

return true;

}

}else

{

if(chessstatus[i-n][j]!=null)

{

chessstatus[i][j].matchcount = 1;

}

break;

}

}

}

chessstatus[i][j].matchcount=1;//refresh count

}

}

}

for(int i=0;i<rows+1;i++)

{

for(int j=0;j<rows+1;j++)

{

//纵向

if(chessstatus[i][j]!=null&&chessstatus[i][j].getplaced()==true)

{

//向下查找,左上角为坐标原点,y轴正方向向下

for(int n=1;n<=4;n++)

{

if((j+n>=0)&&(j+n)<=rows)

{

if(chessstatus[i][j+n]!=null&&chessstatus[i][j+n].getplaced()==true)

{

chessstatus[i][j].matchcount++;

system.out.println("pos:"+i+" "+j+" up count++:"+(i)+" "+(j+n)+" count:"+chessstatus[i][j].matchcount);

if(chessstatus[i][j].matchcount==5)

{

return true;

}

}else

{

break;

}

}

}

//向上查找

for(int n=1;n<=4;n++)

{

if((j-n>=0)&&(j-n)<=rows)

{

if(chessstatus[i][j-n]!=null&&chessstatus[i][j-n].getplaced()==true)

{

chessstatus[i][j].matchcount++;

system.out.println("pos:"+i+" "+j+" "+"left count++:"+(i)+" "+(j-n)+" count:"+chessstatus[i][j].matchcount);

if(chessstatus[i][j].matchcount==5)

{

return true;

}

}else

{

if(chessstatus[i][j-n]!=null)

{

chessstatus[i][j].matchcount = 1;

}

break;

}

}

}

chessstatus[i][j].matchcount=1;//refresh count

}

}

}

//方向:左上右下

for(int i=0;i<rows+1;i++)

{

for(int j=0;j<rows+1;j++)

{

//左上

if(chessstatus[i][j]!=null&&chessstatus[i][j].getplaced()==true)

{

//向下查找,左上角为坐标原点,y轴正方向向下

for(int n=1;n<=4;n++)

{

if((j-n>=0)&&(j-n)<=rows&&(i-n)>=0&&(i-n)<=rows)

{

if(chessstatus[i-n][j-n]!=null&&chessstatus[i-n][j-n].getplaced()==true)

{

chessstatus[i][j].matchcount++;

system.out.println("pos:"+i+" "+j+" up count++:"+(i-n)+" "+(j-n)+" count:"+chessstatus[i][j].matchcount);

if(chessstatus[i][j].matchcount==5)

{

return true;

}

}else

{

break;

}

}

}

//右下

for(int n=1;n<=4;n++)

{

if((j+n>=0)&&(j+n)<=rows&&(i+n)>=0&&(i+n)<=rows)

{

if(chessstatus[i+n][j+n]!=null&&chessstatus[i+n][j+n].getplaced()==true)

{

chessstatus[i][j].matchcount++;

system.out.println("pos:"+i+" "+j+" "+"left count++:"+(i+n)+" "+(j+n)+" count:"+chessstatus[i][j].matchcount);

if(chessstatus[i][j].matchcount==5)

{

return true;

}

}else

{

if(chessstatus[i+n][j+n]!=null)

{

chessstatus[i][j].matchcount = 1;

}

break;

}

}

}

chessstatus[i][j].matchcount=1;//refresh count

}

}

}

//方向:左下右上

for(int i=0;i<rows+1;i++)

{

for(int j=0;j<rows+1;j++)

{

//左下

if(chessstatus[i][j]!=null&&chessstatus[i][j].getplaced()==true)

{

//向下查找,左上角为坐标原点,y轴正方向向下

for(int n=1;n<=4;n++)

{

if((j+n>=0)&&(j+n)<=rows&&(i-n)>=0&&(i-n)<=rows)

{

if(chessstatus[i-n][j+n]!=null&&chessstatus[i-n][j+n].getplaced()==true)

{

chessstatus[i][j].matchcount++;

system.out.println("pos:"+i+" "+j+" up count++:"+(i-n)+" "+(j+n)+" count:"+chessstatus[i][j].matchcount);

if(chessstatus[i][j].matchcount==5)

{

return true;

}

}else

{

break;

}

}

}

//右上

for(int n=1;n<=4;n++)

{

if((j-n>=0)&&(j-n)<=rows&&(i+n)>=0&&(i+n)<=rows)

{

if(chessstatus[i+n][j-n]!=null&&chessstatus[i+n][j-n].getplaced()==true)

{

chessstatus[i][j].matchcount++;

system.out.println("pos:"+i+" "+j+" "+"left count++:"+(i+n)+" "+(j-n)+" count:"+chessstatus[i][j].matchcount);

if(chessstatus[i][j].matchcount==5)

{

return true;

}

}else

{

if(chessstatus[i+n][j-n]!=null)

{

chessstatus[i][j].matchcount = 1;

}

break;

}

}

}

chessstatus[i][j].matchcount=1;//refresh count

}

}

}

return false;

}

}

再运行一下

Java实现两人五子棋游戏(五) 判断是否有一方胜出

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:https://blog.csdn.net/v_xchen_v/article/details/53440319

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java实现两人五子棋游戏(五) 判断是否有一方胜出 https://www.kuaiidc.com/112054.html

相关文章

发表评论
暂无评论