文档章节

简单五子棋实现

o
 osc_4nmshwhm
发布于 2018/08/06 22:52
字数 906
阅读 6
收藏 0

精选30+云产品,助力企业轻松上云!>>>

一、定义一个对手Rival类

package com.itwang.gonbang;

public class Rival {
    private String color;//颜色
    private String nickName;//昵称

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

二、定义一个棋盘ChessBoard类

package com.itwang.gonbang;

/**
 * 五子棋棋牌
 */
public class ChessBoard {
    //五子棋的宽度
    public static final Integer BOARD_SIZE = 8;
    public String[][] board;


    public void initBoard(){
        //初始化棋盘数组
        board = new String[BOARD_SIZE][BOARD_SIZE];
        for (int i = 0;i < BOARD_SIZE;i++){
            for (int j = 0;j < BOARD_SIZE;j++){
                board[i][j] = "+";
            }
        }
    }
    //在控制台输出棋盘
    public void printBoard(){
        for (int i = 0;i < BOARD_SIZE;i++){
            for (int j = 0;j < BOARD_SIZE;j++){
                System.out.print(board[i][j]);
            }
            System.out.println();
        }
    }

}

三、定义一个主类Gobang

package com.itwang.gonbang;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

/**
 * 五子棋的关键算法实现
 */
public class Gobang {
    //棋盘
    private static ChessBoard chessBoard;
    private static Rival rival;//对手1
    private static Rival rival2;//对手2
    private int totalCount;//统计步数

    /**
     * 判断输赢
     * @param chessBoard
     * @param xPost
     * @param yPost
     * @param color
     * @return
     */
    public static boolean isWin(ChessBoard chessBoard,int xPost,int yPost,String color){
        //记录当前连接的点数
        int count = 1;
        int currXPost = 0;
        int currYPost = 0;
        /**
         * 判断水平方向上的胜负
         * 先从xPost左边遍历,然后从xPost右边遍历判断有连续的点
         */
        //向左
        for (currYPost = yPost - 1;currYPost >= 0;currYPost --){
            if ((chessBoard.board[xPost][currYPost]).equals(color)){
                count++;
                if (count >= 5){
                    return true;
                }
            }else {
                break;
            }
        }

        //向右
        for (currYPost = yPost + 1;currYPost < ChessBoard.BOARD_SIZE; currYPost ++){
            if ((chessBoard.board[xPost][currYPost]).equals(color)){
                count++;
                if (count >= 5){
                    return true;
                }
            }else {
                break;
            }
        }
        count = 1;

        /**
         * 判断垂直方向上的胜负
         */
        //向上遍历
        for(currXPost = xPost -1;currXPost >= 0; currXPost --){
            if ((chessBoard.board[currXPost][yPost]).equals(color)){
                count++;
                if (count >= 5){
                    return true;
                }
            }else {
                break;
            }
        }
        //向下边遍历
        for (currXPost = xPost + 1;currXPost < ChessBoard.BOARD_SIZE; currXPost ++){
            if ((chessBoard.board[currXPost][yPost]).equals(color)){
                count++;
                if (count >= 5){
                    return true;
                }
            }else {
                break;
            }
        }

        count = 1;
        /**
         * 左上到右下遍历
         */
        //左上
        for (currXPost = xPost - 1,currYPost = yPost - 1;currXPost >= 0 && currYPost >= 0;currXPost--,currYPost--){
            if ((chessBoard.board[currXPost][currYPost]).equals(color)){
                count++;
                if (count >= 5){
                    return true;
                }
            }else {
                break;
            }
        }
        //右下
        for (currXPost = xPost + 1,currYPost = yPost + 1;
             currXPost < ChessBoard.BOARD_SIZE && currYPost < ChessBoard.BOARD_SIZE;currXPost++,currYPost++){
            if ((chessBoard.board[currXPost][currYPost]).equals(color)){
                count++;
                if (count >= 5){
                    return true;
                }
            }else {
                break;
            }
        }

        /**
         * 从坐下到右上遍历
         */
        count = 1;
        //左下
        for (currXPost = xPost + 1,currYPost = yPost - 1;
             currXPost < ChessBoard.BOARD_SIZE && currYPost >= 0;currXPost++,currYPost++){
            if ((chessBoard.board[currXPost][currYPost]).equals(color)){
                count++;
                if (count >= 5){
                    return true;
                }
            }else {
                break;
            }
        }
        //右上
        for (currXPost = xPost - 1,currYPost = yPost + 1;
             currXPost >= 0 && currYPost < ChessBoard.BOARD_SIZE;currXPost--,currYPost++){
            if ((chessBoard.board[currXPost][currYPost]).equals(color)){
                count++;
                if (count >= 5){
                    return true;
                }
            }else {
                break;
            }
        }
        return false;
    }

    /**
     * 判断下棋的位置是否有子
     * @param chessBoard
     * @param xPost
     * @param yPost
     * @param color1
     * @param color2
     * @return
     */
    public static boolean isRepeat(ChessBoard chessBoard,int xPost,int yPost,String color1,String color2){
        if ((chessBoard.board[xPost][yPost]).equals(color1) || (chessBoard.board[xPost][yPost]).equals(color2)){
            return false;
        }
        return true;
    }
    public static void main(String[] args) throws IOException {
        chessBoard = new ChessBoard();
        rival2 = new Rival();
        rival = new Rival();
        chessBoard.initBoard();
        chessBoard.printBoard();
        rival.setColor("*");
        rival.setNickName("红方");
        rival2.setColor("=");
        rival2.setNickName("黑方");
        //获取键盘输入,每当在键盘上输入一行内容按回车键,刚输入的内容将被读取到
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String inputStr = null;
        /*System.out.println("红方(1)先下?还是黑方(2)先下");
        Scanner sc = new Scanner(System.in);
        int first = sc.nextInt();*/
        boolean flag = true;
        if (flag){
            System.out.println("请" + rival.getNickName() + "输入坐标: ");
        }else {
            System.out.println("请" + rival2.getNickName() + "输入坐标: ");
        }
        while((inputStr = bufferedReader.readLine()) != null){
            //将用户输入的字符以逗号作为分隔符
            String[] splitStr = inputStr.split(",");
            //将2个字符串转化为用户棋下的坐标
            int xPost = Integer.parseInt(splitStr[0]);
            int yPost = Integer.parseInt(splitStr[1]);

            //把对应的数组元素赋值为'*';这里按照横坐标为x轴,纵坐标为y轴,由于数组与坐标相反
            if (flag){
                if (isRepeat(chessBoard,yPost-1,xPost-1,rival.getColor(),rival2.getColor())){
                    chessBoard.board[yPost - 1][xPost - 1] = rival.getColor();
                    chessBoard.printBoard();
                    flag = false;
                    /**
                     * 判断输赢
                     */
                    if (isWin(chessBoard,yPost - 1,xPost - 1,rival.getColor())){
                        System.out.println(rival.getNickName() + "胜利");
                        break;
                    }
                }else {
                    System.out.println("该地方已经有棋子了,请重试");
                }

            }else{
                if (isRepeat(chessBoard,yPost-1,xPost-1,rival.getColor(),rival2.getColor())){
                    chessBoard.board[yPost - 1][xPost - 1] = rival2.getColor();
                    chessBoard.printBoard();
                    flag = true;
                    /**
                     * 判断输赢
                     */
                    if (isWin(chessBoard,yPost - 1,xPost - 1,rival2.getColor())){
                        System.out.println(rival2.getNickName() + "胜利");
                        break;
                    }
                }else {
                    System.out.println("该地方已经有棋子了,请重试");
                }

            }
            if (flag){
                System.out.println("请" + rival.getNickName() + "输入坐标: ");
            }else {
                System.out.println("请" + rival2.getNickName() + "输入坐标: ");
            }
        }
    }
}

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
谈谈前端实现五子棋游戏

闲来无事,记录下自己完成的五子棋,纯前端实现,使用到的知识点是canvas和类。运行的时候请使用谷歌浏览器哈➡️休闲游戏--五子棋😊 五子棋的下法我就不介绍了,下面讲下实现的几个点: ...

call_me_R
2018/09/07
0
0
Win32游戏制作之---五子棋的简单设计

想必每个人都玩过五子棋,其实对于我而言,五子棋是小时候玩的最多的棋类游戏,当然小时候也爱玩象棋以及国际象棋之类的,不过由于五子棋比较简单,所以就先实现一个简单的人机五子棋。最近我...

loving_forever_
2016/07/17
0
0
Win32游戏制作之---五子棋的简单设计

想必每个人都玩过五子棋,其实对于我而言,五子棋是小时候玩的最多的棋类游戏,当然小时候也爱玩象棋以及国际象棋之类的,不过由于五子棋比较简单,所以就先实现一个简单的人机五子棋。最近我...

loving_forever_
2016/07/17
0
0
前端谈谈实现五子棋

秉承着会就分享,不会就折腾的技术宗旨。自己利用周末的时间将重新梳理了一下,整理成一个小的教程,分享出来给大家指点指点。 五子棋规则 五子棋的规则我简单梳理并且改造如下哈: 对局双方...

call_me_R
2018/12/19
0
0
[源码和文档分享]基于JAVA实现的五子棋游戏

一、题目分析与设计 所使用的开发环境:Eclipse 五子棋的娱乐性强、规则简单、易学、流行性广,普通人不需长时间专门训练即可自如行棋,因此极受大众喜欢。本次课设需制作一款简单的五子棋游戏,...

HJk89kjd
2019/08/14
24
0

没有更多内容

加载失败,请刷新页面

加载更多

asp.net core之NLog

NuGet添加 NLog.Web.AspNetCore。 <PackageReference Include="Microsoft.AspNetCore.App" /> 添加配置文件 新建一个文件nlog.config(建议全部小写,linux系统中要注意), 并右键点击其属性......

一介草民Coder
29分钟前
23
0
.NET中的struct和class有什么区别? - What's the difference between struct and class in .NET?

问题: .NET中的struct和class有什么区别? 解决方案: 参考一: https://stackoom.com/question/3OT/NET中的struct和class有什么区别 参考二: https://oldbug.net/q/3OT/What-s-the-differ...

富含淀粉
今天
23
0
android:layout_weight是什么意思? - What does android:layout_weight mean?

问题: I don't understand how to use this attribute. 我不明白如何使用这个属性。 Can anyone tell me more about it? 谁能告诉我更多关于它的事情? 解决方案: 参考一: https://stacko...

javail
今天
17
0
CSS背景不透明度[重复] - CSS Background Opacity [duplicate]

问题: This question already has an answer here: 这个问题已经在这里有了答案: How do I give text or an image a transparent background using CSS? 如何使用CSS为文本或图像提供透明背...

fyin1314
今天
31
0
node http 获取gb2312网页如何转为utf8

最初,我想当然认为是下述做法,但被证明是错误的 const http = require('http'), iconv = require('iconv-lite');const url = 'http://xxx';http.get(url, function(res) { var bo......

高延
今天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部