不知味店长 2021-11-17 17:42 采纳率: 100%
浏览 55
已结题

一个五子棋的游戏 横着竖着连成五子却显示不出来 课上要讲实在没办法了 求各位看一看 到底哪错啦!

package Text;
 
import java.util.Scanner;      //引入scanner类对字符序列进行解析(p212)
 
public class Test4 {
@SuppressWarnings("resource")
public static void main(String[] args) {
int flag=0; //偶数玩家一操作,奇数玩家二操作  局部变量初始化 p65成员变量有默认值,
            //但局部变量没有默认值,因此在使用局部变量之前必须保证局部变量有具体的值.具体原因见下面程序
int works=0; //判断是否胜利,若胜利则为4,具体原因需联系下面的程序
int works_x=0; //设定为当五子连线时最后一步的x值
int works_y=0; //设定为当五子连线时最后一步的y值
 
 String list[][] = start(); //棋盘的生成,和显示
 for (int i = 0; i < list.length; i++) {
 for (int j = 0; j < list[i].length; j++) {
 System.out.print(list[i][j]);
 }
 System.out.println();
 }
 
 while (true) { //引用while循环(p50),而while(true)作为无限循环,经常在不知道循环次数的时候使用,并且需要在循环内使用break才会停止。
                //此程序内设定为胜利时break,跳出循环
     
 Scanner sc = new Scanner(System.in); //声明对象并为其分配变量,括号中system.in表明将输入的字符串分配给变量sc
 System.out.print("位置:");
 String temp = sc.next();   //棋手输入的x值和y值(此方法中为0-9的数)
                            //然后scanner对象调用next()方法依次返回被解析的字符序列中的单词(p213)
                            //此处代表将输入的字符串分配给string类对象,以便后续对字符串的处理
 int x = Integer.parseInt(temp.substring(0,1));  //首先调用substring方法分别截取字符串的第一个元素和第二个元素(p199)
 int y = Integer.parseInt(temp.substring(1));    //然后再使用Integer类中的parseInt方法将字符序列转换为整数型(p200)
                                                 //最后再将截取的数字分别分配给变量x和y
  
 if (flag % 2 == 0){// //由于上面已0赋值给flag,所以if语句中设定成让玩家一先操作的程序
     if (list[x+1][y+1]==" - ") //当输入的位置在所给的棋盘范围中,进行下一步操作;若不在,else语句中执行flag--
                                //使flag值为单数,从而跳到下一个else-if语句,让玩家二操作。
                                //至于为什么是[x+1][y+1],结合棋盘图
     list[x+1][y+1] = " O ";    //依据输入的数组将指定位置的“-”变为“o”,从而实现玩家一的操作
 else
 flag--;
 }
 else{  //玩家二操作,此位置为" - ",否则重新输入,玩家二操作方法参考玩家一
 if (list[x+1][y+1]==" - ")
 list[x+1][y+1] =" X ";
 else
 flag--;
 }
 flag++; //每次操作成功+1,flag由单数变为复数,或由复数变为单数,从而实现让下一玩家操作
  
 for (int i = 0; i < list.length; i++) {//显示操作结果
 for (int j = 0; j < list[i].length; j++) {
 System.out.print(list[i][j]);
 ///*
 if (list[i][j]!=" - "){//判断是否胜利,只有非“ - ”时判断
  if(work(list,i,j)==4){//当值为4时,说明实现五子连线,并赋值给works变量,以便执行下列if语句
  works=work(list,i,j);
  works_x=x;//将实现五子连线的那个数组分别赋值给两个新变量
  works_y=y;
  }
 }
 //*/
 }
 System.out.println();
 }
  
 if(works!=0){//最后值为“ O ”时,玩家一胜出;最后值为“ X ”时,玩家二胜出。
 if(list[works_x][works_y]==" O ")
 System.out.println("玩家一胜出");
 else
 System.out.println("玩家二胜出");
 System.out.println("结束");
 break;
 }
 }
}
 
public static String[][] start() { //生成一个10*10的空棋盘
 String list[][] = new String[11][11];
 for (int i = 0; i < list.length; i++) {
 for (int j = 0; j < list[i].length; j++) {
 if(i == 0 && j==0)
 list[i][j] = "   ";
 else if (i == 0 && j!=0)
 list[i][j] = " "+(j-1)+" ";
 else if (j==0 && i!=0)
 list[i][j] = " "+(i-1)+" ";
 else
 list[i][j] = " - ";
 }
 }
 return list;
} 
//在输入每一组数组后,都会执行以下语句程序来判断此数组所对应的位置的各个方位是否形成五子连线。
public static int work(String list[][],int x,int y) {  //判断是否胜利
 int temp=0;//定义一个初始值为0的新变量,循环结束后此变量的最终值为work(list,x,y)值
 if(x-4>0 ){  //指位置若在第四行以下(依据棋盘旁标注),进行下列三种情况的判断
 if(y-4>0 ){  //第一种情况:指位置若在第四行以下且在第四列以后,执行下列语句判断其左上角是否五子连线
 for(int i=0;i<4;i++){  //执行四次循环,i取值就有0,1,2,3
 if (list[x][y]==list[x-4+i][y-4+i]) 
  temp++;
 else
  break;
 }
 }
 
 else if(y+4<list[x].length){//右上角是否五子连线 第二种情况,位置若在第五列及以前,第四行及以下,执行下列语句判断其右上角是否五子连线 
 for(int i=0;i<4;i++){ //执行四次循环,i取值就有0,1,2,3
 if (list[x][y]==list[x-5+i][y+5-i])//举例:若为list[5][6],在棋盘中位于第四行第五列,此语句将该位置分别与list[1][10](图中第0行第九列)
                                    //list[2][9]等其他五个位置做判断,判断是否都为“x”或都为“O”
  temp++;//循环执行一次,若成立则加1
 else
  break;//四次循环后暂停该循环
 }
 }
 else{    //第三种情况 
 for(int i=0;i<4;i++){ //正上角是否五子连线
 if (list[x][y]==list[x-4+i][y])//若位于第四行及以下,判断该位置以上四个位置是否相同
  temp++;
 else
  break;
 }
 }
 }
 else if(x+4<list.length ){ //左下角是否五子连线 若位置在第五行及以上,判断下列三种情况:
 if(y-4>0 ){//若位置在第五行及以上,第四列及以后,判断其左下角是否五子连线
 for(int i=0;i<4;i++){//与上面判断其右上角是否五子连线步骤类似
 if (list[x][y]==list[x+4-i][y-4+i])
  temp++;
 else
  break;
 }
 }
 else if(y+4<list[x].length){//右下角是否五子连线 若位置在第五行及以上,第五列及以前,右下角是否五子连线
 for(int i=0;i<4;i++){//与上面判断其左上角是否五子连线步骤类似
 if (list[x][y]==list[x+4-i][y+4-i])
  temp++;
 else
  break;
 }
 }
 else{
 for(int i=0;i<4;i++){ //正下角是否五子连线 若位置在第五行及以上,正下角是否五子连线
 if (list[x][y]==list[x+4-i][y])//与上面判断其正上角是否五子连线步骤类似
  temp++;
 else
  break;
 }
 }
 }
 else{
 if(y-4>0 ){            //若位置在第四列及以后
 for(int i=0;i<4;i++){ //正左角是否五子连线 与上面判断其正上角是否五子连线步骤类似
 if (list[x][y]==list[x][y-4+i])
  temp++;
 else
  break;
 }
 }
 else if(y+4<list[x].length){//正右角是否五子连线 若在第五列及以前
 for(int i=0;i<4;i++){//判断正右角是否五子连线
 if (list[x][y]==list[x][y+4-i])
  temp++;
 else
  break;
 }
 }
 }

 return temp;//在以上循环结束后,返回temp的值,并将其值分配给work(list,i,j)
 }
}



img


please告诉我怎么改!

  • 写回答

2条回答 默认 最新

  • 小吴不会java 2021-11-17 19:10
    关注

    这个根本就不会走进第三种情况的判断
    假定第一列5个O
    if(y-4>0 )---1 (y+4<list[x].length)----2
    x>4满足的时候 如果y在第一排 就进了第2个情况了 此时就判断左上角 左上角没有 然后break出去了 不会走第三条支路

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月2日
  • 已采纳回答 2月22日
  • 创建了问题 11月17日

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题