华容道 ( java)

java老师布置这华容道的题,大概有两个多礼拜了,上机的时候,一班的同学做出来了,心里感觉很...  所以清明回家,就研究了研究。因为以前上过c++的选修课,所以对类的什么有那么一点点了解,对java也不熟悉,反正就这么用eclipse做出来了,哪里做的不好了,希望能指正。

华容道:

大体思路说一下:有个people类,和棋盘类,棋盘上将每个人名放好,然后根据移动规则来移动,当曹操移到下面就赢了。

people类:

package people;

import java.util.Scanner;

public class people {
String name;
int state;//状态,在移动时候将状态一样的一块移动
people(String c,int s)   //构造函数
{
this.name=c;
state=s;

}
static void JudgeName(String name)  //判断名字是否输入正确
{
int a=1;
while(a==1)
{
switch(name)
{
case"曹操":a=0;break;
case"张飞":a=0;break;
case"赵云":a=0;break;
case"黄忠":a=0;break;
case"关羽":a=0;break;
case"马超":a=0;break;
case"兵":a=0;break;
case"士":a=0;break;
case"卫":a=0;break;
case"卒":a=0;break;
default:
{
System.out.println("名字输入错误,请重新输入:");
Scanner reader= new Scanner(System.in);
name=reader.next();
JudgeName(name);
reader.close();
}
}
}
}
}

chessboard类:

package people;

public class Chessboard {

people[][] Board=new people[4][5]; //申请了一个people类型的棋盘
Chessboard()
{
Board[1][4]=new people("曹",0);
Board[2][4]=new people("操",0);
Board[0][4]=new people("赵",1);
Board[0][3]=new people("云",1);
Board[0][2]=new people("黄",2);
Board[0][1]=new people("忠",2);
Board[0][0]=new people("兵",3);
Board[1][2]=new people("马",4);
Board[2][2]=new people("超",4);
Board[1][1]=new people("卫",5);
Board[2][1]=new people("士",6);
Board[3][4]=new people("关",7);
Board[3][3]=new people("羽",7);
Board[3][2]=new people("张",8);
Board[3][1]=new people("飞",8);
Board[3][0]=new people("卒",9);
Board[1][3]=new people(" ",10);
Board[2][3]=new people(" ",11);
Board[1][0]=new people(" ",12);
Board[2][0]=new people(" ",13);

}
void print()//输出
{
for(int j=4;j>=0;j--)
{ for(int i=0;i<4;i++)
{ System.out.printf(" "+Board[i][j].name);
}
System.out.println();
}
System.out.println();
}

boolean win() //赢得条件
{
if(Board[1][1].name=="曹"&&Board[2][1].name=="操")
{
return true;
}
else return false;

}
boolean judgemove(int i,int j,String dir)//判断是否符合移动的条件
{
switch(dir){
case"左":
{ if(i<0||i>4||j<0||j>5||Board[i-1][j].name==" ")
{
return false;
}
else
return true;}

case"右":{ if(i<0||i>4||j<0||j>5||Board[i+1][j].name==" ")
{
return false;
}
else
return true;}
case"上":
{ if(i<0||i>4||j<0||j>5||Board[i][j+1].name==" ")
{
return false;
}
else
return true;}
case"下":
{ if(i<0||i>4||j<0||j>5||Board[i][j-1].name==" ")
{
return false;
}
else
return true;}
}

return false;

}
boolean move(String dir,int i,int j)//判断是否能移动
{
switch(dir)
{
case "左":if(judgemove(i,j,dir))
{
return false;
}
else
{
Board[i-1][j].name=Board[i][j].name;
Board[i][j].name=" ";
return true;
}
case "右":if(judgemove(i,j,dir))
{
return false;
}
else
{
Board[i+1][j].name=Board[i][j].name;
Board[i][j].name=" ";
return true;
}
case "上":if(judgemove(i,j,dir))
{
return false;

}
else
{ Board[i][j+1].name=Board[i][j].name;
Board[i][j].name=" ";
return true;
}
case "下":if(judgemove(i,j,dir))
{
return false;

}
else
{
Board[i][j-1].name=Board[i][j].name;
Board[i][j].name=" ";
return true;
}
default:return false;
}
}
void findname(String name1,String name2,String dir)//在棋盘里找出要移动的棋子且名字不是一个字
{

loop: for(int i=0;i<4;i++)
{
for(int j=0;j<5;j++)
{
if(Board[i][j].name.equals(name1))
{

for(int m=0;m<4;m++)
{
for(int k=0;k<5;k++)
{
if(Board[m][k].name.equals(name2))
{

if(Board[i][j].state==Board[i][j-1].state&&Board[i][j].state!=Board[i+1][j-1].state)
{ if( move(dir,m,k)&& move(dir,i,j))
;
else System.out.println("不能移动");
}
if(Board[i][j].name=="曹"&&Board[i+1][j].name=="操")

if( move(dir,i,j-1)&&move(dir,i,j)&&move(dir,i+1,j-1)&&move(dir,i+1,j))
;
else System.out.println("不能移动");
}
else
{
if( move(dir,i,j)&& move(dir,m,k))
;

}
break loop;
}
}
}
}
}
}
}
void findname1(String name1,String dir)//当名字只有一个字的时候移动的情况
{
loop1: for(int i=0;i<4;i++)
{
for(int j=0;j<5;j++)
{
if(Board[i][j].name.equals(name1))
{
move(dir,i,j);
break loop1;
}
}
}
}
}
主类:

package people;

import java.util.Scanner;

public class Mainpro {
public static void main(String[] args)
{
Chessboard Board=new Chessboard();
Board.print();
while(!Board.win())
{
System.out.println("请输入你要移动人物");
Scanner reader = new Scanner(System.in);
String name=reader.next();
people.JudgeName(name);
if(name.length()==2)
{ String name1=name.substring(0,1);
String name2=name.substring(1,2);
System.out.println("请输入你要移动方向");
String a=reader.next();
Board.findname(name1,name2,a);
}
else
{
String name1=name.substring(0,1);
System.out.println("请输入你要移动方向");
String a=reader.next();
Board.findname1(name1,a);
}
Board.print();
}
}
}

运行结果:

20150405

by:暖暖要坚持

时间: 2024-10-03 14:37:43

华容道 ( java)的相关文章

Java初学之华容道游戏

1 package hhuarongdao; 2 3 public class example { 4 public static void main(String args[]) 5 { 6 new Hua_Rong_Road(); 7 } 8 } 1 package hhuarongdao; 2 import java.awt.*; 3 import javax.swing.*; 4 5 import java.awt.event.*; 6 public class Hua_Rong_Roa

Java课设-数字华容道

2019-2020学年第一学期Java课设 数字华容道 一:团队成员介绍及任务分配 王鑫杰 201821123112 组长 dao模式结合数据库 登录验证 排行榜展示 林炜 201821123102 组员 主体代码 游戏主功能 界面设计 王粤翰 201821123110 组员 游戏背景音乐配置 编写团队博客 阿里巴巴代码扫描 二:项目Git地址 三:项目简介 我们设计的华容道游戏可以实现基本的游戏功能.此项目需要先登录(可注册)然后进入游戏主界面,可以在主界面上选择开始游戏.查看排行榜.控制音乐

亲身体验用Java写的仿qq聊天界面

Java开发工具有许多种,新手用记事本写Java程序,有些人用NetBean,jbuilder,高手用eclipse,下面介绍用eclipse开发qq聊天界面. 代码如下: package Myjava_QQ; import java.awt.*; import javax.swing.*; import Myjava_QQ.truess; import java.awt.event.*; import java.applet.*; import java.io.BufferedReader;

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

Java TM 已被阻止,因为它已过时需要更新的解决方法

公司的堡垒机需要通过浏览器登陆,且该堡垒机的网站需要Java的支持,最近通过浏览器登陆之后总是提示"java TM 已被阻止,因为它已过时需要更新的解决方法"导致登陆之后不能操作, 但是操作系统中确实已经安装了比较新的JDK,安装的JDK版本是jdk-7u67-windows-i586,因为太烦人,所以决定搞清楚报错的原因,一劳永逸,彻底解决这个问题 准备工作:安装JDK,安装版本jdk-7u67-windows-i586.exe,因为机器的Eclipse还依赖64位的JDK,所以另安

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

由@NotNull 注解引出的关于Java空指针的控制(转)

Java 小技巧和在java应用避免NullPonintException的最佳方法 在java应用程序中,一个NullPonintException(空指针异常)是最好解决(问题)的方法.同时,空指针也是写健壮的顺畅运行的代码的关键.“预防好过治疗”这句话也同样适用于令人不爽的NullPonintException.通过应用防御性的编码技术和在遵守多个部分之间的约定,你可以再很大程度上避免NullPointException.下面的这些java小技巧可以最小化像!=null这种检查的代码.作为

Java注解(2)-注解处理器(运行时|RetentionPolicy.RUNTIME)

如果没有用来读取注解的工具,那注解将基本没有任何作用,它也不会比注释更有用.读取注解的工具叫作注解处理器.Java提供了两种方式来处理注解:第一种是利用运行时反射机制:另一种是使用Java提供的API来处理编译期的注解. 反射机制方式的注解处理器 仅当定义的注解的@Retention为RUNTIME时,才能够通过运行时的反射机制来处理注解.下面结合例子来说明这种方式的处理方法. Java中的反射API(如java.lang.Class.java.lang.reflect.Field等)都实现了接

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个