java实现四子棋游戏

 更新时间:2021年03月15日 06:57:30   作者:孤风寒雪  
这篇文章主要为大家详细介绍了java实现四子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

非常简单的四子棋游戏

本人是刚学java的小白,最近在书上看到了有关四子棋游戏的编程题,就试着来写一写,代码也比较简单。

思路

写四子棋的难点是如何判断四个棋子连在一起。

下面给出图解:

观察上图,先从落棋点开始,设置一个计数器 i ,并初始化它为1,像左端移动,遇到的是跟落棋点相同颜色的棋子,则使 i 加1,继续向左端移动,没有棋子,则回到落棋点从而向右移动,向右端移动遇到第三个相同的棋,这时i = 3,然后继续向右移动遇到第四个棋子使 i = 4,到最后只要i = 4,即游戏胜利。再看下图。

按照上面的流程,先向左边移动,遇到没有棋子的点停止后 i = 2,再向右移动,遇到不同颜色的棋子后停止,i = 3,这样落棋点两边方向判断结束后,i < 4即游戏继续。

总结

判断游戏是否胜利,就是从棋子落点两个相反的方向,遇到相同的棋子使计数器数值加1,遇到无棋或颜色不同就结束向另一个方向,直到遇到无棋子和不同颜色的棋子,然后判断计数器是否为4。在四子棋中有7个方向需要判断。

import java.util.Scanner;
/**
 * 
 * 
 * 玩法:1.跟五子棋玩法差不多,只是少一颗子,下棋只能选择每列下在每列棋子上面一格。
 * 2.棋子分为黄、红,执黄先行。
 * 3.胜利条件跟五子棋一样,就是少一颗子。
 */
class Desk {
 //棋桌类
 private char[][] date = new char[6][7];
 private Scanner scanner = new Scanner(System.in) ;
 private int hand = 1 ;
 
 //画出整个棋盘以及上面的棋子
 public void draw() {
 for (int i = 0; i < this.date.length; i++) {
 System.out.print("|");
 for (int j = 0; j < this.date[i].length; j++) {
 System.out.print(this.date[i][j] + "|");
 }
 System.out.println();
 }
 if (this.hand % 2 == 1) {
 System.out.print("现在是第" + this.hand + "手,轮到黄棋: ");
 playchess('Y');
 }
 else {
 System.out.print("现在是第" + this.hand + "手,轮到红棋: ") ;
 playchess('R');
 }
 }
 
 //控制落子
 public void playchess(char color) {
 this.hand ++;
 int place = scanner.nextInt() ;
 int i ;
 for (i = 5; i >= 0; i--) { //
 if (date[i][place] == '\u0000') {
 date[i][place] = color;
 break;
 }
 }
 if (i < 0)System.exit(1);
 else win(i, place, color) ;
 }
 
 //判断游戏是否有人胜利或平局(依据是根据落子位置的两个方向是否连成四子)
 public void win(int x, int place,char color) {
 int number = 1;
 //第一个方向(右斜线方向)
 for (int i = x - 1, j = place - 1; (i >= 0) && (j >= 0); i--, j--) {
 if (date[i][j] == color) {
 number++;
 }
 else break;
 }
 for (int i = x + 1, j = place + 1; (i <= 5) && (j <= 6); i++, j++) {
 if (date[i][j] == color) {
 number ++ ;
 }
 else break;
 }
 if (number == 4)end(color, "win");
 //第二个方向(左斜线方向)
 number = 1;
 for (int i = x - 1, j = place + 1; (i >= 0) && (j <= 6); i--, j++) {
 if (date[i][j] == color) {
 number++;
 }
 else break;
 }
 for (int i = x + 1, j = place - 1; (i <= 5) && (j >= 0); i++, j--) {
 if (date[i][j] == color) {
 number ++ ;
 }
 else break;
 }
 if (number == 4)end(color, "win");
 //第三个方向(水平)
 number = 1;
 for (int i = x, j = place - 1; j >= 0; j--) {
 if (date[i][j] == color) {
 number ++ ;
 }
 else break ;
 }
 for (int i = x, j = place + 1; j <= 6; j++) {
 if (date[i][j] == color) {
 number ++ ;
 }
 else break;
 }
 if (number == 4)end(color, "win");
 //第四个方向(竖直)
 number = 1;
 for (int i = x + 1, j = place; i <= 5; i++) {
 if (date[i][j] == color) {
 number ++ ;
 }
 else break;
 }
 if (number == 4)end(color, "win") ;
 //判断平局
 for (int i = 0; i < date.length; i++) {
 for (int j = 0; j < date[i].length; j++) {
 if (date[i][j] != 'Y' || date[i][j] != 'R')draw() ;
 }
 }
 end(color, "s") ;
 }
 
 //判断游戏是否结束
 public void end(char color, String str) {
 if (str.equals("win")) {
 System.out.print(color + "棋获得胜利!!!");
 System.exit(0);
 }
 else {
 System.out.print("两棋子平局.") ;
 System.exit(0);
 }
 }
}

public class ChessOffour {
 public static void main(String[] args) {
 Desk desk = new Desk() ;
 desk.draw() ;
 }
}

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

相关文章

  • Map与JavaBean相互转换的工具类 

    Map与JavaBean相互转换的工具类 

    这篇文章主要介绍了Map与JavaBean相互转换的工具类,在做导入的时候,遇到了需要将map对象转化 成javabean的问题,也就是说,不清楚javabean的内部字段排列,只知道map的 key代表javabean的字段名,value代表值,需要的朋友可以参考下
    2022-02-02
  • java中的 HashMap 的加载因子是0.75原理探讨

    java中的 HashMap 的加载因子是0.75原理探讨

    在Java中,HashMap是一种常用的数据结构,用于存储键值对,它的设计目标是提供高效的插入、查找和删除操作,在HashMap的实现中,加载因子(Load Factor)是一个重要的概念,本文将探讨为什么Java中的HashMap的加载因子被设置为0.75
    2023-10-10
  • 动力节点_王勇_DRP项目视频教程完整版292集

    动力节点_王勇_DRP项目视频教程完整版292集

    该视频由国内知名讲师王勇老师主讲,适合掌握Java基础内容的同学学习,本视频共计292集,学习Java Web项目,DRP项目视频是首选,累计下载量已经达到上千万,很多同学通过自学该视频找到了软件开发工作
    2017-04-04
  • 解读Eureka的TimedSupervisorTask类(自动调节间隔的周期性任务)

    解读Eureka的TimedSupervisorTask类(自动调节间隔的周期性任务)

    在Eureka客户端中,尽管ScheduledExecutorService的schedule方法创建的是一次性任务,但通过在任务执行完毕后再次调用schedule方法实现了周期性执行,这种设计既考虑到了任务超时导致的间隔时间调整,又通过CAS实现了多线程同步,展现了简洁而巧妙的设计思想
    2024-11-11
  • Mybatis Plus分页查询返回total为0问题解决

    Mybatis Plus分页查询返回total为0问题解决

    在使用MybatisPlus进行分页查询时,可能会遇到返回的总条数(total)为0的问题,这通常是由于未配置MybatisPlus的分页插件拦截器导致的,本文就来介绍一下解决方法,感兴趣的可以了解一下
    2024-10-10
  • 初识Spring Boot框架和快速入门

    初识Spring Boot框架和快速入门

    这篇文章主要介绍了初识Spring Boot框架学习,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • springboot操作静态资源文件的方法

    springboot操作静态资源文件的方法

    这篇文章主要介绍了springboot操作静态资源文件的方法,本文给大家提到了两种方法,小编在这里比较推荐第一种方法,具体内容详情大家跟随脚本之家小编一起看看吧
    2018-07-07
  • 关于@Entity和@Table注解的用法详解

    关于@Entity和@Table注解的用法详解

    这篇文章主要介绍了关于@Entity和@Table注解的用法详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 深入理解java重载和重写

    深入理解java重载和重写

    这篇文章主要介绍了Java方法重载和重写原理区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-07-07
  • Java List Object[]转换成List T的实例

    Java List Object[]转换成List T的实例

    这篇文章主要介绍了Java List Object[]转换成List T的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09

最新评论