华容道 ——控制台实现

7 篇文章 0 订阅

这是我们班温油的java老师给我们留的一道课后题,先来讲一下玩法吧

设计控制台版本的华容道游戏,用户输入人物和移动方向,能够判断可否移动,并且根据给定方向和人物,进行移动。请自行设计人物类,并实现相应的功能。

  

    输入: 甲 右

    输出:

   

    输入: 赵云 下

输出:

输入: 曹操 下

输出:曹操不能向下走,请重新输入。

好啦,看一下小北同学是怎么做的叭:

首先是person类,用来记录每个名和字

package HuaRongDao;

public class Person {
    private String name;
    private int flag=0;//用来标记状态
    Person(String name,int flag){
        this.name=name;
        this.flag=flag;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public int getFlag() {
        return flag;
    }
    public void setFlag(int flag){
        this.flag=flag;
    }
}

接下来是ChessBoard类,是对棋盘的show 和对象判断修改等操作

package HuaRongDao;

public class ChessBoard {
    Person[][] board=new Person[5][4];
    //空参构造,初始化二维数组
    public ChessBoard(){
        board[0][0]=new Person("马",1);
        board[1][0]=new Person("超",1);
        board[0][1]=new Person("曹",2);
        board[0][2]=new Person("操",2);
        board[1][1]=new Person("曹",2);
        board[1][2]=new Person("操",2);
        board[0][3]=new Person("张",0);
        board[1][3]=new Person("飞",0);
        board[2][0]=new Person("赵",5);
        board[3][0]=new Person("云",5);
        board[2][1]=new Person("关",6);
        board[2][2]=new Person("羽",6);
        board[3][1]=new Person("丙",7);
        board[3][2]=new Person("丁",8);
        board[2][3]=new Person("黄",9);
        board[3][3]=new Person("忠",9);
        board[4][0]=new Person("甲",10);
        board[4][3]=new Person("乙",11);
        board[4][1]=new Person("11", 0);
        board[4][2]=new Person("11", 0);
    }
    //判断玩家输入的对象名字是否正确
    public int judegname(String personname){
        int temp=0;
        switch(personname){
            case "马超":temp=1;break;
            case "曹操":temp=1;break;
            case "张飞":temp=1;break;
            case "赵云":temp=1;break;
            case "关羽":temp=1;break;
            case "黄忠":temp=1;break;
            case "甲":temp=1;break;
            case "乙":temp=1;break;
            case "丙":temp=1;break;
            case "丁":temp=1;break;
            default:temp=0;break;
        }
        return temp;
    }
    //棋盘show
    public void show(){
        for (int i = 0; i <board.length ; i++) {
            for (int j = 0; j <board[i].length ; j++) {
                System.out.print(" "+board[i][j].getName());
            }
            System.out.println();
        }
        System.out.println();
    }
    //判断是否符合移动条件
    boolean judgemove(int i,int j,String temp){
        //判断是否符合移动的条件
        switch(temp){
            case "左":{
                if(i<0||i>4||j<0||j>3||board[i][j-1].getName()!="11"){
                    return false;
                }else
                    return true;
            }
            case "右":{
                if(i<0||i>4||j<0||j>3||board[i][j+1].getName()!="11"){
                    return false;
                }else {
                    return true;

                }
            }
            case "上":{
                if(i<0||i>4||j<0||j>3||board[i-1][j].getName()!="11"){
                    return false;
                }else{
                    return true;
                }
            }
            case "下":{
                if(i<0||i>4||j<0||j>3||board[i+1][j].getName()!="11"){
                    return false;
                }else{
                    return true;
                }
            }
        }
        return false;
    }
    boolean move(String temp,int i,int j)//判断是否能够移动
    {
        switch(temp){
            case "左":if(judgemove(i,j,temp)){
                board[i][j-1].setName(board[i][j].getName());
                board[i][j].setName("11");
                board[i][j-1].setFlag(board[i][j].getFlag());
                board[i][j].setFlag(0);
                return true;
                }else{
                return false;
                }
            case "右":if(judgemove(i,j,temp)){
                board[i][j+1].setName(board[i][j].getName());
                board[i][j].setName("11");
                board[i][j+1].setFlag(board[i][j].getFlag());
                board[i][j].setFlag(0);
                return true;
                }else{
                return false;
                }
            case "上":if(judgemove(i,j,temp)){
                board[i-1][j].setName(board[i][j].getName());
                board[i][j].setName("11");
                board[i-1][j].setFlag(board[i][j].getFlag());
                board[i][j].setFlag(0);
                return true;
                }else{
                return false;
                }
            case "下":if (judgemove(i,j,temp)){
                board[i+1][j].setName(board[i][j].getName());
                board[i][j].setName("11");
                board[i+1][j].setFlag(board[i][j].getFlag());
                board[i][j].setFlag(0);
                return true;
                }else {
                return false;
                }
            default:return false;
        }
    }
    //名字有两个字的对象移动情况
    void findperson(String person1,String person2,String temp) {
        A:for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 4; j++) {
                if (board[i][j].getName().equals(person1))
                {
                    for (int m = 0; m < 5; m++) {
                        for (int k = 0; k < 4; k++) {
                            if (board[m][k].getName().equals(person2)) {
                                if(board[i][j].getName()=="曹"&&board[i][j+1].getName()=="操")
                                {
                                    CaoCao(temp,i,j);
                                    break A;
                                }
                                else if ((board[i][j].getFlag()==board[m][k].getFlag())&&(board[i][j].getFlag()!=0&&board[m][k].getFlag()!=0))//属于同一个对象
                                {
                                    if(temp.equals("上")||temp.equals("左"))
                                    {
                                        if (move(temp, i,j) && move(temp, m, k))
                                        {
                                            System.out.println("成功移动");
                                            break A;
                                        } else {
                                            System.out.println("不能移动");
                                            break A;
                                        }
                                    }else{
                                        if (move(temp, m,k) && move(temp, i, j))
                                        {
                                            System.out.println("成功移动");
                                            break A;
                                        } else {
                                            System.out.println("不能移动");
                                            break A;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    private void CaoCao(String temp, int i, int j) {
        System.out.println(temp);
        if(temp.equals("上")){
            if(move(temp,i,j)&&move(temp,i,j+1)){
                move(temp,i+1,j);
                move(temp,i+1,j+1);
            }
        }else if(temp.equals("下")){
            if(move(temp,i+1,j)&&move(temp,i+1,j+1)){
                move(temp,i,j);
                move(temp,i,j+1);
            }
        }else if(temp.equals("左")){
            if(move(temp,i,j)&&move(temp,i+1,j)){
                move(temp,i,j+1);
                move(temp,i+1,j+1);
            }
        }else if(temp.equals("右")){
            System.out.println("右");
            if(move(temp,i,j+1)&&move(temp,i+1,j+1)){
                move(temp,i,j);
                move(temp,i+1,j);
            }
        }
    }
    //名字只有一个字的对象移动情况
    void findperson1(String person1,String temp)//当名字只有一个字的时候移动的情况
    {
        B:for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 4; j++) {
                if (board[i][j].getName().equals(person1)) {
                   if(move(temp, i, j))
                    break B;
                   else
                       System.out.println("不能移动");

                }
            }
        }
    }
}

接下来就是主模块啦:

package HuaRongDao;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
     ChessBoard chessBoard=new ChessBoard();
     chessBoard.show();
     while (true) {
         System.out.println("请输入你想要移动的人物名称:");
         Scanner scanner = new Scanner(System.in);
         String string = scanner.next();
         if (chessBoard.judegname(string) == 0){
                 System.out.println("输入名称格式错误,请重新输入:");

         } else {
                 if (string.length() == 2) {
                     String person1 = string.substring(0, 1);//截取字符串
                     String person2 = string.substring(1, 2);
                     System.out.println("请输入你要移动的方向:");
                     String fangxiang = scanner.next();
                     //此处判断一下是否越界
                     try {
                         chessBoard.findperson(person1, person2, fangxiang);
                     } catch (ArrayIndexOutOfBoundsException A) {
                         System.out.println("嘤嘤嘤,你玩坏我啦!");
                     }
                 } else {
                     String person1 = string.substring(0, 1);
                     System.out.println("请输入你要移动的方向:");
                     String fangxiang = scanner.next();
                     try {
                         chessBoard.findperson1(person1, fangxiang);
                     } catch (ArrayIndexOutOfBoundsException A) {
                         System.out.println("嘤嘤嘤,你一点都不可爱!");
                     }
                 }
                 chessBoard.show();
             }
         }
     }
}

大概就是这样

在敲代码的过程中有几个需要注意的方面:

A:如果判断对象可以移动,在移动的过程中不仅要对name进行覆盖,而且flag 也要进行修改

B:曹操占的份数最大,要独立判断

C:容易出现多种异常,要注意异常处理

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字华容道游戏是一个经典的益智游戏,可以用Python来实现。以下是一个简单的实现: ```python import random # 初始化数字华容道 def init_board(): board = [i for i in range(1, 16)] board.append(0) random.shuffle(board) return board # 打印数字华容道 def print_board(board): for i in range(4): for j in range(4): print(board[i * 4 + j], end='\t') print() # 判断数字华容道是否已经完成 def check_win(board): for i in range(15): if board[i] != i+1: return False return True # 移动数字 def move(board, direction): zero_index = board.index(0) # 找到0的位置 if direction == 'left': if zero_index % 4 != 0: board[zero_index], board[zero_index-1] = board[zero_index-1], board[zero_index] elif direction == 'right': if zero_index % 4 != 3: board[zero_index], board[zero_index+1] = board[zero_index+1], board[zero_index] elif direction == 'up': if zero_index >= 4: board[zero_index], board[zero_index-4] = board[zero_index-4], board[zero_index] elif direction == 'down': if zero_index <= 11: board[zero_index], board[zero_index+4] = board[zero_index+4], board[zero_index] # 游戏循环 def main(): board = init_board() print_board(board) while True: direction = input('请输入移动方向(left/right/up/down):') move(board, direction) print_board(board) if check_win(board): print('恭喜你,游戏胜利!') break if __name__ == '__main__': main() ``` 在这个实现中,`init_board`函数用来初始化数字华容道,`print_board`函数用来打印数字华容道,`check_win`函数用来判断数字华容道是否已经完成,`move`函数用来移动数字,`main`函数用来控制游戏循环。运行后,你可以输入`left`、`right`、`up`或`down`来移动数字,直到完成游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值