用Java完成--->五子棋

简介: 用Java完成--->五子棋

一、码前分析

  1. 首先得把棋盘打印出来,使用二维数组储存棋盘信息,和每行每列的标号,这里让棋盘有14行14列
    (这里用搜狗输入法里的符号"十"与"⒈","⒉"来表示,因为他们只占一个字符)
  2. 这里用"○"与"●"来分别表示白棋子,与黑棋子,下棋的过程就是棋子覆盖棋盘"十"的过程
  3. 判断下棋子的位置是否符合规范
  4. 要有判断输赢的方法
    二、代码演示
public class Homework {
   
    static String[][] qp = new String[15][15];//由于棋盘最后一行与最后一列要放行列编号,所以此处要15*15的二维数组
    static String line = "十";
    static String black = "●";
    static String white = "○";
    static String [] num = new String[]{
   "⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖"};
    static Scanner sr = new Scanner(System.in);
    public static void main(String[] args) {
   
        Homework.initQp();
        Homework.printQp();
        Homework.startXiaQi();
    }
    //初始化棋盘的代码
    public static void initQp(){
   
        for (int i = 0; i < 15; i++) {
   
            for (int j = 0; j < 15; j++) {
   
                if(i==14){
   //棋盘的最后一行是列的标号,所以此行赋num里的标号
                    qp[i][j] = num[j];
                }
                else{
              //注意此处的if _else的嵌套
                    if(j==14){
   
                        qp[i][j] = num[i];//棋盘最后一列是行的标号
                    }
                    else {
   
                        qp[i][j] = line;//其他行列是棋盘符号
                    }
                }
            }
        }
    }
    //打印棋盘的代码
    public static void printQp(){
   
        for (int i = 0; i < 15; i++) {
   
            for (int j = 0; j < 15; j++) {
   
                System.out.print(qp[i][j]);//打印每个棋盘符号
                if(j==14) System.out.println();//当列等于14时候要换行操作
            }
        }
    }
    //开始下棋的代码
    public static void startXiaQi(){
   
        int flag = 0;//定义一个变量,来下黑白棋之间的
        while(true){
   
            int row,list;
            if(flag==0) {
   
                System.out.println("请黑方落子");
                row = sr.nextInt()-1;
                list = sr.nextInt()-1;
                if(check(row,list)){
   
                    qp[row][list] = black;
                    printQp();
                    if(isWin(row,list,black)){
   
                        System.out.println("黑方胜利");
                        break;
                    }
                    flag = 1;
                }
                else{
   
                    continue; 
                }
            }
            else {
   
                System.out.println("请白方落子");
                row = sr.nextInt()-1;
                list = sr.nextInt()-1;
                if(check(row,list)){
   
                    qp[row][list] = white;
                    printQp();
                    if(isWin(row,list,white)){
   
                        System.out.println("白方胜利");
                        break;
                    }
                    flag = 0;
                }
                else{
   
                    continue;
                }
            }
        }
    }
    //判断棋子位置是否符合规范的代码
    public static boolean check(int x,int y){
   
        if(x<0||x>13||y<0||y>13){
   
            System.out.println("棋子已越界,请重新下");
            return false;
        }
        if(!qp[x][y].equals(line)){
   
            System.out.println("棋子重复,请重新下");
            return false;
        }
        else return true;
    }
    //判断输赢
    public static boolean isWin(int x,int y,String qz){
   
        int count = 1;
        //横着判断
        for (int i = y-1; i >= 0 ; i--) {
   //向左
            if (qp[x][i].equals(qz)) {
   
                count++;                 //判断如果是该棋子则计数器+1
                if(count >= 5){
             //每次计数器+1要判断是否成5个棋子 
                    return true;
                }
            }
            else{
   
                break;
            }
        }
        for (int i = y+1; i < 14 ; i++) {
   //向右
            if (qp[x][i].equals(qz)) {
   
                count++;
                if(count >= 5){
   
                    return true;
                }
            }
            else{
   
                count = 1;            //当一个方向判断完毕后要给计数器归零,不然会引起其他判断的失误
                break;
            }
        }
        //竖着判断
        for (int i = x-1; i >= 0; i--) {
   //向上判断
            if (qp[i][y].equals(qz)) {
   
                count++;
                if(count >= 5){
   
                    return true;
                }
            }
            else{
   
                break;
            }
        }
        for (int i = x+1; i <14 ; i++) {
   //向下判断
            if(qp[i][y].equals(qz)){
   
                count++;
                if(count >= 5){
   
                    return true;
                }
            }
            else{
   
                count = 1;
                break;
            }
        }
        //左上右下判断
        for (int i = x-1,j = y-1; i >=0&&j>=0 ; i--,j--) {
   //左上
            //此处的for循环要定义两个变量,因为寻找的那个棋子的行和列都变了
            if(qp[i][j].equals(qz)){
   
                count++;
                if(count >= 5){
   
                    return true;
                }
            }
            else{
   
                break;
            }
        }
        for (int i = x+1,j = y+1; i <14&&j<14 ; i++,j++) {
   //右下
            if(qp[i][j].equals(qz)){
   
                count++;
                if(count >= 5){
   
                    return true;
                }
            }
            else{
   
                count = 1;
                break;
            }
        }
        //右上左下判断
        for (int i = x-1,j = y+1; i >=0&&j<14 ; i--,j++) {
   //右上
            if(qp[i][j].equals(qz)){
   
                count++;
                if(count >= 5){
   
                    return true;
                }
            }
            else{
   
                break;
            }
        }
        for (int i = x+1,j = y-1; i <14&&j>=0 ; i++,j--) {
   //左下
            if(qp[i][j].equals(qz)){
   
                count++;
                if(count >= 5){
   
                    return true;
                }
            }
            else{
   
                count = 1;
                break;
            }
        }
        return false;
    }
}
                                  *如果有不足需要改进的地方欢迎指出
                                                有不理解的随时私信*
相关文章
|
消息中间件 安全 Kafka
2024年了,如何更好的搭建Kafka集群?
我们基于Kraft模式和Docker Compose同时采用最新版Kafka v3.6.1来搭建集群。
3955 2
2024年了,如何更好的搭建Kafka集群?
|
6月前
|
存储 人工智能 自然语言处理
DeepSeek R1+Ollama+Cherry Studio实现本地知识库的搭建
本文介绍了如何使用Ollama和CherryStudio搭建本地知识库,涵盖核心组件介绍、硬件与软件准备、模型部署流程及知识库构建方法。通过配置DeepSeek R1模型、嵌入模型和Cherry Studio平台,实现本地化自然语言处理与知识检索功能。
2358 0
|
11月前
|
自然语言处理
Scaling Law 撞墙?复旦团队大模型推理新思路:Two-Player架构打破自我反思瓶颈
复旦大学研究团队提出Two-Player架构,通过分离推理和批评模型的角色,突破大语言模型(LLM)在复杂推理任务中的自我反思瓶颈。该架构利用批评模型提供逐步反馈,监督推理模型,提升其性能。研究开发了AutoMathCritique框架,收集76,321个响应数据,实验表明批评模型显著提高演员模型的探索效率和解决方案多样性。论文地址:http://arxiv.org/abs/2411.16579
212 2
|
机器学习/深度学习 存储 人工智能
MNN:阿里开源的轻量级深度学习推理框架,支持在移动端等多种终端上运行,兼容主流的模型格式
MNN 是阿里巴巴开源的轻量级深度学习推理框架,支持多种设备和主流模型格式,具备高性能和易用性,适用于移动端、服务器和嵌入式设备。
2909 18
MNN:阿里开源的轻量级深度学习推理框架,支持在移动端等多种终端上运行,兼容主流的模型格式
|
缓存 算法 Shell
魔搭牵手vLLM,提供更快更高效LLM推理服务
今年六月,来自加州大学伯克利分校、斯坦福大学、加州大学圣迭戈分校的研究人员基于操作系统中经典的虚拟内存和分页技术,提出了一个新的注意力算法PagedAttention,并打造了一个LLM服务系统vLLM。
|
Python
Python的编辑工具-Jupyter notebook实战案例
这篇博客介绍了Jupyter Notebook的安装和使用方法,包括如何在本地安装Jupyter、启动和使用Jupyter Notebook进行编程、文档编写和数据分析,以及如何执行和管理代码单元(Cell)的快捷键操作。
849 4
Python的编辑工具-Jupyter notebook实战案例
|
存储 消息中间件 缓存
高速网络的未来:解析零拷贝Zero-Copy架构
高速网络的未来:解析零拷贝Zero-Copy架构
|
Android开发 Windows
Mac 好用的 Android 模拟器整理(玩游戏、装应用、支持咸鱼、拼多多...)
Mac 好用的 Android 模拟器整理(玩游戏、装应用、支持咸鱼、拼多多...)
24912 47