java骑士飞行棋小游戏
- 格式:doc
- 大小:48.00 KB
- 文档页数:9
突然想起自己刚学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飞⾏棋的注释版,供⼤家参考,具体内容如下可以直接⽤:import java.util.Scanner;public class Fly3 {public static void main(String[] args) {// TODO Auto-generated method stubScanner sc = new Scanner(System.in);int all1 = 0;// 记录A的步数int all2 = 0;// 记录B的步数int flag1 = 1;// 对于A的暂停情况进⾏判断int flag2 = 1;// 对于B的暂停情况进⾏判断int first1 = 0;// 进⾏初始化判断int first2 = 0;System.out.print("|||||||||✈|||||||||||||||||||||||" + "\n||||✈||||||飞⾏棋Beta版||||||||||||\n"+ "|||||||||||||||||||||||||||✈|||||\n"+ "||||||||✈||||||||||||||||||||||||");// 标题显⽰System.out.println();System.out.println();System.out.println();System.out.println("\t}}}}图形展⽰{{{{");System.out.println("✈为传送门,⼀次10格" + "\n 为炸弹,⼀次退回6格" + "\n⚡为被雷劈,⼀次直接返回原点 " + "\n 为幸运轮盘,踩上去可选择相关" + "\n 为暂停,踩上后下⼀次⾏动⽆法进⾏" + "\n注:玩家与玩家的位置相同时,后⼀个玩家将会将上⼀个玩家挤退2格");System.out.println();System.out.println();String A = "玩家A";// ⽤户选择⾓⾊A = login(A);String B = "玩家B";B = login(B);if (A.equals(B)) {B = B + "2号";}maps(icon(all1, all2));for (int i = 0;; i++) {// A玩家视⾓System.out.println(A + "开始投骰⼦");int random1 = (int) (Math.random() * 6 + 1);String msg = sc.nextLine();System.out.println("少⼥祈祷中。
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}。
骑士飞行棋骑士飞行棋简介:《骑士飞行棋》又名《别生气》,是一款跟传统的飞行棋一模一样的小游戏。
游戏中每家有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 显示对战结果。
飞行棋游戏编程实现飞行棋是一款流行的棋类游戏,它具有简单易学、互动性强的特点,受到广大玩家的喜爱。
本文将介绍飞行棋游戏的编程实现方法,帮助读者了解游戏的基本规则并学习如何通过编程来实现这一有趣的游戏。
1. 游戏规则飞行棋是由2至4名玩家参与的棋类游戏。
游戏开始时,每个玩家在起点位置拥有4架飞机。
玩家按照骰子点数决定移动的步数,然后根据相应的指示牌前进。
在游戏过程中,各种特殊指示牌和棋盘上的陷阱会给玩家带来不同的影响,例如跳跃、返回起点或者使其他玩家飞机返回起点等。
当玩家的飞机到达终点时,即可获得胜利。
2. 编程实现为了实现飞行棋游戏,我们可以使用Python编程语言。
首先,我们需要创建一个游戏界面,用于显示棋盘和游戏进程。
可以使用Pygame库来创建游戏界面,并绘制相关图形来表示飞机、指示牌和陷阱等元素。
接下来,我们需要定义游戏的基本规则和功能。
这包括:- 确定起点和终点的位置;- 创建玩家类和飞机类,并为它们添加移动、跳跃和返回起点等方法;- 创建骰子类,并为其添加投掷的方法;- 创建指示牌类和陷阱类,并为它们添加相应的功能。
在游戏进行的过程中,我们需要监听玩家的操作,并根据游戏规则进行相应的处理。
例如,当玩家选择移动时,我们需要根据骰子的点数来确定飞机的移动步数,并根据指示牌和陷阱的效果来改变飞机的位置和状态。
此外,我们还可以为游戏添加一些额外的功能,例如记录每个玩家的得分、显示当前玩家的回合、实现多人对战等。
这些功能可以通过编程来实现,并加以美化以提升游戏的用户体验。
3. 编程技巧在飞行棋游戏的编程实现过程中,我们可以使用以下技巧来提高代码的质量和可读性:- 使用面向对象编程的思想,将游戏的各个部分封装成类,以便于理解和管理;- 使用合适的命名方式来标识变量、函数和类,遵循Python的命名规范;- 添加必要的注释和文档字符串,以便于其他人理解和使用代码;- 运用适当的代码缩进和格式化方式,使代码整洁美观;- 进行代码测试和调试,确保游戏能够正常运行并处理各种异常情况。
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("这是一种只有一个棋子的游戏。
package s1java.xmal1;import java.awt.Toolkit;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JOptionPane;import java.awt.FlowLayout;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class Map extends JFrame implements ActionListener {/****/private static final long serialV ersionUID = -5777519671651782702L;int[] map = new int[100]; // 对战地图int[] luckyTurn = { 6, 23, 40, 55, 69, 83 }; // 幸运轮盘int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 }; // 地雷位置int[] pause = { 9, 27, 60, 93 }; // 暂停int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 }; // 时空隧道/*** 生成地图: 关卡代号为:1:幸运轮盘2:地雷3: 暂停4:时空隧道0:普通*/int playerPos1 = 0;int playerPos2 = 0;String[] playerName = new String[2];int[][] Flag = new int[2][100];public void testMap() {// 设置标题this.setTitle("骑士飞行棋");// 设置窗体大小this.setSize(840, 500);// 取得屏幕的宽度JButton btn1 = new JButton("请掷骰子");JButton btn2 = new JButton("选择玩家");JButton btn3 = new JButton("游戏规则");final int width = Toolkit.getDefaultToolkit().getScreenSize().width;// 取得屏幕的高度final int height = Toolkit.getDefaultToolkit().getScreenSize().height;// 背景图片// 设置窗体出现位置this.setLocation((width - 800) / 2, (height - 500) / 2);setLayout(new FlowLayout());this.setResizable(false);this.add(btn1);this.add(btn2);this.add(btn3);// add(btn4);btn1.addActionListener(this);btn2.addActionListener(this);btn3.addActionListener(this);// this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setV isible(true);}public void createMap() {Flag[0][0] = -1;Flag[1][0] = -1;int i = 0;for (i = 0; i < luckyTurn.length; i++) {map[luckyTurn[i]] = 1;}for (i = 0; i < landMine.length; i++) {map[landMine[i]] = 2;}for (i = 0; i < pause.length; i++) {map[pause[i]] = 3;}// 添加代码实现在对战地图上设置时空隧道for (i = 0; i < timeTunnel.length; i++) {map[timeTunnel[i]] = 4;}}public Image getGraph(int i, int index) {Image image = null;if (playerPos1 == index && playerPos2 == index) {image = Toolkit.getDefaultToolkit().getImage("src\\s1java\\xmal1\\image\\两人.jpg");} else if (playerPos1 == index && playerPos2 != index) { image = Toolkit.getDefaultToolkit().getImage("src\\s1java\\xmal1\\image\\玩家一.jpg");} else if (playerPos2 == index && playerPos1 != index) { image = Toolkit.getDefaultToolkit().getImage("src\\s1java\\xmal1\\image\\玩家二.jpg");} else {switch (i) {case 1:image = Toolkit.getDefaultToolkit().getImage("src\\s1java\\xmal1\\image\\轮盘.jpg");break;case 2:image = Toolkit.getDefaultToolkit().getImage("src\\s1java\\xmal1\\image\\炸弹.jpg");break;case 3:image = Toolkit.getDefaultToolkit().getImage("src\\s1java\\xmal1\\image\\停止.jpg");break;case 4:image = Toolkit.getDefaultToolkit().getImage("src\\s1java\\xmal1\\image\\时空隧道.jpg");break;default:image = Toolkit.getDefaultToolkit().getImage("src\\s1java\\xmal1\\image\\普通.jpg");}}// 添加代码return image;}public void paint(final Graphics g) {super.paint(g);Image image = Toolkit.getDefaultToolkit().getImage("src\\s1java\\xmal1\\image\\背景.jpg");g.drawImage(image, 0, 65, 840, 430, this);g.setFont(new Font("宋体", Font.BOLD, 20));g.drawString("骑士飞行棋", 100, 55);// g.drawString("作者:董超", 620, 55);for (int i = 0; i <= 30; i++) {Image image1 = getGraph(map[i], i);g.drawImage(image1, 20 + i * 25, 130, this);}for (int i = 65; i >= 35; i--) {Image image1 = getGraph(map[i], i);g.drawImage(image1, 770 - (i - 35) * 25, 250, this);}for (int i = 31; i <= 34; i++) {Image image1 = getGraph(map[i], i);g.drawImage(image1, 770, 130 + (i - 30) * 25, this);}// 添加代码for (int i = 66; i <= 68; i++) {Image image1 = getGraph(map[i], i);g.drawImage(image1, 20, 250 + (i - 65) * 25, this);}for (int i = 66; i <= 99; i++) {Image image1 = getGraph(map[i], i);g.drawImage(image1, 20 + (i - 69) * 25, 350, this);}}public void showMap() {createMap();testMap();repaint();}int flag = 0;int step;String[] goAndStop = new String[] { "on", "off" };public void actionPerformed(final ActionEvent e) {// TODO 自动生成方法存根if (e.getActionCommand() == "游戏规则") {final String str = "玩家轮流掷骰子,点数是几就走几步。
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 骑士飞行棋{class Program{static int[] Map = new int[100];static int[] playerPos = {0,0};static void Main(string[] args){Random r = new Random();int num = 0;string msg = "";//存储用户关卡提示语bool[] isStop = {false,false};int[] luckyTurn = { 6, 23, 40, 55, 69, 83 };int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };int[] pause = { 9, 27, 60, 93 };int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };ShowUI();string[] names = new string[2];Console.WriteLine("请输入玩家A的姓名!");names[0] = Console.ReadLine();while (names[0] == ""){Console.WriteLine("玩家A姓名不能为空!");names[0] = Console.ReadLine();}Console.WriteLine("请输入玩家B的姓名!");names[1] = Console.ReadLine();while (names[1] == "" || names[1] == names[0]){if (names[1] == ""){Console.WriteLine("玩家B姓名不能为空!");}else if (names[1] == names[0]){Console.WriteLine("玩家B姓名已存在!");}names[1] = Console.ReadLine();}Console.Clear();ShowUI();Console.WriteLine("对战开始......");Console.WriteLine("{0}用♂来表示", names[0]);Console.WriteLine("{0}用♀来表示", names[1]);Console.WriteLine("如位置相同,AB用<>来表示");InitialMap();//初始化地图DrawMap();//绘制地图Console.WriteLine("开始游戏......");//玩家A,B轮流掷筛子while (playerPos[0] < 99 && playerPos[1] < 99){if (isStop[0] == false){#region A先掷骰子//玩家A掷筛子Console.ForegroundColor = ConsoleColor.Blue;//设置A的姓名颜色为蓝色Console.WriteLine();Console.WriteLine("玩家{0}按任意键开始掷骰子",names[0]);Console.ReadKey(true);num = r.Next(1, 7);Console.WriteLine("玩家{0}点数大小为:{1}", names[0], num);Console.ResetColor();//颜色恢复为默认值Console.WriteLine("按任意键开始行动......");Console.ReadKey(true);playerPos[0] = playerPos[0] + num;CheckPos();if (playerPos[0] == playerPos[1])//玩家A碰到玩家B,B退回原点{playerPos[1] = 0;msg = string.Format("{0}踩到了{1},{1}退回原点", names[0], names[1], names[1]);}else//没有碰到时,判断是否有关卡{switch (Map[playerPos[0]]){case 0:msg = "";break;case 1://幸运轮盘Console.Clear();DrawMap();Console.ForegroundColor = ConsoleColor.DarkYellow;Console.WriteLine("{0}走到了幸运轮盘,请选择运气类型",names[0]);Console.WriteLine("1----交换位置2----轰炸{0}",names[1]);int input = ReadInt(1, 2);//存储用户运气选择,方法调用不能放到开始!!!if (input == 1)//与对手交换位置{int temp = playerPos[0];playerPos[0] = playerPos[1];playerPos[1] = temp;msg = string.Format("{0}选择了与{1}交换位置",names[0],names[1]);}else//轰炸对方{playerPos[1] = playerPos[1] - 6;CheckPos();msg = string.Format("{0}轰炸了{1},{1}退6格", names[0], names[1]);}break;case 2://踩到地雷playerPos[0] = playerPos[0] - 6;CheckPos();msg = string.Format("{0}踩到了地雷,退6格", names[0]);break;case 3://暂停isStop[0] = true;msg = string.Format("{0}本回合暂停!",names[0]);break;case 4://时空隧道playerPos[0] = playerPos[0] + 10;msg = string.Format("天啊!!!{0}进入了时空隧道,进10格", names[0]);break;}}Console.Clear();DrawMap();if (msg != ""){Console.WriteLine(msg);}Console.ForegroundColor = ConsoleColor.Blue;Console.WriteLine("玩家{0}掷筛子掷出了{1}", names[0], num);Console.ResetColor();Console.WriteLine("**************玩家{0}和{1}玩家的位置如下**************", names[0], names[1]);Console.ForegroundColor = ConsoleColor.Blue;Console.WriteLine("{0}的位置为:{1}", names[0], playerPos[0] + 1);Console.ResetColor();Console.ForegroundColor = ConsoleColor.Yellow;Console.WriteLine("{0}的位置为:{1}", names[1], playerPos[1] + 1);Console.ResetColor();Console.ReadKey();#endregion}else{isStop[0] = false;}if (playerPos[0] >= 99){break;}if (isStop[1] == false){#region 玩家B掷骰子Console.ForegroundColor = ConsoleColor.Yellow;Console.WriteLine();Console.WriteLine("玩家{0}按任意键开始掷骰子",names[1]);//Console.WriteLine("玩家{0}按任意键开始掷骰子", names[0]);Console.ReadKey(true);num = r.Next(1, 7);Console.WriteLine("玩家{0}点数大小为:{1}", names[1], num);Console.ResetColor();Console.WriteLine("按任意键开始行动......");Console.ReadKey(true);playerPos[1] = playerPos[1] + num;CheckPos();if (playerPos[0] == playerPos[1])//玩家B碰到玩家A,A退回原点{playerPos[0] = 0;msg = string.Format("{0}踩到了{1},{1}退回原点", names[1], names[0]);}else//没有碰到时,判断是否有关卡{switch (Map[playerPos[1]]){case 0:msg = "";break;case 1://幸运轮盘Console.Clear();DrawMap();Console.ForegroundColor = ConsoleColor.DarkYellow;Console.WriteLine("{0}走到了幸运轮盘,请选择运气类型",names[1]);Console.WriteLine("1----交换位置2----轰炸{0}",names[0]);int input = ReadInt(1, 2);//存储用户运气选择,方法调用不能放到开始!!!if (input == 1)//与对手交换位置{int temp = playerPos[1];playerPos[1] = playerPos[0];playerPos[0] = temp;msg = string.Format("{0}选择了与{1}交换位置",names[1],names[0]);}else//轰炸对方{playerPos[0] = playerPos[0] - 6;CheckPos();msg = string.Format("{0}轰炸了{1},{1}退6格", names[1], names[0]);}break;case 2://踩到地雷playerPos[1] = playerPos[1] - 6;CheckPos();msg = string.Format("{0}踩到了地雷,退6格", names[1]);break;case 3://暂停isStop[1] = true;msg = string.Format("{0}本回合暂停!",names[1]);break;case 4://时空隧道playerPos[1] = playerPos[1] + 10;msg = string.Format("天哪!!!{0}进入了时空隧道,进10格", names[0]);break;}}Console.Clear();DrawMap();if (msg != ""){Console.WriteLine(msg);}Console.ForegroundColor = ConsoleColor.Yellow;Console.WriteLine("玩家{0}掷筛子掷出了{1}", names[1], num);Console.ResetColor();Console.WriteLine("**************玩家{0}和{1}玩家的位置如下**************", names[0], names[1]);Console.ForegroundColor = ConsoleColor.Blue;Console.WriteLine("{0}的位置为:{1}", names[0], playerPos[0] + 1);Console.ResetColor();Console.ForegroundColor = ConsoleColor.Yellow;Console.WriteLine("{0}的位置为:{1}", names[1], playerPos[1] + 1);Console.ResetColor();Console.ReadKey();#endregion}else{isStop[1] = false;}}Console.Clear();ShowUI();Console.ForegroundColor = ConsoleColor.DarkMagenta;if (playerPos[0] >= 99){Console.WriteLine("恭喜{0}狗获得了胜利!!!!", names[0]);}else{Console.WriteLine("恭喜{0}狗获得了胜利!!!!", names[1]);}Console.ReadKey();}/// <summary>/// 坐标越界判断(当坐标位置发生移动时)/// </summary>static void CheckPos(){for (int i = 0; i < 2; i++){if (playerPos[i] > 99){playerPos[i] = 99;}if (playerPos[i] < 0){playerPos[i] = 0;}}}/// <summary>/// 用于绘制飞行棋的界面/// </summary>static void ShowUI(){Console.WriteLine("***************************************");Console.WriteLine("* *");Console.WriteLine("* 骑士飞行棋*");Console.WriteLine("* *");Console.WriteLine("***************************************");}/// <summary>/// 对地图进行初始化/// </summary>static void InitialMap(){int[] luckyTurn = { 6, 23, 40, 55, 69, 83 };int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };int[] pause = { 9, 27, 60, 93 };int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };for (int i = 0; i < luckyTurn.Length; i++){int pos = luckyTurn[i];Map[pos] = 1;}for (int i = 0; i < landMine.Length; i++){Map[landMine[i]] = 2;}for (int i = 0; i < pause.Length; i++){Map[pause[i]] = 3;}for (int i = 0; i < timeTunnel.Length; i++){Map[timeTunnel[i]] = 4;}}/// <summary>/// 获得pos坐标绘制的图案/// </summary>/// <param name="pos">要绘制的坐标</param>/// <returns></returns>static string GetMapString(int pos){string result = "";if (playerPos[0] == pos && playerPos[1] == pos){Console.ForegroundColor = ConsoleColor.Yellow;result = "<>";}else if (playerPos[0] == pos){Console.ForegroundColor = ConsoleColor.Blue;result = "♂";}else if (playerPos[1] == pos){Console.ForegroundColor = ConsoleColor.Yellow;result = "♀";}else{switch (Map[pos]){case 0:Console.ForegroundColor = ConsoleColor.White;result = "□";break;case 1:Console.ForegroundColor = ConsoleColor.DarkYellow;result = "◎";break;case 2:Console.ForegroundColor = ConsoleColor.DarkRed;result = "●";break;case 3:Console.ForegroundColor = ConsoleColor.Gray;result = "▲";break;case 4:Console.ForegroundColor = ConsoleColor.Cyan;result = "Θ";break;}}return result;}static void DrawMap(){Console.WriteLine("图例:幸运轮盘◎地雷:●暂停:▲时空门:Θ");for (int i = 0; i < 30; i++)//绘制第一行{Console.Write(GetMapString(i));}Console.WriteLine();for (int i = 30; i < 35; i++)//绘制第一列{//绘制双空格for (int j = 0; j < 29; j++){Console.Write(" ");}Console.WriteLine(GetMapString(i));}for (int i = 64; i >34; i--){//for (int j = 0; j < 5; j++)//{// Console.WriteLine();//}Console.Write(GetMapString(i));}Console.WriteLine();for (int i = 65; i <=69; i++){Console.WriteLine(GetMapString(i));}for (int i = 70; i <=99; i++){Console.Write(GetMapString(i));}Console.WriteLine();Console.WriteLine();Console.ResetColor();}static int ReadInt(){int i = ReadInt(int.MaxValue, int.MinValue);return i;}static int ReadInt(int min,int max){while (true){try{int number = Convert.ToInt32(Console.ReadLine());if (number < min || number > max){Console.WriteLine("只能输入1--2,请重新输入!");continue;}return number;}catch{Console.WriteLine("只能输入数字,请重新输入!");}}}}}。
突然想起自己刚学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;}}。