Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Помогите с написание игры.


Автор: antsh 19.9.2005, 00:38
Для начала расскажу, что за игрушку мне нужно сделать, хотя многие её знают.

Имеется 10 спичек, 2 игрока, за один раз можно взять 1-3 спички, игроки берут спички поочереди, побеждает тот, кто возьмёт последнюю спичку.

Я сам новечёк в Яве, до этого писал на "древнем" Паскале. Почитал синтаксис, но ничего толком не собрал.

Вопросы:
1. Какие команды используются для запроса: "Сколько спичек вы хотите взять? (Жду цифру)"
2. Какой алгоритм придумать можно для "искуственного интелекта" этой игрушки. Помогите люди у кого уже был опыт в создании игрушек. smile

Автор: LSD 19.9.2005, 09:57
Цитата(antsh @ 19.9.2005, 01:38)
1. Какие команды используются для запроса: "Сколько спичек вы хотите взять? (Жду цифру)"

Код
System.out.print("Enter number:");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
int i = Integer.parseInt(str);
System.out.println(i+1);



Цитата(antsh @ 19.9.2005, 01:38)
2. Какой алгоритм придумать можно для "искуственного интелекта" этой игрушки. Помогите люди у кого уже был опыт в создании игрушек.

Это тебе лучше спросить в http://forum.vingrad.ru/index.php?showforum=129.

Автор: 3,14 19.9.2005, 10:31
Цитата(antsh @ 19.9.2005, 00:38)
1. Какие команды используются для запроса: "Сколько спичек вы хотите взять? (Жду цифру)"

Код

        byte [] buff = new byte [5];
        System.in.read(buff);
        int matchesCount = Integer.parseInt(new String(buff).trim());

Цитата(antsh @ 19.9.2005, 00:38)
2. Какой алгоритм придумать можно для "искуственного интелекта" этой игрушки. Помогите люди у кого уже был опыт в создании игрушек.

Ну ИИ здесь не нужен, а алгоритм для этой игры есть готовый, спроси здесь: http://forum.vingrad.ru/index.php?showforum=13, думаю помогут.

Автор: antsh 19.9.2005, 20:24
Спасибо за хелп, обхожусь пока что "TextIO", вроде достаточно для ввода, вывода.

Написал эту игрушку на Паскале, теперь имею чёткое представление что нужно делать. Вот столкнулся с проблемой: не знаю как обозначаются и используются массивы в Яве smile
Классы в Яве это тоже самое что и процедуры? smile

Автор: LSD 19.9.2005, 20:35
Массивы в Java похожи на массивы в паскале, только отсчет идет от 0 и размер можно задавать во время исполнения. Например итерация по массиву выглядит приблизительно так:
Код
String[] strings = new String[100];
for(int i = 0; i < array.length; i++)
{
  ...
}


Классы в Java похожи не на процедуры, а на объекты паскаля.

Автор: antsh 19.9.2005, 21:49
что то не понятно мне smile

можешь пожалуста конвертнуть этот код из Паскаля в Яву, мне так будет понятней.

Код

s : array[1..100] of byte;
win : array[1..100] of byte;

for i:=1 to n do s[i]:=0;
while (n-(m+1)*x)>0 do
begin
inc(x);
win[x]:=n-(m+1)*(x-1);
s[win[x]]:=1;
end;


Автор: batigoal 19.9.2005, 21:55
Код

byte[] s = new byte[100];
byte[] win = new byte[100];

for (int i = 0; i<n; i++)
  s[i]=0;

while ((n-(m+1)*x)>0)
{
  x++;
  win[x]=n-(m+1)*(x-1);
  s[win[x]]=1;
}


А вообще, любая книжка по основам языка сняла бы такие вопросы.

Автор: Ch0bits 20.9.2005, 06:01
Цитата(Lamer @ 19.9.2005, 21:55)
inc(x); // не понял, что это значит, оставил, как есть

x++;

Автор: LSD 20.9.2005, 07:48
Цитата(Lamer @ 19.9.2005, 22:55)
Код
...
for(int i = 1; i<n; i++)
  s[i]=0;
...

Только итерацию надо делать от 0, а не от 1.

Автор: batigoal 20.9.2005, 07:51
А, точно. В Паскале ведь с единицы нумеруется. Подправил.

Автор: antsh 20.9.2005, 13:51
Уже начинаю въезжать в синтаксис языка. Но что то мне не понятно почему программа не выдаёт в конце нули и потом нули с единицами. Должно выходить

0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 1 0 0 0 1

Посмотрите плз.

Код

public class Input {

                  public static void main(String[] args) {

                     int n,m,w,x,i;
                     

/*                     System.out.println("Please type a number of matches: ");
                     n = TextIO.getInt();
                  
                     System.out.println("Please type a number of matches to be taken at a time: ");
                     m = TextIO.getInt();*/
                     n=10;
                     m=3;
                     int[] s = new int[100];    
                 int[] win = new int[100];    
                     for (i = 1; i<=n; i++){s[i]=0;System.out.print(s[i]+" ");}
                     System.out.println();
                     
                     x=0;
                     while ((n-(m+1)*x)>0){
                      x++;
                      win[x]=n-(m+1)*(x-1);
                      s[win[x]]=1;
                      }
                     for (i=1; i<=n;i++){System.out.print(s[i]+" ");}
                 
                     
                  }
}

Автор: LSD 20.9.2005, 14:03
Ты наступил на одни очень интерестные грабли smile

Когда ты пишешь ' ' - это задает не строку и константу типа char, а char в Java числовой тип и может складываться с другими числовыми типами, таким образом когда ты пишешь s[i]+ ' ', char преобразуется в int и вычисляется сумма, которая затем и печатается.
Чтобы избежать такого надо писать " " - вот это уже строка и + будет выполнять конкатенацию строк.

Автор: antsh 20.9.2005, 14:51
Да верное это я не заметил когда переводил из паскаля, но всё равно это не решает проблемы, теперь он вообще ничего не выдаёт smile

Разобрался проблема была в "for (i = 0;i<n ; i++)"

Вопрос в чём разница между "=" и "=="?

Автор: LSD 20.9.2005, 14:53
У меня выдает 0 0 0 0 0 0 0 0 0 0.

Автор: batigoal 20.9.2005, 15:14
= - это присваивание (то же, что у вас := )

== - это сравнение

Автор: antsh 20.9.2005, 15:49
Хорошо тогда почему когда я пишу "for (i=1; i==n;i++)", то у меня ничего не выдаётся, а когда пишу "for (i = 1; i<=n; i++)" всё работает как надо.

я поправил код, теперь он верно работает. Должно быть 2 ряда, в нижнем единицы означают выгрышные спички.

Автор: LSD 20.9.2005, 15:57
В Java цикл for работает не так как в Pascal.
Цикл for выполняется до тех пор пока условие после первой точки с запятой истинно, т.е. в первом случае пока i равно n, если это условие сразу не верно, то цикл не выполнится ни разу.

Автор: antsh 20.9.2005, 16:14
LSD Аааа теперь ясно, большое спасибо, пойду дальше думать smile

Автор: antsh 20.9.2005, 18:07
Возникла проблема с вызовом процедур.

Что нужно писать на месте параметров, хочу из основного блока программы перенсти в процедуру i,n,m.


Код

...
...
void PC_move(... что тут??? ...);
                 

public static void PC_move(int i, int n, int m){.....}


Второй вопрос: имею 2 - 3 процедуры, хочу чтобы на всех были одни переменные - глобальные переменные, как их указывать smile

Автор: LSD 20.9.2005, 19:18
Цитата(antsh @ 20.9.2005, 19:07)
Возникла проблема с вызовом процедур.

Что нужно писать на месте параметров, хочу из основного блока программы перенсти в процедуру i,n,m.

Поясни поконкретней.


Цитата(antsh @ 20.9.2005, 19:07)
Второй вопрос: имею 2 - 3 процедуры, хочу чтобы на всех были одни переменные - глобальные переменные, как их указывать

В Java нет процедур и глобальных переменных, есть методы класса и поля класса. Поля класса бываю статические и нет, статические принадлежат всем экземплярам класса и существуют в единственном экземпляре. Не статические поля принадлежат конкретному экземпляру и их существует столько сколько созданно объектов. Методы тоже бывают статические и не статические, статические методы могут обращаться только к статическим методам и полям, не статические методы могут обращаться к любым методам и полям.

Автор: antsh 20.9.2005, 20:49
LSD
Цитата
Поясни поконкретней.


Вообщем ситуация такая: у меня одна процедура завязана на другой. Комп перескакивает из одной в другую постоянно, в итоге когда всё сделано, делается остановка программы. Как мне возможно это всё реализовать? smile

Автор: LSD 20.9.2005, 21:00
Как понять перескакивает, ты пишешь код он выполняется, если надо вызываешь другие методы, тогда начинают выполняться они, по завершению этих методов продолжает выполняться метод из которого был вызов. Это ничем от паскаля не отличается.

Автор: antsh 20.9.2005, 21:39
LSD Значит мне нужно знать как создаются новые методы и как в них переходить(вызывать). Метод - можно представить как процедура, ведь верно?

Вот код, проблема в том, что я из одного метода в другой параметры не могу перенести.

Код


public class Input {
    
                  public static void main(String[] args) {
                
                     
                  int n,m,v,x,i,sdvig;    

/*                     System.out.println("Please type a number of matches: ");
                     n = TextIO.getInt();
                  
                     System.out.println("Please type a number of matches to be taken at a time: ");
                     m = TextIO.getInt();*/
                   
                     n=10;
                     m=3;
                     sdvig=0;
                     System.out.println("Who will make the first turn? (PC - 1, Human - 2)");
                     v = TextIO.getInt();
                     System.out.println("-------------------------------------------------");
                     System.out.println();
                     if (v ==1) {System.out.println("You have chousen to play second ... ");
                     
                     }
                     
                     
                     if (v==2) {System.out.println("You have chousen to play first ... ");}
                     System.out.println("Now is your turn ...");}
                    

               public static void PC_move(int i, int n, int m,int sdvig){
          int x;
               System.out.print("Situation --> "); 
               for (i=0; i<=n;i++);{System.out.print("I ");}
               System.out.println("Now is the PC's move ...");
               
               //Glavnaja fishka----------------------------------
               int[] s = new int[100];     //Spichki
               int[] win = new int[100]; //Vqgrashnqe spichki
                    for (i = 0; i<=n; i++){s[i]=0;System.out.print(s[i]+" ");}
                    System.out.println();
                    
                    x=0;
                    while ((n-(m+1)*x)>0){
                     x++;
                     win[x]=n-(m+1)*(x-1); //Uznam skoljko i gde raspologajutsja vqgrashnqe spichki
                     s[win[x]]=1; //pomechaem ih
                     }
                    for (i=0; i<=n;i++){System.out.print(s[i]+" ");}
                    
                    //-------------------------------------------------------------
                    int move,k;
                    for (i=0;i<=n;i++)
               if (s[i+sdvig]==1){
                  
                  move = i;
                  System.out.println("PC takes: "+move+ "matches ...");
                  if (i+sdvig==n){System.out.print("You LOST :)"); /* Тут необходимо закончить программу.  */     }
                  System.out.println();
                                    
               }
                    
                    if (s[i+sdvig]==0){
                     
                     move = 1;
                     System.out.println("PC beret 1 spichku ...");
        
                    }
                    
                    sdvig=move+sdvig;
                    System.out.print("Situation --> "); 
               for (k=0; k<=(n-sdvig);k++);{System.out.print("I ");}    
               System.out.println("Now is your move ...");}
                 
}             

Автор: batigoal 20.9.2005, 21:39
Почему бы все-таки не посмотреть книгу по Java fundamentals?

Автор: LSD 20.9.2005, 21:51
Для выхода из приложения можно использовать System.exit(0). А вот насчет передачи параметров я так и не понял, чем тебя такой способ не устраивает:
Код
public void doSome(int i, double d, String str)
{
  doSomePart1(i, d);
  doSomePart2(str);
}

private void doSomePart1(int i, double d)
{
...
}

private void doSomePart2(String str)
{
...
}

Автор: javastic 21.9.2005, 09:28
antsh, вся проблема в том (насколько я понял по твоим суждениям) что ты думаешь на уровне модульного типа программирования, а не на уровне объектно-ориентированного, поэтому некоторые вещи для тебя не понятны. Попробуй поискать в Интернете статьи с описанием объектно-ориентированной парадигмы и сразу всё станет понятно.
smile

Автор: javastic 21.9.2005, 09:44
antsh, чтобы было проще понять как в яве выглядят аналоги процедур и функций как в паскале:

Код

pascal                                                         java
---------------------------------------|-------------------------------
function a(x:integer) : integer;      int a(int x) {
var i: integer;                                   int i=1;
begin                                                return (int)(x+i);
i := 1;                                             }
a := (x + i);
end

procedure b(x: integer);                void b(int x) {
var i: integer;                                     int i=1;
begin                                                  System.out.println(x+i);
i := 1;                                             }
writeln(x+i);
end;

Автор: antsh 22.9.2005, 14:20
Боьшое всем спасибо за оказанную помощь smile Особенно LSD. Написал всё через While, If. Достал книгу по Яве, буду теперь изучать. Просто проблема была в том, что сроки сдачи проги подходили, иначе штрафные получил бы. smile

Автор: antsh 22.9.2005, 14:35
аа ещё последний вопрос:
как объядинить 2 условия к примеру while(n>0 and n<4){....}

Автор: Dancer 22.9.2005, 15:17
while((n > 0) && (n <4)){}

&& - AND
|| - OR
! - NOT

Ты же книжку купил smile), разьве там нету? ну или на крайний случай скачай лубую по Java, и подглядывай туда smile

Автор: antsh 22.9.2005, 15:31
Dancer Спасибо, там то всё есть, книжонка более 300 страниц, только пока найду пройдёт пол дня smile А закончить все мелочи проги хочется.

Автор: Zandr 23.9.2005, 07:27
У нее что, оглавления нет?

Автор: antsh 23.9.2005, 13:31
ZandrКнига отпечатанная, друг сэекономил на названии книги и оглавлении, либо его вообще не было, вообще нету - факт smile

А домашку сдал на 5 smile так что всем спасибо ещё раз smile

Автор: javastic 23.9.2005, 15:29
Не за что. smile Будем надеяться что вскоре ты сам сможешь помогать новичкам. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)