No older revisions available
No older revisions available
~cpp MineSweeper.java
¶
~cpp
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Vector;
/*
* Created on 2005. 1. 2
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class MineSweeper {
String [][] mineArr;
public int [] inputSize() {
String input = input();
String [] array = input.split(" ");
int len = array.length;
int [] intArray = new int[len];
for (int i = 0; i < len; i++)
intArray[i] = Integer.parseInt(array[i]);
return intArray;
}
public String[][] inputChar(int []array) {
int row = array[0];
int col = array[1];
mineArr = new String[row][col];
for(int i = 0; i < row; i++) {
String input = input();
String [] arr = input.split("");
for (int j = 0; j < col; j++)
mineArr[i][j] = arr[j+1];
}
return mineArr;
}
public String input() {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String input = "";
try {
input = in.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return input;
}
public String[][] findPosition() {
int len = mineArr[0].length;
for (int row = 0; row < mineArr.length; row++) {
for (int col = 0; col < len; col++) {
if (mineArr[row][col].compareTo("*") == 0)
continue;
countMine(row, col);
}
}
return mineArr;
}
private void countMine(int row, int col) {
int count = 0;
int [] posRow = {-1, -1, 0, 1, 1, 1, 0, -1};
int [] posCol = {0, 1, 1, 1, 0, -1, -1, -1};
for (int i = 0; i < posRow.length; i++) {
if (row+posRow[i] >= 0 && col+posCol[i] >= 0 &&
row+posRow[i] < mineArr.length && col+posCol[i] < mineArr[0].length)
if (mineArr[row+posRow[i]][col+posCol[i]].compareTo("*") == 0)
count++;
}
mineArr[row][col] = Integer.toString(count);
}
private void printResult(Vector v) {
int size = v.size();
int i = 0;
while (i < size) {
String [][] arr = (String [][]) v.get(i);
int num = i+1;
System.out.println("Field #" + num + ":");
for (int row = 0; row < arr.length; row++) {
for (int col = 0; col < arr[0].length; col++) {
System.out.print(arr[row][col]);
}
System.out.println();
}
System.out.println();
i++;
}
}
static public void main(String [] args) {
Vector v = new Vector();
while (true) {
MineSweeper m = new MineSweeper();
int [] array = m.inputSize();
if (array[0] == 0 && array[1] == 0) {
m.printResult(v);
break;
}
else {
m.inputChar(array);
m.findPosition();
v.add(m.mineArr);
}
}
}
}
~cpp TestMineSweeper.java
¶
~cpp
import junit.framework.TestCase;
/*
* Created on 2005. 1. 2
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class TestMineSweeper extends TestCase {
MineSweeper m = new MineSweeper();
String [][] arr;
public void tInput() {
int [] array = m.inputSize();
assertEquals(4, array[0]);
assertEquals(4, array[1]);
assertEquals(2, array.length);
arr = m.inputChar(array);
assertEquals(4, arr.length);
assertEquals(4, arr[0].length);
}
public void testFirstLine() {
tInput();
arr = m.findPosition();
assertEquals("1", arr[0][1]);
assertEquals("0", arr[0][2]);
assertEquals("0", arr[0][3]);
assertEquals("2", arr[1][0]);
assertEquals("2", arr[1][1]);
}
}
느낀점 ¶
- 생각보다 단순한 문제였다. 윈도우의 지뢰찾기가 생각나서 어려워했나보다. RandomWalk보다 훨씬 쉽다.
- 변수 명명이 아직도 고민된다. 배열은 무조건 array 혹은 arr으로, 키보드 입력은 input을 붙인다. 딱히 적당한 이름이 생각나지 않는다.
- 자바에서 console 모드의 키보드 입력를 처음 사용했다. c보다 불편하다.
- tdd가 힘들다. 무엇을 테스트해야할지 모르겠다. 키보드 입력과 결과부분을 테스트했다. 그냥 막코딩한것같다. 생각대로 풀려서 다행이다.