控制台游戏——五子棋
来源:互联网 发布:网络主播怎么赚钱 编辑:程序博客网 时间:2024/05/29 06:54
加深自己对面向对象的理解
1.棋子类
package com.code.t01;/** * Created with IntelliJ IDEA. * Description:棋子类 * User: ChenXinpeng * Date: 2017-08-01 * Time: 18:14 */public enum ChessMan { BLACK("●"),WHITE("○"),DRAW("+"); private String name; private ChessMan(String name){ this.name = name; } public String getName(){ return this.name; }}
2.棋盘类
package com.code.t01;/** * Created with IntelliJ IDEA. * Description:棋盘类 * User: ChenXinpeng * Date: 2017-08-01 * Time: 17:40 */public class Chessboard { private String[][] board;//棋盘数组 public static int SIZE = 22;//棋盘大小 /** * 初始化棋盘 */ public void initBoard(){ board = new String[SIZE][SIZE]; for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { board[i][j] = "+"; } } } /** * 打印棋盘 */ public void printBoard(){ for (int i = 0; i < this.SIZE; i++) { for (int j = 0; j < this.SIZE; j++) { if(board[i][j] == "+") System.out.print(board[i][j] + " "); else System.out.print(board[i][j] + " "); } System.out.println(); } } /** * 将棋子放在棋盘上 * @param posX int 坐标X * @param posY int 坐标Y * @param chessMan String 棋子类型 */ public void setBoard(int posX, int posY, String chessMan) { this.board[posX][posY] = chessMan; } /** * @return String[][] 棋盘 */ public String[][] getBoard() { return board; }}
3.游戏逻辑类
package com.code.t01;import java.util.Scanner;/** * Created with IntelliJ IDEA. * Description:游戏逻辑类 * User: ChenXinpeng * Date: 2017-08-01 * Time: 18:38 */public class GoBangGame { private final int WIN_COUNT = 5;//胜利条件 private int posX; //坐标X private int posY;//坐标Y private Chessboard chessboard;//棋盘 /** * 无参构造方法 */ public GoBangGame() { this.chessboard = new Chessboard(); } /** * 构造方法 * @param chessboard Chessboard 棋盘 */ public GoBangGame(Chessboard chessboard) { this.chessboard = chessboard; } /** * 检查输入是否合法 * @param inputStr String 坐标字符串(X,Y) * @return boolean 是否符合 */ public boolean isValid(String inputStr){ String[] str = inputStr.split(","); try{ posX = Integer.parseInt(str[0]) - 1; posY = Integer.parseInt(str[1]) - 1; }catch (Exception e){ chessboard.printBoard(); System.out.println("请以(数字,数字)的格式输入:"); return false; } if(posY < 0 || posY >= Chessboard.SIZE || posX < 0 || posX >= Chessboard.SIZE){ System.out.println("X与Y坐标只能大于等于1,与小于等于" + Chessboard.SIZE + "请重新输入:"); return false; } String[][] board = this.chessboard.getBoard(); if (!board[posX][posY].equals("+")){ chessboard.printBoard(); System.out.println("此位置已经有旗子了,请重新输入:"); return false; } return true; } /** * 电脑随机下棋 */ public void computerRandom(){ this.posX = (int)(Math.random() * Chessboard.SIZE ); this.posY = (int)(Math.random() * Chessboard.SIZE ); String[][] board = chessboard.getBoard(); while(board[posX][posY] != "+"){ this.posX = (int)(Math.random() * Chessboard.SIZE); this.posY = (int)(Math.random() * Chessboard.SIZE); } } /** * 检查棋盘是否已满 * @return boolean 是否已满 */ public boolean isFull(){ boolean flag = false; String[][] board = chessboard.getBoard(); for (int i = 0; i < Chessboard.SIZE; i++) { for (int j = 0; j < Chessboard.SIZE; j++) { if(board[i][j] == "+"){ flag = true; } } } return flag; } /** * 判断比赛结果 * @param posX int 坐标X * @param posY int 坐标Y * @param ico int 棋子类型 * @return boolean 比赛结果 */ public boolean isWin(int posX, int posY, String ico){ int startX = 0; int startY = 0; int endX = Chessboard.SIZE - 1; int endY = endX; int sameCount = 0; int temp = 0; temp = posX - WIN_COUNT + 1; startX = temp < 0 ? 0 : temp; temp = posY - WIN_COUNT + 1; startY = temp < 0 ? 0 : temp; temp = posX + WIN_COUNT - 1; endX = temp > Chessboard.SIZE - 1 ? Chessboard.SIZE - 2 : temp; temp = posY + WIN_COUNT - 1; endY = temp > Chessboard.SIZE - 1 ? Chessboard.SIZE - 2 : temp; String[][] board = this.chessboard.getBoard(); for (int i = startY; i < endY; i++) { if(board[posX][i] == ico && board[posX][i + 1] == ico){ sameCount ++; if(sameCount == this.WIN_COUNT - 1){ return true; } }else if(sameCount != WIN_COUNT - 1){ sameCount = 0; } }//end for for (int i = startX; i < endX; i++) { if(board[i][posY] == ico && board[i + 1][posY] == ico){ sameCount ++; if(sameCount == this.WIN_COUNT - 1){ return true; } }else if(sameCount != WIN_COUNT - 1){ sameCount = 0; } }//end for for (int i = startX, j = startY; i < endX && j< endY; i++, j++) { if(board[i][j] == ico && board[i + 1][j + 1] == ico){ sameCount ++; if(sameCount == this.WIN_COUNT - 1){ return true; } }else if(sameCount != WIN_COUNT - 1){ sameCount = 0; } } return false; } /** * 开始游戏 */ public void start() { chessboard.initBoard(); System.out.println("游戏开始"); Scanner scanner = new Scanner(System.in); String inputStr = null; while((inputStr = scanner.next()) != null){ boolean isOver = false;//游戏结果 if(!isValid(inputStr)){ continue; } String chessman = ChessMan.BLACK.getName(); chessboard.setBoard(posX, posY, chessman); if(isWin(posX, posY, chessman)){ isOver = true; }else{ isOver = isFull(); if(!isOver){ chessman = ChessMan.DRAW.getName(); }else { this.computerRandom(); chessman = ChessMan.WHITE.getName(); chessboard.setBoard(posX, posY, chessman); if(isWin(posX, posY, chessman)){ isOver = true; } } } chessboard.printBoard(); if(isOver){ if(isReplay(chessman)){ chessboard.initBoard(); chessboard.printBoard(); continue; } break; } } } /** * 选择是否重新开始 * @param chessman String 棋子类型 * @return boolean 是否重新开始 */ public boolean isReplay(String chessman){ chessboard.printBoard(); String message = chessman.equals(ChessMan.BLACK.getName()) ? (chessman.equals(ChessMan.DRAW.getName()) ? "平局" : "恭喜您,您赢了") : "很遗憾,您输了"; System.out.println(message + "再来下一局?(y/n)"); Scanner scanner = new Scanner(System.in); String str = scanner.next(); if(str.equals("y") || str.equals("Y")){ return true; } return false; }}
阅读全文
0 0
- 控制台游戏——五子棋
- 控制台游戏 五子棋
- 简单的控制台五子棋游戏
- 简单的控制台五子棋游戏
- 控制台五子棋游戏类记录
- 五子棋游戏——HGE
- JavaScript游戏——五子棋
- C# 控制台实现的五子棋游戏
- JAVA实现简单控制台五子棋游戏
- 控制台五子棋
- 【VC++游戏开发】棋牌类游戏——五子棋
- 简单的控制台五子棋游戏(人VS人)
- 游戏制作第一棒——黑框五子棋
- 游戏制作第三棒——有界面版五子棋
- JAVA实战3——五子棋游戏设计
- 【Android 2d游戏开发(1)】——五子棋
- 五子棋游戏
- 五子棋游戏
- 独创共识机制POI:他们想改变原创内容的商业模式,帮助中小型的优质IP解决早期变现问题
- 空类
- js十大排序代码实现(二)
- Integer.parseInt()和Integer.valueOf()的区别
- Android初级开发(四)——补充2、spinner的简单使用
- 控制台游戏——五子棋
- 一些好的文章和网站,留着以后使用
- (转)Redis详解(二)---数据类型
- 从Docker Hub上下载Image并修改Image的Repository属性
- PHP的list
- 纯js 实现弹幕效果
- httpsession跨域请求不能保存的问题
- 基于bs4的HTML内容遍历方法
- Android使用非Activity引用启动页面报错!