重庆赛区ACM热身题8527.Do you like 玩游戏?
最近呢博主呢在忙于准备 acm的练习,在重庆的acm热身题里面我发现这个第三题的通过率是最低的,
本来以为acm程序设计大赛可以使用python 博主还高兴了一下,python毕竟在处理字符串这方面还是很占优势的,闲话不说了,先步入正题。我们首先分析题目这就是一个很简单的游戏,有点像贪吃蛇吧,它题目的意思就是生成一个地图 在外围我们发现他是用“=”和“|”框起来的,中心可以移动的区域为一个10x10 的空白区域。那么整个地图包括边界的区域我们就可以使用一个二维的字符串数组进行储存,那么我们第一个函数就是用来生成地图的,因为博主还是个在校大学生,正好这学期在学java那我就用java完成这道题目,看代码:
static String[][] createMap() {
String[][] map = new String[12][12];
for (int i = 0; i < 12; i++) {
map[0][i] = "=";
}
for (int i = 0; i < 12; i++) {
map[11][i] = "=";
}
for (int i = 1; i < 11; i++) {
for (int j = 0; j < 11; j++) {
map[i][j] = " ";
}
}
for (int i = 1; i < 11; i++) {
map[i][0] = "|";
}
for (int i = 1; i < 11; i++) {
map[i][11] = "|";
}
return map;
}
那么我们的地图即创建好了,后面就是一个显示地图的一个函数,很简单的就是一个遍历数组,打印值 代码:
static void printMap(String[][] map, int n) {
System.out.printf("score:%d\n", score);
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
System.out.print(map[i][j]);
}
System.out.println();
}
}
有了显示地图在我们写代码的过程中就可以时不时的查看自己代码所呈现出来的效果,在跟据效果来修改代码,打印在写程序的过程中是一个很有效的找错的方法,上面就是一个展现和初始化的一个过程,大家都知道,acm大赛在提交代码的时候数据的输入输出都是以固定形式的,在这里也没什么好说的,在第一行就是我们npc 所在的起始位置我是采用一个字符串数组的链表来进行存储数据的,第二行即是一个整数代表下面有多少行命令,接下来几行便全是命令,还是看代码吧:
static ArrayList<String> input() {
ArrayList<String> data = new ArrayList<String>();
Scanner sc = new Scanner(System.in);
String mpoint = new String();
mpoint = sc.nextLine();
data.add(mpoint);
String cc = new String();
int n = sc.nextInt();
for (int i = 0; i <= n; i++) {
cc = sc.nextLine();
data.add(cc);
}
return data;
}
好了万事俱备只欠东风了 等等好像还差一个 我们这个npc 迟到弱子这个过程还没进行编写呢?
那就自己定义个函数judge——裁判 来进行判定吧,原理很简单就是一个查看移动后的npc坐标在地图数组里面所对应的元素是否为“*” 如果是那么则分数加一 看代码吧:
public static void judge(int[] p, String[][] m) {
if (m[p[0]][p[1]].equals("*")) {
score++;
}
}
因为在Java 里面直接用 == 号表示的是比较两个对象的地址是否相同 而不是比较值 所以呢得用equals这个方法。
好下面看整个程序的代码吧:
import java.util.ArrayList;
import java.util.Scanner;
class acm_8 {
private static int score = 0;
static String[][] createMap() {
String[][] map = new String[12][12];
for (int i = 0; i < 12; i++) {
map[0][i] = "=";
}
for (int i = 0; i < 12; i++) {
map[11][i] = "=";
}
for (int i = 1; i < 11; i++) {
for (int j = 0; j < 11; j++) {
map[i][j] = " ";
}
}
for (int i = 1; i < 11; i++) {
map[i][0] = "|";
}
for (int i = 1; i < 11; i++) {
map[i][11] = "|";
}
return map;
}
static void printMap(String[][] map, int n) {
System.out.printf("score:%d\n", score);
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
System.out.print(map[i][j]);
}
System.out.println();
}
}
static ArrayList<String> input() {
ArrayList<String> data = new ArrayList<String>();
Scanner sc = new Scanner(System.in);
String mpoint = new String();
mpoint = sc.nextLine();
data.add(mpoint);
String cc = new String();
int n = sc.nextInt();
for (int i = 0; i <= n; i++) {
cc = sc.nextLine();
data.add(cc);
}
return data;
}
public static void judge(int[] p, String[][] m) {
if (m[p[0]][p[1]].equals("*")) {
score++;
}
}
public static void main(String[] args) {
String[][] map = createMap();
ArrayList<String> data = input();
int[] point = new int[2];
point[0] = Integer.parseInt(data.get(0).split(" ")[0]);
point[1] = Integer.parseInt(data.get(0).split(" ")[1]);
map[point[0]][point[1]] = "M";
for (int i = 2; i < data.size(); i++) {
String[] command = data.get(i).split(" ");
if (command[0].equals("f")) {
map[Integer.parseInt(command[1])][Integer.parseInt(command[2])] = "*";
} else {
String s = command[0];
switch (s) {
case "w":
map[point[0]][point[1]] = " ";
point[0]--;
judge(point, map);
break;
case "s":
map[point[0]][point[1]] = " ";
point[0]++;
break;
case "a":
map[point[0]][point[1]] = " ";
point[1]--;
break;
case "d":
map[point[0]][point[1]] = " ";
point[1]++;
break;
}
judge(point, map);
map[point[0]][point[1]] = "M";
}
printMap(map, 10);
}
}
}
来源:CSDN
作者:尼克不可
链接:https://blog.csdn.net/qq_42359956/article/details/84504058