一个控制台上永远都是你赢的五子棋游戏,囧
来源:互联网 发布:淘宝bug刷话费 编辑:程序博客网 时间:2024/05/02 02:25
就是这样一个白痴游戏,我都花了那么久时间,真是有些泄气,不过啊
路漫漫其修远兮,不要急,不积跬步,无以至千里。
你还有一年的时间,这不弄出来了吗~
加油,不许泄气,加油~
发疯学习
想象一下三个月后的你,一年后的你该是一番什么模样啊?
期待!
package 五子棋小游戏;public class Chessboard {/* * 变量: * board 类型 String [][] * BOARD_SIZE 类型:int 初始值——22 * * 方法: * 构造方法: * 调用initalBoard() * intalBoard() * printBoard() * setBoard(int posX,int posY,String Chessman) * getBoard(),返回值为 String[][] 返回board二维数组 * */ //棋盘二维数组以及棋盘的大小 public static final int BOARD_SIZE = 15; private String[][] board= new String [BOARD_SIZE][BOARD_SIZE]; //初始化棋盘二维数组。 public Chessboard() { initalBoard(); } //棋盘初始化赋值。共有方法,便于重新开始游戏初始化棋盘。无返回值 public void initalBoard() { for(int i=0;i<BOARD_SIZE;i++) { for(int j= 0;j<BOARD_SIZE;j++) { board[i][j]="十"; } } } // 打印棋盘,遍历一次board二维数组。共有 无返回值方法。 public void printBoard() { for(int i=0;i<board.length;i++) { for (int j=0;j<board[i].length;j++) { System.out.print(board[i][j]); } System.out.print("\n"); } } //第三个方法:将棋子放在相对应坐标上。 public void setBoard(int posX,int posY,String Chessman) { board[posX][posY] = Chessman; } //第四个方法,getBoard() 作用在于:将封装的board数组返回到游戏中用于判断是否已有棋子 public String[][] getBoard() { return board; }}
package 五子棋小游戏;public enum Chessman { //java 5 之后才有枚举类的出现。 构造器私有,枚举类用于实例有限且固定的时候 //实例都用public static final 修饰。提供获得实例的方法。 //烦死了~ BLACK("●"),WHITE("○"); private String chessman; private Chessman(String chessman) { this.chessman= chessman; } public String getChessman() { return chessman; }}
package 五子棋小游戏;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class GobangGame {/* * 变量: * 1,WIN_COUNT * 2,posX,posY * 3,chessboard——引用Chessboard的二维数组。 * 方法: * 1,isValid(String inputStr) throws Exception 方法内解决。 * 3,isReplay(String chessman) * 4,int[] computerDo() * 5,isWon(int posX,int posY,String currentChessman) */ public static final int WIN_COUNT = 5; public static int posX=0,posY=0; static Chessboard chessboard =new Chessboard(); //第一个方法:无参构造器,以及初始化一个棋盘的构造器。后者还不知道其作用。 public GobangGame() { } public GobangGame(Chessboard chessboard) { chessboard =new Chessboard(); } //第二个方法;isValid(String inputStr) throws NumberFormatException (数字格式化异常) //经过三个步骤:a,判断是否为合法数字;b,判断是否在数组范围内的坐标;c,判断该坐标是否已有棋子。 public static boolean isValid(String inputStr) throws NumberFormatException { //a,判断是否是合法数字。这里要try catch处理,会抛出异常。 //将读到的输入以逗号隔开放在字符串数组中,并将其元素转换成数字赋值给xy坐标。 try { String[]posStrArr =inputStr.split(","); posX = Integer.parseInt(posStrArr[0])-1; posY = Integer.parseInt(posStrArr[1])-1; } catch(NumberFormatException e) { chessboard.printBoard(); System.out.println("你个傻叉~~~~(>_<)~~~~格式不正确啦,还能不能好好玩耍啦,格式是这样的啦——(数字,数字):"); return false; } //b,检验xy是否在棋盘的坐标范围内。 if(posX<0||posX>Chessboard.BOARD_SIZE|| posY<0||posY>Chessboard.BOARD_SIZE) { chessboard.printBoard(); System.out.println("你看看,棋盘就那么大,想在棋盘外面自己玩呀,-_-! 老子再给你一次输入机会:"); return false; } //c,检验这个坐标是否已经有棋子了。 //我懂了,因为不能直接访问已经封装了的棋盘,所以通过方法获得这个二维数组的访问权。 String [][]board = chessboard.getBoard(); if(board[posX][posY]!="十") { chessboard.printBoard(); System.out.println("你不长眼啊,这里都有棋子了,还往这里下-_-# "); return false; } return true; } public static int[] computerDo() { int posX =(int)((Math.random()*Chessboard.BOARD_SIZE)-1); int posY =(int)((Math.random()*Chessboard.BOARD_SIZE)-1); //考虑产生的坐标是否已经已有棋子。 String[][] board= chessboard.getBoard(); while(board[posX][posY]!="十") { posX =(int)(Math.random()*Chessboard.BOARD_SIZE)-1; posY =(int)(Math.random()*Chessboard.BOARD_SIZE)-1; } int[] computerPosXY ={posX,posY}; return computerPosXY; } //isReplay()方法。不明白它为什么会抛出异常。 public static boolean isReplay(String chessman) throws Exception { chessboard.printBoard(); String message = chessman.equals(Chessman.BLACK.getChessman()) ?"卧槽,你居然赢了我!%>_<%不服气,敢再来一盘吗?(y/n)" :"切,小样你输了吧,有本事再来一盘,看我怎么虐你(y/n)"; System.out.println(message); BufferedReader br =new BufferedReader(new InputStreamReader(System.in)); if(br.readLine().equals("y")) { return true; } return false; } //还有最后一个isWon()方法。 public static boolean isWon(int posX,int posY,String ico) { //直线XY的起点和终点。 int startX=0; int startY=0; int endX =Chessboard.BOARD_SIZE-1; int endY =Chessboard.BOARD_SIZE-1; //同一条直线上相邻棋子的累积数 int SumOfCh = 0; int temp = 0; //计算起点的最小XY坐标 temp = posX-WIN_COUNT + 1; //如果posX坐标小于4这个距离的话那么就由零坐标开始数, //否则就由距离posX坐标4的位置开始数起。 startX = temp<0?0:temp; temp = posY - WIN_COUNT +1; startY = temp<0? 0 : temp; //计算终点的最大XY坐标。 temp = posX+ WIN_COUNT-1; endX = temp>Chessboard.BOARD_SIZE-1? Chessboard.BOARD_SIZE-1:temp; temp = posY+WIN_COUNT-1; endY = temp>Chessboard.BOARD_SIZE-1? Chessboard.BOARD_SIZE-1:temp; //检验横方向 从左到右方向计算相邻棋子的数目 String [][] board = chessboard.getBoard(); for(int i = startY;i<endY;i++) { if(board[posX][i]==ico && board[posX][i+1]==ico) { SumOfCh ++ ; } else if (SumOfCh!= WIN_COUNT-1) { SumOfCh= 0; } } if(SumOfCh==WIN_COUNT-1) return true; //同理检验竖方向的棋子数 for(int i = startX;i<endX;i++) { if(board[i][posY]==ico && board[i+1][posY]==ico) { SumOfCh ++; } else if (SumOfCh!=WIN_COUNT-1) { SumOfCh = 0; } } if(SumOfCh==WIN_COUNT-1) return true; //检验对角线。要嵌套循环 for(int i= startX;i<endX;i++) { for(int j=startY;j<endY;j++) { if(board[i][j]==ico && board[i+1][j+1]==ico) { SumOfCh++; } else if(SumOfCh!= WIN_COUNT-1) { SumOfCh = 0 ; } } } if(SumOfCh==WIN_COUNT-1) return true; // 检验反对角线。嵌套循环。 for(int i =endX;i>startX;i--) { for (int j= startY;j>endY;j++) { if(board[i][j]==ico && board[i-1][j+1]==ico) { SumOfCh ++ ; } else if(SumOfCh!= WIN_COUNT-1) { SumOfCh =0; } } } if(SumOfCh==WIN_COUNT-1) return true; else return false; } public static void main(String[] args) throws NumberFormatException, IOException, Exception { BufferedReader br =new BufferedReader(new InputStreamReader(System.in)); String inputStr =null; boolean isOver; chessboard.printBoard(); while((inputStr = br.readLine())!=null) { isOver =false; if(!isValid(inputStr)) { continue; } String chessman = Chessman.BLACK.getChessman(); chessboard.setBoard(posX, posY, chessman); if(isWon(posX,posY,chessman)) { isOver = true; } else { int[]computerPosArr =computerDo(); chessman = Chessman.WHITE.getChessman(); chessboard.setBoard(computerPosArr[0],computerPosArr[1], chessman); if(isWon(computerPosArr[0],computerPosArr[1],chessman)) { isOver = true; } } if(isOver) { if(isReplay(chessman)) { chessboard.initalBoard(); chessboard.printBoard(); continue; } break; } chessboard.printBoard(); System.out.println("快点下啦,要想那么久吗?囧"); } }}
0 0
- 一个控制台上永远都是你赢的五子棋游戏,囧
- 用java实现一个在控制台下的五子棋游戏
- C++在控制台上实现2048游戏
- 实现控制台上的进度条
- 控制台上的黑白棋
- Android开发-一个简单的五子棋游戏
- 提高:写一个五子棋的游戏
- 一个简单的黑白五子棋游戏
- 编写了一个服务器端的程序实现在客户端输入字符然后在控制台上显示,直到输入"END"为止,让你写出客户端的程序;
- 读取一个指定的*.Java文件,并打印在控制台上
- 在控制台上写一个简单的数据库增删改查系统
- Windows控制台上的UTF-8支持
- 控制台上ctrl+z引起的疑惑
- 五子棋游戏的运行
- 近期也准备做一个五子棋的游戏
- 编写一个People类,在控制台上输出个人信息
- 一个api把printf打印显示到控制台上
- 读取一个文件,并且打印到控制台上
- Leetcode (10) Evaluate Reverse Polish Notation (计算逆波兰表示法多项式)
- C语言之字符串与指针
- 【C语言】球落地又反弹回原来高度一半问题。
- CI源码分析(一)—config配置文件模块
- 回调机制详解
- 一个控制台上永远都是你赢的五子棋游戏,囧
- 小点列表.Net/SQL
- 数据结构和算法经典100题-第5题
- Splash screen
- 使用SurfaceView和MedioPlayer播放视频
- ios取景器
- int、long、long long取值范围
- qt中定时器的使用
- POJ 2436 USACO silver