Java Array Game - Концепция игровой логики - PullRequest
2 голосов
/ 21 апреля 2010

Я хочу создать игру, которая начинается с 3 зеленых точек слева и 3 красных точек справа с пробелом между ними. В финале должны быть цвета, поменяемые сторонами.

Правила игры таковы, что если рядом с точкой есть пробел, она должна быть в состоянии перемещаться туда, а также, если рядом с ней находится противоположный цвет - она ​​должна быть в состоянии перепрыгнуть, если есть пробел за противоположным цветом.

Мой вопрос находится под кодом.

Вот код:

//import mind.*;
import javax.swing.*;
import java.util.*;
import java.lang.*;
import java.awt.*;

public class Drive {
String[] middle = new String[7];

public Drive() {
    int player1, player2;
    boolean gameEnd, checkempty, checkempty2, enemy, enemy2;
    // Gamepieces
    String gr,rd,tom;
    gr="G"; rd="R"; tom=" ";
    // beginning of the game, endgame and the updating array
    String[] begin = {gr,gr,gr,tom,rd,rd,rd};
    String[] mellan = new String[7];
    String[] end = {rd,rd,rd,tom,gr,gr,gr};
    Scanner in = new Scanner(System.in);
    while (mellan!=end) {
        mellan=begin;
        for(int i=0; i<mellan.length; i++) {
            System.out.print(mellan[i]);
        }
        System.out.print("        Choose 0-6: ");
        int digits = in.nextInt();

        //BOOLEAN for game rules!!!
        checkempty = mellan[digits+1]==tom;
        checkempty2 = mellan[digits-1]==tom;
        enemy = (mellan[digits]==gr && mellan[digits+1]==rd && mellan[digits+2]==tom);
        enemy2 = (mellan[digits]==rd && mellan[digits-1]==gr && mellan[digits-2]==tom);

        if(checkempty) {
            mellan[digits+1]=mellan[digits];
            mellan[digits]=tom;
        } else if (checkempty2) {
            mellan[digits-1]=mellan[digits];
            mellan[digits]=tom;
        } else if (enemy) {
            mellan[digits+2]=mellan[digits];
            mellan[digits]=tom;
        } else if (enemy2) {
            mellan[digits-2]=mellan[digits];
            mellan[digits]=tom;
        }
    }
    System.out.print("Nicely Done");
}

// Test Drive!
public static void main(String args[]) {
    new Drive();
}
}

Задача :
Прямо сейчас это составляет игровую логику. Если бы точки не могли двигаться назад, я бы выполнил задание. Но так как они могут двигаться в обратном направлении, это вызывает ошибку при проверке кода вне массива (хотя это и понятно).

Решение на моей голове - сделать массив длиннее с незначительными признаками, чтобы не получить ошибку. Но я спрашиваю, есть ли другой способ? Потому что, как сейчас, я НЕ МОГУ ПЕРЕМЕЩАТЬ свои ПЕРВЫЕ и ПОСЛЕДНИЕ точки. средние числа работают так, как и должно быть!

Ответы [ 3 ]

3 голосов
/ 21 апреля 2010

Проблема возникает, когда digits равен 0 или максимальному индексу для массива. Вы не можете проверить mellan[digits-1], когда digits равен 0, и вы не можете проверить mellan[digits+1], когда digits является максимальным индексом для массива.

Итак, вам нужно проверить эти ситуации, прежде чем пытаться получить доступ к массиву. Вы можете попробовать что-то вроде этого:

checkempty2 = (digits > 0) && (mellan[digits-1] == tom);

Поскольку Java использует оценку короткого замыкания для логических операций, подобных этой, вторая часть этого выражения будет оцениваться, только если первая часть оценивается как true. Следовательно, mellan[digits-1] будет доступен только если digits больше 0.

Очевидно, вам также нужно иметь дело с пробелами позиции 2 слева или справа, но тот же принцип может применяться и там.

1 голос
/ 21 апреля 2010

Вы можете рассмотреть один из следующих вариантов:

1) Обведите две стороны 2 зелеными (или красными) точками. Они будут работать как барьеры.

2) Добавляйте условия всякий раз, когда вы проверяете следующую / предыдущую позицию массива.

Я бы выбрал второй подход ...

Я также предлагаю немного изменить код. Вы можете извлечь код, который проверяет переход (вправо или влево), в отдельный метод, который получает направление (+ 1 / -1, лучше как перечисление) в качестве параметра.

0 голосов
/ 21 апреля 2010

Просто проверьте, если digits + n больше или равно 0 (и меньше mellan.length). e.g.:

if(digits-2 >= 0)
{
    //put core here
}
...