java骑士飞行棋小游戏
java骑士飞行棋 小游戏

突然想起自己刚学java时,老师让写一个java骑士飞行棋,那时候还不知道写,到处问人,勉强写好了,结果全是放在主函数里,今天闲来没事,花了一会,再次写了个骑士飞行棋小游戏,希望对初学者有帮助吧。
代码中,可能用到了初学者还没接触到的东西,不过都不难,注释都有写明,花点时间就能明白的。
一共三个类。
分别:Game.javaMap.javaPlayer.javapackage chou.game.flying;import java.util.Random;import java.util.Scanner;public class Game {private Scanner sc = new Scanner(System.in);private static Map map = new Map();/*** 静态块,初始化地图* 加载时就会被执行的内容* 不理解的,可以在static{}块里打印一句话,看看控制台反映*/static {map.initMap();}/*** 游戏开始*/public void GameStart() {//游戏开始界面welcome();//选择角色,生成对象数组Player [] players = getPlayer();//游戏开始循环,直到有玩家胜出,结束boolean isAnyoneWin = false;while (!isAnyoneWin) {//遍历玩家数组,让每个玩家依次进行掷点for (int i = 0; i < players.length; i++) {//对玩家的状态进行判断,是否处于暂停状态if (players[i].getStatus() == 1) {//如果玩家处于暂停状态,恢复暂停状态并跳过此回合players[i].setStatus(0);statusSay(players[i]);continue;}//判断玩家,手动掷点if (i != 0) {letPlayerRoll(players[i]);}//进行掷点int count = roll();System.out.println(players[i].getName() + " 掷出了 " + count + " 点");//记录玩家roll点前位置和roll点后位置,判断玩家位置是否到达终点players[i].setLastPosition(players[i].getPosition());players[i].setPosition(players[i].getPosition() + count);//判断是否踩中对方int secondNum = Math.abs(1 - i);if (isHit(players[i], players[secondNum])) {players[secondNum].setPosition(0);if (players[i].getLastPosition() != 0) {changMap(players[i].getLastPosition(),players[i].getLastPositionFlag());}}if (checkAnyoneWin(players[i].getPosition())) {isAnyoneWin = true;//打印游戏结束标语gameOver(players[i]);continue;}else {//判断将去位置是否有特殊效果,判断效果之后,理论上来说,应该再次进行判断是否有特殊效果//但我们这里不设这种情出现,因为再来循环的话,代码会更复杂,不利于初学者学习//在这里,我们只判断再进行一次roll点的判定String mapBuff = null;mapBuff = getMapFlag(players[i].getPosition());if (!("=".equals(mapBuff))) {players[i] = checkBuff(players[i], mapBuff);}else if ("*".equals(mapBuff)) {count = roll();players[i].setPosition(players[i].getPosition() + count);}//判断是否踩中对方secondNum = Math.abs(1 - i);if (isHit(players[i], players[secondNum])) {players[secondNum].setPosition(0);if (players[i].getLastPosition() != 0) {changMap(players[i].getLastPosition(), players[i].getLastPositionFlag());}}//记录玩家去的位置的形状,地图复原使用mapBuff = getMapFlag(players[i].getPosition());players[i].setLastPositionFlag(mapBuff);//改变地图上玩家的位置,先复原,再改变//初始位置是为0,所以要判断if (players[i].getLastPosition() != 0) {changMap(players[i].getLastPosition(),players[i].getLastPositionFlag());}//三目运算符,i == 0 是一个布尔式,? 疑问,如果是真,返回:前面的值,如果假,:后面的值mapBuff = i == 0 ? "C" : "P";changMap(players[i].getPosition(), mapBuff);}map.showMap();}}}/*** 判断是否踩中对方* @param first 前面玩家* @param second 后面玩家*/public boolean isHit(Player first,Player second) {boolean temp = false;if (first.getPosition() == second.getPosition()) {temp = true;}return temp;}/*** 玩家掷点阻塞* @param player 玩家信息*/public void letPlayerRoll(Player player) {System.out.println("请玩家 " + player.getName() + " 掷点~");sc.next();}/*** 检查玩家到达的地图位置是否有特殊效果* @param player 玩家* @param mapBuff 地图标识* @return执行过buff后的玩家对象*/public Player checkBuff(Player player,String mapBuff) { if ("-".equals(mapBuff)) {System.out.println(player.getName()+ " 进入黑洞,迷失了方向,后退6步");System.out.println(player.getName() + ":shit!");player.setPosition(player.getPosition() - 6);}else if ("+".equals(mapBuff)) {System.out.println(player.getName() + " 进入时空隧道,前进6步");System.out.println(player.getName() + ":luckily!");player.setPosition(player.getPosition() + 6);}else if ("*".equals(mapBuff)) {System.out.println(player.getName() + " 进行了空间跳跃~再来一次");System.out.println(player.getName() + ":see me fly!");player.setStatus(0);}else if ("^".equals(mapBuff)) {System.out.println(player.getName() + " 抛锚了,暂停一次");System.out.println(player.getName() + ":what is the fuck!");player.setStatus(1);}return player;}/*** 改变地图上玩家的位置* @param position 位置* @param flag 地图形状*/public void changMap(int position, String flag) {if (position < 31) {map.map[0][position - 1] = flag;}else if (position > 30 && position < 36) {map.map[position - 30][29] = flag;}else if (position > 35 && position < 66) {map.map[6][position - 35] = flag;}else if (position > 65 && position < 71) {map.map[position - 59][0] = flag;}else if (position > 70 && position < 101) {map.map[12][position - 71] = flag;}}/*** 暂停言语* @param player 被暂停的玩家*/public void statusSay(Player player) {System.out.println(player.getName() + " 暂停中...........");}/*** 获得地图指定位置的形状* @param position 位置* @return*/public String getMapFlag(int position) {String flag = "=";if (position < 31) {flag = map.map[0][position - 1];}else if (position > 30 && position < 36) {flag = map.map[position - 30][29];}else if (position > 35 && position < 66) {flag = map.map[6][65 - position];}else if (position > 65 && position < 71) {flag = map.map[position - 59][0];}else if (position > 70 && position < 101) {flag = map.map[12][position - 71];}return flag;}/*** 胜利标语* @param player 玩家*/public void gameOver(Player player) {System.out.println("whar a palyer!!");System.out.println(" 玩家 " + player.getName() + " 率先到达终点,获得了胜利");}/*** 判断是否胜利* @param position 位置* @return boolean,temp*/public boolean checkAnyoneWin(int position) {boolean temp = false;temp = position >= 100 ? true : false;return temp;}/*** 掷点* @return int,count 点数*/public int roll () {int count = 0;//产生一个6以内的随机数Random random = new Random();count = random.nextInt(6) + 1;return count;}/*** 选择角色* @return Player [],players 玩家对象数组*/public Player [] getPlayer(){boolean flag = true;//创建对象数组,长度为2,用来接收玩家对象和电脑Player [] players = new Player[2];Player player = new Player();player.setNum(1);Player computer = new Player();while (flag) {String userChoose = sc.next();//获取输入内容,判断是否 1,2,3,根据选择给玩家对象赋名if (!userChoose.matches("[1-3]")) {System.out.println("→ 选择角色失败,请重新选择");} else {switch (Integer.parseInt(userChoose)) {case 1:player.setName("YaGaMi");break;case 2:player.setName("Killer");break;case 3:player.setName("Chou");break;default:break;}System.out.println("→ 你选择了 " + player.getName() + " 作为你的游戏角色");System.out.println("→ 电脑选择了 Fujiwara no Mokou 作为游戏角色" );computer.setName("Fujiwara no Mokou");//数组第1位是玩家,第二位是电脑players[1] = player;players[0] = computer;flag = false;}}return players;}public void welcome() {System.out.println("*********************************");System.out.println("*******欢迎来到飞行棋小游戏*******");System.out.println("*********************************");System.out.println();System.out.println("游戏说明:");System.out.println("地图上随机出现 * - ^ + 四种效果");System.out.println("分别代码:再掷1次,后退6步,暂停1次,前进6步");System.out.println();System.out.println("→ 请选择你的喜欢的游戏角色编号:");System.out.println("1.YaGaMi");System.out.println("2.Killer");System.out.println("3.Chou");}public static void main(String[] args) {new Game().GameStart();}}package chou.game.flying;public class Map {public String [][] map = new String[13][30];public void initMap() {for (int i = 0; i < map.length; i++) {for (int j = 0; j < map[i].length; j++) {if(i == 0 || i == 6 || i == 12 || (i < 6 && j == 29) || (i > 6 && j == 0)){map[i][j] = "=";}else {map[i][j] = " ";}}}map[0][6] = "+";map[0][8] = "-";map[0][15] = "*";map[0][20] = "-";map[0][29] = "^";map[3][29] = "*";map[6][7] = "^";map[6][16] = "+";map[6][20] = "-";map[6][28] = "^";map[10][0] = "*";map[12][7] = "-";map[12][8] = "^";map[12][15] = "-";map[12][20] = "^";map[12][23] = "-";map[12][28] = "-";}public void showMap(){for (int i = 0; i < map.length; i++) {for (int j = 0; j < map[i].length; j++) {if(i == 6){System.out.print(map[i][29-j] + " ");}else {System.out.print(map[i][j] + " ");}}System.out.println();}}public static void main(String[] args) {}}package chou.game.flying;public class Player {private String name;//玩家状态private int status;//玩家当前位置private int position;//玩家上把位置private int lastPosition;//玩家上把位置的地图形状private String lastPositionFlag;//玩家编号private int num;public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getName() {return name;}public void setName(String name) { = name;}public int getStatus() {return status;}public void setStatus(int status) {this.status = status;}public int getPosition() {return position;}public void setPosition(int position) { this.position = position;}public int getLastPosition() {return lastPosition;}public void setLastPosition(int lastPosition) { stPosition = lastPosition;}public String getLastPositionFlag() {return lastPositionFlag;}public void setLastPositionFlag(String lastPositionFlag) { stPositionFlag = lastPositionFlag;}}。
java课程设计--骑士游历程序的开发

java课程设计--骑士游历程序的开发JAVA程序设计课程设计报告课题: 骑士游历程序的开发姓名:学号:同组姓名:专业班级:指导教师:设计时间:2013.06.10评阅意见:评定成绩:指导老师签名:年月日目录一系统描述 (2)二设计目的与意义 (2)三分析与设计 (3)3.1 创建骑士游历程序 (3)3.2 功能模块划分 (3)3.3 系统详细设计文档 (5)3.3.1 类的划分及相互关系 (5)3.3.2 系统或模块的流程图 (5)3.4 各个模块的实现方法描述 (6)3.4.1 AccessibleSquare算法实现 (6)3.4.2 图形化界面 (9)3.4.3 主调用程序的设计和开发 (10)3.5 测试数据及期望结果 (11)四系统测试 (11)五总结或心得体会 (15)六参考文献 ............................ 错误!未定义书签。
七附录.. (16)一系统描述骑士游历问题是一个古老而著名的问题,它最初是由大数学家Euler提出的.问题是这样的:国际象棋中的棋子(叫作骑士)在一个空棋盘内移动,问它能否经过64格中的每一格且只经过一次?(骑士按L行移动,即在某方向前进两格接着在与原方向垂直的方向上前进一格)即:有一个n*m的棋盘(2≤n≤50,2≤m≤50),在棋盘(x1,y1)点即第x1行第y1列有一个中国象棋马,马走的规则为:(1)马走日字;(2)马只能向右走任务:求出从起始点到棋盘最右边的所有路径。
本程序实现了骑士游历问题的求解,并能够演示起始位置在棋盘上任何位置的游历问题的实现.程序采用动态的图形演示,使算法的描述更形象,更生动,使教学能产生良好的效果。
本程序采用Applet来编制整个程序,这样既可以使大家对算法的实现有了一定的了解,也可以熟悉一下Java图形界面, Applet以及Java语言的命名规范,让大家熟悉Java的基本语言结构和强大的开发能力。
飞行棋小游戏

飞行棋小游戏
目标:玩家需要将自己的所有飞机棋子从起点飞到终点,首先完成的玩家获胜。
规则和玩法: 1. 每个玩家掷骰子确定移动步数,然后选择一个飞机棋子移动相应的步数。
如果掷到6,则可以再次掷骰子并移动相应步数的飞机棋子。
2. 如果玩家的飞机棋子落在其他玩家的飞机棋子上,被撞飞的飞机棋子需要返回到起点重新开始。
3. 在飞机棋子飞行路径上有特殊的安全点和危险点,如果飞机棋子落在安全点,则可以暂时免受被撞飞的风险;如果落在危险点,则可能被撞飞或者退回起点。
4. 当玩家的飞机棋子到达终点时,需要准确掷骰子来精确移动到终点的位置。
如果掷骰子的点数超出终点位置,则需要移动到终点后再回退相应的步数。
5. 第一个将所有飞机棋子成功飞到终点的玩家获胜,游戏结束。
术语和技巧: 1. 策略:玩家需要根据游戏情况和其他玩家的位置来制定移动策略,尽量避免被撞飞并快速飞到终点。
2. 飞机棋子的选择:在掷骰子后,玩家需要根据掷骰子的点数来选择移动哪个飞机棋子,以最大化自己的移动效益。
3. 安全点和危险点的利用:玩家可以根据飞机棋子的位置来选择移动路径,尽量避开危险点或者利用安全点来保护自己的飞机棋子。
飞行棋小游戏不仅考验玩家的运气,还需要玩家灵活运用策略来取得胜利。
希望以上规则和技巧能帮助玩家更好地享受这款经典的家庭游戏。
飞行棋小游戏

飞行棋小游戏飞行棋是一种非常受欢迎的家庭桌游,适合2到4名玩家参与。
游戏的目标是让自己的飞机先飞回起点。
游戏规则如下:1. 每个玩家控制4架飞机,起点为各自的飞机场。
每个玩家的飞机场有4个不同颜色的起飞点,分别用于起飞和重新进场。
2. 游戏使用一个特殊的骰子,上面有数字1到6和一个飞机标志。
玩家轮流掷骰子并按骰子上的数字移动相应步数。
3. 玩家可以选择起飞一架飞机,或者移动已经起飞的飞机。
起飞的飞机从起飞点开始移动,每次掷骰子决定移动步数。
4. 当玩家掷到飞机标志时,可以选择起飞一架新的飞机或者移动已经起飞的飞机。
如果没有飞机可以起飞或移动,轮到下一位玩家。
5. 如果玩家的飞机落在其他玩家的飞机上,被撞的飞机将返回对方的飞机场重新进场,而被撞的玩家可以选择起飞一架新的飞机。
6. 当玩家的飞机完全绕一圈回到自己的起点时,进入降落阶段。
在降落阶段,玩家必须掷到一个精确的数字才能进入自己的飞机场。
如果掷骰子的数字超过了所需的数字,玩家必须将飞机移动到超过所需数字的位置。
7. 第一个将所有飞机都成功降落到自己的飞机场的玩家获胜。
飞行棋中的术语和技巧:1. 起飞点:玩家的飞机在起飞点等待起飞。
2. 移动:根据掷骰子的数字移动飞机的步数。
3. 飞机标志:掷到飞机标志的玩家可以起飞一架新的飞机或者移动已经起飞的飞机。
4. 撞机:当一个飞机落在其他玩家的飞机上时,被撞的飞机返回对方的飞机场重新进场。
5. 降落阶段:当玩家的飞机完全绕一圈回到自己的起点时,进入降落阶段。
6. 精确数字:在降落阶段,玩家必须掷到一个精确的数字才能进入自己的飞机场。
玩家可以根据自己的策略和技巧来决定起飞哪架飞机,以及如何移动已经起飞的飞机。
有时候,选择起飞新的飞机可能会更有利,因为它可以增加你的机会,但也有可能会被撞。
移动已经起飞的飞机时,需要考虑其他玩家的位置和可能的风险。
此外,玩家还可以尝试与其他玩家合作或采取竞争策略。
例如,两名玩家可以合作撞击另外一名玩家的飞机,以阻止他们进入降落阶段。
北大青鸟ACCP阶段项目__骑士飞行棋_java

问题描述
开发一款Java小游戏——骑士飞行棋
游戏规则和传统的飞行棋一样,支持两人对战 采用100格小型游戏棋盘 游戏规则:对战双方轮流掷骰子控制自己的骑兵前进或后退,在 游戏棋盘上设置有关卡
普通 地雷 暂停 时空隧道 幸运轮盘(提供两种运气:交换位置和轰炸)
棋盘上的关卡只在骑兵第一次移动遇到时有效
switch(i){
case 0: //普通格
if(对方在此格){
//对方被炸回起点
}
case 1: //幸运轮盘
//选择和对方交换位置——做交换
//选择轰炸对方——对方退6步
case 2: //地雷
//退后6步
case 3: //暂停键
//设置goAndStop为off,标识下轮暂停
case 4: //时空隧道
2
设计骑士飞行棋的棋盘
使用字符显示棋盘
起 点
前进方向
问题分析-1
暂停 普通
幸运轮盘
地雷
时空隧道
终 点
3
问题分析-2
根据需求分析对象
对战地图类(Map) 功能:在控制台显示棋盘,并显示当前玩家在棋盘中所处的位置 游戏类(Game) 功能:实现游戏初始化设置、展示游戏开始界面以及角色设置、 控制游戏进度、实现游戏规则、以及游戏结束后结果评判
测试类(StartGame) 功能:启动游戏
4
难点分析-1
实时动态显示对战地图
地图信息以整型数据存储在数组中
int[ ] map = new int[100]; //对战地图
数组下标 0
99
0000102134… 4 …
普通 幸运轮盘 地雷 暂停
时空隧道
JAVA小游戏骑士飞行棋源码03

JA V A小游戏骑士飞行棋源码03游戏过程:package s1java.xmal1;public class Game{//声明地图Map map;//声明玩家1和玩家2int playerPos1 ;int playerPos2 ;//声明走或停标识String[] goAndStop = new String[2];//声明对战角色String[] playerName = new String[2];/*** 初始化游戏的第一局**/public void init(){//新建Map对象map = new Map();//初始化地图map.createMap();//初始化玩家1和玩家2的位置playerPos1 = 0 ;playerPos2 = 0 ;//初始化玩家1和玩家2的走停标识goAndStop[0] = "on";goAndStop[1] = "on";}/*** 设置对战角色* @param no 玩家次序1:玩家1 2:玩家2* @param role 角色代号1:戴高乐2:艾森豪威尔3:麦克阿瑟4:巴顿*/public void setRole(int no , int role){if(no == 1){switch(role){case 1://设置玩家名称为"戴高乐"playerName[no-1] = "戴高乐";break;case 2://设置玩家名称为"艾森豪威尔"playerName[no-1] = "艾森豪威尔";break;case 3://设置玩家名称为"麦克阿瑟"playerName[no-1] = "麦克阿瑟";break;case 4://设置玩家名称为"巴顿"playerName[no-1] = "巴顿";break;}}if(no == 2){switch(role){case 1://设置玩家名称为"戴高乐"playerName[no-1] = "戴高乐";break;case 2://设置玩家名称为"艾森豪威尔"playerName[no-1] = "艾森豪威尔";break;case 3://设置玩家名称为"麦克阿瑟"playerName[no-1] = "麦克阿瑟";break;case 4://设置玩家名称为"巴顿"playerName[no-1] = "巴顿";break;}}}/*** 开始游戏**/public void start(){init();}public void}。
java小项目骑士飞行棋(含视频地址)

骑士飞行棋骑士飞行棋简介:《骑士飞行棋》又名《别生气》,是一款跟传统的飞行棋一模一样的小游戏。
游戏中每家有4个棋兵,谁4个兵最先到达目的地谁就赢(每一家的目的地各不相同,用颜色区别,大本营是什么颜色目的就是什么颜色)。
当没有活动的兵时,每家可以连续扔3次,直到扔出6点释放出一个兵。
之后每轮只能扔一次,棋兵前进的格数由扔出的点数决定,扔几点就走几步。
无论是前进或者后退,当棋兵最后落脚的地方踩到对方棋兵时,就把对方棋兵轰回老家,当踩到地雷就后退6格,当踩到“¤”时,就进入幸运轮盘,里面有8种运气:前进、后退、交换位置、转移、暂停一轮、奖励一次、设置地雷、轰炸(将对方棋兵炸退6步)。
一、需求分析:1、定义一个类MAP,生成游戏中的地图,地图中包括幸运轮盘“¤”的位置,地雷位置,暂停位置,时候隧道位置。
同时构造成员方法creatMap生成对战图,设置相关的成员变量;构造成员方法getGraph返回地图当前位置的对应图片。
定义构造方法showLine1输出地图的奇数行(第1、3行),定义showLine2输出地图的偶数行(第2行);定义showRLine输出地图的右竖列;定义showLLine输出地图的左数列;最后定义showMap方法显示对战图。
2、定义游戏类Game,定义相关的成员变量,包括对战图map,对战中玩家1的当前位置playerPos1,对战中玩家2的当前位置playerPos2,走或停标识设置goAndStop,对战角色playerName。
构造成员方法init()调用生成地图方法creatMap;开始游戏方法start(),同时构造成员方法setRole设置对战角色。
构造对战玩法的方法play。
其中方法play中调用掷骰子成员方法throwShifter,并返回掷出的骰子数目;构造成员方法getCurPos计算玩家此次移动后的当前位置,返回移动后的位置,构造方法judge 显示对战结果。
飞行棋游戏java实现

import java.util.Scanner;public class bisai {private final static int MAX = 105; // 宏定义private static int sign=0;static boolean temp=true;public static void main(String[] args) { Scanner scanner1 = newScanner(System.in);while(true){//System.out.println("******************** *请输入选择**********************");//System.out.print("1、进入最短路径查询:");//System.out.println("2、查看规则");//System.out.println("3、退出:");//System.out.println("******************** ******************************");//输入菜单选项if(temp){System.out.println("*********************请输入选择**********************");System.out.print("1、进入最短路径查询:");System.out.println("2、查看规则");System.out.println("3、退出:");System.out.println("********************** ****************************");sign=scanner1.nextInt();}switch(sign){case 1:feng();break;case 2:shuoming();break;case 3:System.exit(-1);default:System.out.println("没有您的选择");break;}}}//主体用于相关的的数据信息private static void feng() {int[][] juli = new int[MAX][MAX]; // 跳转距离存放boolean[][] biaozhi = newboolean[MAX][MAX]; // 标志是否遍历过int[][] queue = new int[MAX* MAX][3]; // 二维数组用来存放点的坐标第三列存放距离int[][] fangxiang = new int[][] { { 0, 1 }, { 0, -1 }, { 1, 0 },{ -1, 0 } };// 碰到飞行器时的方向改变上下左右// **********初始化数组**************for (int a = 0; a < MAX; a++)// 初始化距离数组for (int b = 0; b < MAX; b++) {juli[a][b] = 0;}for (int a = 0; a < MAX; a++)// 初始化标志位数组for (int b = 0; b < MAX; b++) {biaozhi[a][b] = true;}// *******************************int head=0, tail=0; // 用于逐层遍历int x=0, y=0;////终点坐标System.out.println("请依次输入 n,m 的值(n,m)用空格隔开):");Scanner scanner = newScanner(System.in);int n = scanner.nextInt();int m = scanner.nextInt();if((n<100&&n>=3)&&(m<100&&m>=3)){boolean bool=true;while (n > 0) {int i = 0, j=0, k=0;if(bool){System.out.println("输入棋子的初始位置(横纵坐标间用空格隔开):");queue[0][0] =scanner.nextInt();///棋子位置queue[0][1] = scanner.nextInt();}System.out.println("输入终点坐标(横纵坐标间用回车隔开):");x = scanner.nextInt();///坐标输入y = scanner.nextInt();if(queue[0][0]==x&&queue[0][1]==y){System.out.println("您输入终点坐标位置有误(起点与终点不能重合)");bool=false;continue;}System.out.println("输入飞行器的个数:");k = scanner.nextInt();while (k > 0) {System.out.println("输入飞行器的坐标(横纵坐标间用回车隔开):");i = scanner.nextInt();//输入飞行器的坐标j = scanner.nextInt();///if((i==queue[0][0]&&j==queue[0][1])){System.out.println("最近输入飞行器的位置有吴!(飞行器位置不能与起点位置重合)");continue;}else if((i==x&&j==y)){System.out.println("最近输入飞行器的位置有吴!(飞行器位置不能与终点位置重合)");continue;}if((i==x&&j==y)&&(i==queue[0][0]&&j==queue [0][1])){System.out.println("最近输入飞行器的位置有吴!(飞行器位置不能与起点和终点位置重合)");continue;}System.out.println("输入飞行器的"+i+" "+j+"飞行距离k(横纵坐标间用回车隔开):");i--;//数组下标从0开始,所以先减一保持与下标的一致j--;juli[i][j] = scanner.nextInt();// 输入飞行器距离k--;//计数器}queue[0][0]--;//数组下标从0开始,所以先减一保持与下标的一致queue[0][1]--;queue[0][2] = 0;biaozhi[queue[0][0]][queue[0][1]] = false;//将棋子位置的访问标志位设置假head = 0;tail = 1;x--;//数组下标从0开始,所以先减一保持与下标的一致y--;// 核心hexing(juli, biaozhi, queue, fangxiang, head, tail, x, y, n, m); //最短路径的计算调用·if (biaozhi[x][y]) {System.out.println("impossible");}break;}}else{sign=1;temp=false;System.out.println("行和列的有效范围是大于等于3小于100!请重新输入!");}}//用于网格的广度遍历private static void hexing(int[][] juli, boolean[][] biaozhi,int[][] queue, int[][] fangxiang, int head, int tail, int x, int y,int n, int m) {int i;int j;int k;while (head < tail && biaozhi[x][y]) { for (k = 0; k < 4; k++) {i = queue[head][0] +fangxiang[k][0];j = queue[head][1] +fangxiang[k][1];while (i >= 0 && i < n && j >= 0 && j < m && juli[i][j] > 0) {i += juli[i][j] * fangxiang[k][0]; //i 出现负的越界 whyif (i < 0 || i >= n ) {// 越界处理if (i < 0)i = 0;if (i >= n)i = n - 1;break;}j += juli[i][j] * fangxiang[k][1]; //????if ( j < 0 || j >= m) {// 越界处理if (j < 0)j = 0;if (i >= m)j = m - 1;break;}}if (i >= 0 && i < n && j >= 0 && j < m)// 符合条件进入数组if (biaozhi[i][j]) {queue[tail][0] = i;queue[tail][1] = j;queue[tail][2] = queue[head][2] + 1;biaozhi[i][j] = false;if (i == x && j == y) {System.out.println("最短路径为:");temp=true;//控制菜单是否显示System.out.println(queue[tail][2]);}tail++;}}head++;}}//规则说明函数private static void shuoming(){System.out.println("这是一种只有一个棋子的游戏。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
突然想起自己刚学java时,老师让写一个java骑士飞行棋,那时候还不知道写,到处问人,勉强写好了,结果全是放在主函数里,今天闲来没事,花了一会,再次写了个骑士飞行棋小游戏,希望对初学者有帮助吧。
代码中,可能用到了初学者还没接触到的东西,不过都不难,注释都有写明,花点时间就能明白的。
一共三个类。
分别:Game.javaMap.javaPlayer.javapackage ;import ;import ;public class Game {private Scanner sc = new Scanner(System.in);private static Map map = new Map();/*** 静态块,初始化地图* 加载时就会被执行的内容* 不理解的,可以在static{}块里打印一句话,看看控制台反映*/static {map.initMap();}/*** 游戏开始*/public void GameStart() {//游戏开始界面welcome();//选择角色,生成对象数组Player [] players = getPlayer();//游戏开始循环,直到有玩家胜出,结束boolean isAnyoneWin = false;while (!isAnyoneWin) {//遍历玩家数组,让每个玩家依次进行掷点for (int i = 0; i < players.length; i++) {//对玩家的状态进行判断,是否处于暂停状态if (players[i].getStatus() == 1) {//如果玩家处于暂停状态,恢复暂停状态并跳过此回合players[i].setStatus(0);statusSay(players[i]);continue;}//判断玩家,手动掷点if (i != 0) {letPlayerRoll(players[i]);}//进行掷点int count = roll();+ " 掷出了 " + count + " 点");//记录玩家roll点前位置和roll点后位置,判断玩家位置是否到达终点players[i].setLastPosition(players[i].getPosition());players[i].setPosition(players[i].getPosition() + count);//判断是否踩中对方int secondNum = Math.abs(1 - i);if (isHit(players[i], players[secondNum])) {players[secondNum].setPosition(0);if (players[i].getLastPosition() != 0) {changMap(players[i].getLastPosition(),players[i].getLastPositionFlag());}}if (checkAnyoneWin(players[i].getPosition())) {isAnyoneWin = true;//打印游戏结束标语gameOver(players[i]);continue;}else {//判断将去位置是否有特殊效果,判断效果之后,理论上来说,应该再次进行判断是否有特殊效果//但我们这里不设这种情出现,因为再来循环的话,代码会更复杂,不利于初学者学习//在这里,我们只判断再进行一次roll点的判定String mapBuff = null;mapBuff = getMapFlag(players[i].getPosition());if (!("=".equals(mapBuff))) {players[i] = checkBuff(players[i], mapBuff);}else if ("*".equals(mapBuff)) {count = roll();players[i].setPosition(players[i].getPosition() + count);}//判断是否踩中对方secondNum = Math.abs(1 - i);if (isHit(players[i], players[secondNum])) {players[secondNum].setPosition(0);if (players[i].getLastPosition() != 0) {changMap(players[i].getLastPosition(), players[i].getLastPositionFlag());}}//记录玩家去的位置的形状,地图复原使用mapBuff = getMapFlag(players[i].getPosition());players[i].setLastPositionFlag(mapBuff);//改变地图上玩家的位置,先复原,再改变//初始位置是为0,所以要判断if (players[i].getLastPosition() != 0) {changMap(players[i].getLastPosition(),players[i].getLastPositionFlag());}//三目运算符,i == 0 是一个布尔式,? 疑问,如果是真,返回:前面的值,如果假,:后面的值mapBuff = i == 0 ? "C" : "P";changMap(players[i].getPosition(), mapBuff);}map.showMap();}}}/*** 判断是否踩中对方* @param first 前面玩家* @param second 后面玩家*/public boolean isHit(Player first,Player second) {boolean temp = false;if (first.getPosition() == second.getPosition()) {temp = true;}return temp;}/*** 玩家掷点阻塞* @param player 玩家信息*/public void letPlayerRoll(Player player) {"请玩家 " + player.getName() + " 掷点~");sc.next();}/*** 检查玩家到达的地图位置是否有特殊效果* @param player 玩家* @param mapBuff 地图标识* @return执行过buff后的玩家对象*/public Player checkBuff(Player player,String mapBuff) { if ("-".equals(mapBuff)) {" 进入黑洞,迷失了方向,后退6步");+ ":shit!");player.setPosition(player.getPosition() - 6);}else if ("+".equals(mapBuff)) {+ " 进入时空隧道,前进6步");+ ":luckily!");player.setPosition(player.getPosition() + 6);}else if ("*".equals(mapBuff)) {+ " 进行了空间跳跃~再来一次");+ ":see me fly!");player.setStatus(0);}else if ("^".equals(mapBuff)) {+ " 抛锚了,暂停一次");+ ":what is the fuck!");player.setStatus(1);}return player;}/*** 改变地图上玩家的位置* @param position 位置* @param flag 地图形状*/public void changMap(int position, String flag) { if (position < 31) {map.map[0][position - 1] = flag;}else if (position > 30 && position < 36) {map.map[position - 30][29] = flag;}else if (position > 35 && position < 66) {map.map[6][position - 35] = flag;}else if (position > 65 && position < 71) {map.map[position - 59][0] = flag;}else if (position > 70 && position < 101) {map.map[12][position - 71] = flag;}}/*** 暂停言语* @param player 被暂停的玩家*/public void statusSay(Player player) {+ " 暂停中...........");}/*** 获得地图指定位置的形状* @param position 位置* @return*/public String getMapFlag(int position) {String flag = "=";if (position < 31) {flag = map.map[0][position - 1];}else if (position > 30 && position < 36) {flag = map.map[position - 30][29];}else if (position > 35 && position < 66) {flag = map.map[6][65 - position];}else if (position > 65 && position < 71) {flag = map.map[position - 59][0];}else if (position > 70 && position < 101) {flag = map.map[12][position - 71];}return flag;}/*** 胜利标语* @param player 玩家*/public void gameOver(Player player) {"whar a palyer!!");" 玩家 " + player.getName() + " 率先到达终点,获得了胜利"); }/*** 判断是否胜利* @param position 位置* @return boolean,temp*/public boolean checkAnyoneWin(int position) {boolean temp = false;temp = position >= 100 ? true : false;return temp;}/*** 掷点* @return int,count 点数*/public int roll () {int count = 0;//产生一个6以内的随机数Random random = new Random();count = random.nextInt(6) + 1;return count;}/*** 选择角色* @return Player [],players 玩家对象数组*/public Player [] getPlayer(){boolean flag = true;//创建对象数组,长度为2,用来接收玩家对象和电脑Player [] players = new Player[2];Player player = new Player();player.setNum(1);Player computer = new Player();while (flag) {String userChoose = sc.next();//获取输入内容,判断是否 1,2,3,根据选择给玩家对象赋名if (!userChoose.matches("[1-3]")) {"→ 选择角色失败,请重新选择");} else {switch (Integer.parseInt(userChoose)) {case 1:player.setName("YaGaMi");break;case 2:player.setName("Killer");break;case 3:player.setName("Chou");break;default:break;}"→ 你选择了 " + player.getName() + " 作为你的游戏角色");"→ 电脑选择了 Fujiwara no Mokou 作为游戏角色" );computer.setName("Fujiwara no Mokou");//数组第1位是玩家,第二位是电脑players[1] = player;players[0] = computer;flag = false;}}return players;}public void welcome() {"*********************************");"*******欢迎来到飞行棋小游戏*******");"*********************************");;"游戏说明:");"地图上随机出现 * - ^ + 四种效果");"分别代码:再掷1次,后退6步,暂停1次,前进6步");;"→ 请选择你的喜欢的游戏角色编号:");"1.YaGaMi");"2.Killer");"3.Chou");}public static void main(String[] args) {new Game().GameStart();}}package ;public class Map {public String [][] map = new String[13][30];public void initMap() {for (int i = 0; i < map.length; i++) {for (int j = 0; j < map[i].length; j++) {if(i == 0 || i == 6 || i == 12 || (i < 6 && j == 29) || (i > 6 && j == 0)){map[i][j] = "=";}else {map[i][j] = " ";}}}map[0][6] = "+";map[0][8] = "-";map[0][15] = "*";map[0][20] = "-";map[0][29] = "^";map[3][29] = "*";map[6][7] = "^";map[6][16] = "+";map[6][20] = "-";map[6][28] = "^";map[10][0] = "*";map[12][7] = "-";map[12][8] = "^";map[12][15] = "-";map[12][20] = "^";map[12][23] = "-";map[12][28] = "-";}public void showMap(){for (int i = 0; i < map.length; i++) {for (int j = 0; j < map[i].length; j++) {if(i == 6){+ " ");}else {+ " ");}};}}public static void main(String[] args) {}}package ;public class Player {private String name;//玩家状态private int status;//玩家当前位置private int position;//玩家上把位置private int lastPosition;//玩家上把位置的地图形状private String lastPositionFlag;//玩家编号private int num;public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getName() {return name;}public void setName(String name) { = name;}public int getStatus() {return status;}public void setStatus(int status) {this.status = status;}public int getPosition() {return position;}public void setPosition(int position) {this.position = position;}public int getLastPosition() {return lastPosition;}public void setLastPosition(int lastPosition) {stPosition = lastPosition;}public String getLastPositionFlag() {return lastPositionFlag;}public void setLastPositionFlag(String lastPositionFlag) { stPositionFlag = lastPositionFlag;}}。