자바 간단 한 우물 바둑 게임 코드 인 스 턴 스 실현
자바 의 첫 번 째 실험 에서 선생님 은 정자 기 를 만 들 라 고 하 셨 고 컴퓨터 는 무 작위 로 바둑 을 두 었 습 니 다.
그리고 똑똑 할 수 있 을 까 하 는 생각 에 어느 수 를 두 었 는 지 판단 할 수 있다.그 다음 에 지지 않 을 수 밖 에 없고 똑똑 하지 못 해서 사용 자 를 딱딱 하 게 막 을 수 밖 에 없다.smartRobot 의 세 번 째 판단 논 리 는 가장 좋 은 위 치 를 찾 지 못 하고 얻 을 확률 이 비교적 적다.그리고 나 는 할 일이 없 을 때 이 작은 게임 을 해서 성취 감 을 찾 고 싶 었 지만 매번 로봇 을 이 겼 기 때문에 네 다섯 번 삭제 하고 고 쳐 서 마지막 에 되 었 다.
누가 먼저 시작 할 지 선택 할 수 있 지만 startGame 의 코드 는 더욱 지루 해 졌 다.보기 만 해도 어수선 한데 좋 은 방법 이 생각 나 지 않 는 다.
smartRobot 의 코드 는 모두 재 작성 되 었 습 니 다.원래 보다 더 똑똑 합 니 다.다음 네 개의 뿔 에 있 을 때 가장 좋 은 위 치 를 우선 선택 할 수 있 습 니 다.그리고 가장 좋 은 위치 가 없 을 때 빈 것 을 찾 습 니 다.
그리고 스마트 로봇 의 첫 번 째 와 세 번 째 판단 논리 도 좀 더 똑똑 해 졌 다.원래 로봇 을 판단 하고 사용 자 를 판단 하 는 논 리 는 하나의 for 순환 에 놓 여 있 었 지만 가장 좋 은 위 치 를 찾 지 못 해 이 제 는 갈 라 졌 다.
로봇 이 먼저 시작 해 야 새로 추 가 된 로봇 의'잔 머리'를 발휘 할 수 있다.그러나 로봇 의 원래 능력 은 발휘 되 지 않 고 사용자 가 먼저 시작 할 때 만 원래 의 능력 을 발휘 할 수 있다.그래서 각자 장단 점 이 있 고 누가 먼저 시작 하 든 적응 할 수 있 습 니 다.만약 로봇 이 먼저 시작 하고 사용자 의 첫 번 째 바둑 이 사각 위치 에 두 지 않 는 다 면 사용 자 는 반드시 질 것 이다.다른 상황 은 일반적으로 모두 무승부 이다.
누가 먼저 시작 할 지 선택 할 수 있 기 때문에 startGame 코드 가 불필요 한 문 제 를 해결 하 는 방법 은 바로 부분 내부 류 를 사용 하 는 것 이다.내부 클래스 가 접근 할 수 있 는 방법의 국부 대상.
주 논리 startGame:
1.3X3 의 2 차원 배열 로 바둑판 을 저장 합 니 다.
2.사용자 가 1~9 장 기 를 입력 합 니 다.
3.합 법 여 부 를 판단 하고 법칙 에 맞지 않 게 다시 입력 한다.
4.1~9 를 2 차원 좌표 x=(pos-1)/3,y=(pos-1)%3 으로 바 꾸 고 2 차원 배열 의 해당 위 치 를'O'로 한다.
5.사용자 의 승리 여 부 를 판단 하면 종료 합 니 다.무승부 여 부 를 판단 하면 물러난다.
6.로봇 이 바둑 을 둔다(입력 등급 에 따라 서로 다른 함 수 를 사용한다).
7.바둑판 을 인쇄 하여 사용자 와 로봇 의 바둑돌 을 나타 낸다.
8.로봇 의 승리 여 부 를 판단 하면 탈퇴 한다.무승부 여 부 를 판단 하면 물러난다.첫 걸음 으로 돌아 가 는 것 도 아니 고
성공 을 판단 하 는 논리:
모든 줄,열,대각선 이 한 줄 로 연결 되 어 있 는 지 판단 하고 문자 와 함께 판단 하면 됩 니 다.
willBeSuccessful 은 성공 여 부 를 판단 합 니 다.
여기 서 판단 하 는 것 은 줄 이 있 는 지,열 에 두 개의 같은 바둑 알 과 하나의 공백 이 있 는 지,문자 로 덧 붙 인 것 과 판단 하 는 것 이다.
calculate 계산 행렬 대각선:
매 거 류 를 사용 하여 계산 줄 인지 계산 열 인지 좌우 대각선 을 계산 하 는 지 판단 합 니 다.행렬 을 계산 할 때 1~3 의 숫자 가 들 어 오 면 어느 줄 의 열 인지 나타 낸다.
smartRobot 의 첫 번 째 판단 논리:
만약 바둑 알 이 화살표 가 가리 키 는 그 위치 에 있다 면,한 수 를 두 면 승리 할 수 있 을 것 이다.
로봇 은 먼저 자신 이 이런 위치 가 있 는 지,있 으 면 어디 에 있 는 지,승리 하 는 지 를 판단 한다.
방법 은 모든 공백 을 채 우 고 한 번 씩 채 워 서 isSuccessful 을 판단 하 는 것 입 니 다.
없 으 면,상대방 에 게 이런 자리 가 있 는 지 없 는 지 를 판단 하고,있 으 면 이곳 을 막는다.
smartRobot 의 세 번 째 판단 논리:
만약 바둑 알 이 화살표 가 가리 키 는 위치 에 있다 면 다음 단 계 는 반드시 승리 할 것 이다.왜냐하면 그곳 에 내 려 가면 세 번 째 열,세 번 째 줄 은 모두 두 개의 바둑 알 이기 때문에 상대방 이 어디 를 막 든 실패 할 것 이다.
또한 로봇 이 먼저 자신 에 게 이런 위치 가 있 는 지 판단 하고 있 으 면 다음 과 같다.
willBeSuccessful 을 호출 하여 이러한 위치 가 있 는 지 판단 합 니 다.
없 으 면 상대방 에 게 이런 위치 가 있 는 지,있 으 면 막 힌 다.
smartRobot 의 0 번 째 와 두 번 째 판단 논리:
네 개의 뿔 과 중심 위 치 를 처리 하고 만약 에 사용자 가 중심 에 있다 면 로봇 은 적어도 두 개의 바둑 알 아래 사각 위치 에 있어 야 지지 않 는 다 고 보장 할 수 있다.
수 차례 코드 변경:
import java.util.Arrays;
import java.util.Scanner;
public class Experiment_1 {
public static void main(String[] args) {
ThreeChess game = new ThreeChess();
game.startGame();
}
}
class ThreeChess{
private char[][] chessBoard = new char[3][3];
private int size = 0; //
private final int CAPACITY = 9; //
ThreeChess(){
for(char[] line : chessBoard){ //
Arrays.fill(line, ' ');
}
}
//【 】
public void startGame(){
System.out.println("┌───┬───┬───┐");
System.out.println("│ 1 │ 2 │ 3 │");
System.out.println("├───┼───┼───┤");
System.out.println("│ 4 │ 5 │ 6 │");
System.out.println("├───┼───┼───┤");
System.out.println("│ 7 │ 8 │ 9 │");
System.out.println("└───┴───┴───┘");
System.out.println(" 1 ~ 9 ");
System.out.println("O ,* ");
Scanner in = new Scanner(System.in);
System.out.print(" :
\t1.
\t2.
Input: ");
int whoFirst = in.nextInt();
System.out.print(" :
\t1. 999+
\t2. 250
Input: ");
int level = in.nextInt();
class Play{ //
// -1
int robotPlay(){
if(level == 1)
smartRobot();
else
sillyRobot();
printChessBroad();
if(isSuccessful() == -1) {
System.out.println(" (/ □ \\)");
return -1;
}else if (size == CAPACITY){
System.out.println("== ==");
return -1;
}
return 0;
}
int userPlay(){
int pos;
while(true){
System.out.print(" : ");
pos = in.nextInt();
if(pos < 1
|| pos > 9
|| chessBoard[(pos - 1) / 3][(pos - 1) % 3] != ' '){
System.out.println(" , !");
continue;
} else {
chessBoard[(pos - 1)/3][(pos - 1) % 3] = 'O';
size++;
break;
}
}
if(isSuccessful() == 1){
printChessBroad();
System.out.println(" , t(*°°*)s");
return -1;
} else if(size == CAPACITY){
printChessBroad();
System.out.println("== ==");
return -1;
}
return 0;
}
}
Play play = new Play();
if(whoFirst == 2){
while(true){
//1.
if(play.robotPlay() == -1)
return;
//2.
if(play.userPlay() == -1)
return;
}
} else {
while(true){
//1.
if(play.userPlay() == -1)
return;
//2.
if(play.robotPlay() == -1)
return;
}
}
}
//【 】
private void sillyRobot(){ //
int l, c;
while(true){
l = (int)(Math.random() * 3);
c = (int)(Math.random() * 3);
if(chessBoard[l][c] == ' '){
chessBoard[l][c] = '*';
break;
}
}
size++;
}
private int corner = 2;
private void smartRobot(){ //
if(chessBoard[1][1] == ' '){ //
chessBoard[1][1] = '*';
size++;
return;
}
//1. ( , )
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
if(chessBoard[i][j] == ' '){ //【1】 , , ;
chessBoard[i][j] = '*';
if(isSuccessful() == -1){ //【1】 , , ;
size++;
return ;
}
else
chessBoard[i][j] = ' ';
}
}
}
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
//【2】 【1】
if(chessBoard[i][j] == ' '){
chessBoard[i][j] = 'O'; //【2】
if(isSuccessful() == 1){ //【2】 , 。
chessBoard[i][j] = '*';
size++;
return ;
} else
chessBoard[i][j] = ' ';
}
}
}
//2. , , 。 。 。
if(corner > 0){
corner--;
for(int i = 0; i < 3; i++){ //
if(i == 1)
continue;
boolean NoBigO = true;
for(int j = 0; j < 3; j++){
if(chessBoard[i][j] == 'O')
NoBigO = false;
}
for(int j = 0; j < 3 && NoBigO; j++){
if(chessBoard[i][j] == ' '){
chessBoard[i][j] = '*';
size++;
return;
}
}
}
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
if(j == 1 || i == 1)
continue;
if(chessBoard[i][j] == ' '){
chessBoard[i][j] = '*';
size++;
return;
}
}
}
} //end if
//3. , ( )
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
if(chessBoard[i][j] == ' '){
chessBoard[i][j] = '*';
if(willBeSuccessful(-1)){
size++;
return;
} else
chessBoard[i][j] = ' ';
}
}
}
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
if(chessBoard[i][j] == ' '){
chessBoard[i][j] = 'O';
if (willBeSuccessful(1)) {
chessBoard[i][j] = '*';
size++;
return;
} else
chessBoard[i][j] = ' ';
}
}
}
sillyRobot();
}
//【 】
private void printChessBroad(){
System.out.println("
"); //
System.out.println("┌───┬───┬───┐");
System.out.println("│ " + chessBoard[0][0] + " │ " + chessBoard[0][1] + " │ " + chessBoard[0][2] + " │");
System.out.println("├───┼───┼───┤");
System.out.println("│ " + chessBoard[1][0] + " │ " + chessBoard[1][1] + " │ " + chessBoard[1][2] + " │");
System.out.println("├───┼───┼───┤");
System.out.println("│ " + chessBoard[2][0] + " │ " + chessBoard[2][1] + " │ " + chessBoard[2][2] + " │");
System.out.println("└───┴───┴───┘");
}
//【 】
private enum Choice{
LINE, //
COLUMN, //
RIGHT_DIAGONAL, //
LEFT_DIAGONAL; //
}
private int calculate(Choice choice, int i){ // 、 、
switch (choice){
case LINE:
return chessBoard[i][0] + chessBoard[i][1] + chessBoard[i][2];
case COLUMN:
return chessBoard[0][i] + chessBoard[1][i] + chessBoard[2][i];
case RIGHT_DIAGONAL:
return chessBoard[0][0] + chessBoard[1][1] + chessBoard[2][2];
case LEFT_DIAGONAL:
return chessBoard[0][2] + chessBoard[1][1] + chessBoard[2][0];
}
return 0;
}
private int isSuccessful(){
/*
-1 ; 1 ; 0 。
:126 == '*' + '*' + '*'
:237 == 'O' + 'O' + 'O'
*/
for(int i = 0; i < 3; i++){
if(calculate(Choice.LINE, i) == 237 || calculate(Choice.COLUMN, i) == 237)
return 1;
if(calculate(Choice.LINE, i) == 126 || calculate(Choice.COLUMN, i) == 126)
return -1;
}
if(calculate(Choice.LEFT_DIAGONAL, 0) == 237 || calculate(Choice.RIGHT_DIAGONAL, 0) == 237)
return 1;
if(calculate(Choice.LEFT_DIAGONAL, 0) == 126 || calculate(Choice.RIGHT_DIAGONAL, 0) == 126)
return -1;
return 0; //
}
private boolean willBeSuccessful(int who){ //who:-1 ,+1 。
// 、 、 2 , ,
//190 == 2 * 'O' + ' '
//116 == 2 * '*' + ' '
int n = 0;
int s = (who == 1) ? 190 : 116; // or
for(int i = 0; i < 3; i++){
if(calculate(Choice.LINE, i) == s)
n++;
if(calculate(Choice.COLUMN, i) == s)
n++;
}
// ,
return n > 1;
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.