• Апреля 01, 2020, 10:52:58 am
• Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
Новости: Вебинар по выбору IT профессии: http://bit.ly/2S4kcC6

Автор Тема: Массивы. Домашка. Крестики-нолики на Java  (Прочитано 36886 раз)

SunDrop

  • Клиенты
  • Пользователи
  • *****
  • Сообщений: 51
  • SunDrop
    • ICQ клиент - 404911
    • Просмотр профиля
    • http://www.sundrop.name/
Задача: Написать игру в крестики-нолики для двух игроков.

Реализацию смотреть здесь:
https://gist.github.com/SunDrop/9057069

Вопрос, который пока внятно не смог решить:
До этого нормально пользовался классом BufferedReader, но после этого занятия решил  попробовать Scanner.
Если посмотреть на строки кода с 25-ой по 36-ую, то тут мы требуем задать число в нужном диапазоне, которое соответствует нужным нам условиям.
Проблемы, которые возникли в ходе использования Сканнера:
1. Если задавать не число, программа зацикливалась на вводе: решилось путем добавления 35-ой строки sc.next();
2. Если ввести число, но за пределами поля, не корректно отрабатывет ввод, т.е. не выводится новое предупреждение, поле и просьба ввести число. Эту проблему не решил. Уверен, что обе проблемы связаны. Перевод if на try...catch проблему не решил.
Видимо не правильно я пока со Сканнером работаю.

Любые замечания приветствуются.
« Последнее редактирование: Февраля 18, 2014, 12:29:51 pm от Vsevolod »
В 20 лет он знал 9 операционных систем и 15 языков программирования, но ни одной женщины!

montonaro

  • Клиенты
  • Пользователи
  • *****
  • Сообщений: 45
    • Просмотр профиля
    • E-mail
Re: Массивы. Домашка. Крестики-нолики на Java
« Ответ #1 : Февраля 19, 2014, 09:02:45 am »
Цитировать
1. Если задавать не число, программа зацикливалась на вводе
- тоже была такая проблема, но я "поигрался" с циклами и исключениями, и вроде нормально прокатило

Написать игру в крестики-нолики для двух игроков.
https://github.com/montonaro/java-lessons/blob/master/task4/TicTacToe.java

Сюда же напишу и другие задачи:

Среднее арифметическое элементов массива. (без цикла)
https://github.com/montonaro/java-lessons/blob/master/task4/Average.java

остальные надо еще оформить, я позже выложу

SunDrop

  • Клиенты
  • Пользователи
  • *****
  • Сообщений: 51
  • SunDrop
    • ICQ клиент - 404911
    • Просмотр профиля
    • http://www.sundrop.name/
Re: Массивы. Домашка. Крестики-нолики на Java
« Ответ #2 : Февраля 19, 2014, 01:20:48 pm »
Среднее арифметическое элементов массива. (без цикла)
https://github.com/montonaro/java-lessons/blob/master/task4/Average.java

Про рекурсию спрашивал еще на уроке - сказали не подходит.

Пока есть такой вариант, но работает только на Java8;
public static void main(String[] args) {
        int [] arr = {1,2,3,4,5,6,7,8,9,10};
        System.out.println((double)IntStream.of(arr).sum()/arr.length);
}

UPD1.
http://ru.wikipedia.org/wiki/Groovy
assert [1,2,3,4,5,6].sum() == 21
Но вряд ли это то, что нужно :)
« Последнее редактирование: Февраля 19, 2014, 01:59:00 pm от SunDrop »
В 20 лет он знал 9 операционных систем и 15 языков программирования, но ни одной женщины!

SunDrop

  • Клиенты
  • Пользователи
  • *****
  • Сообщений: 51
  • SunDrop
    • ICQ клиент - 404911
    • Просмотр профиля
    • http://www.sundrop.name/
Re: Массивы. Домашка. Крестики-нолики на Java
« Ответ #3 : Февраля 19, 2014, 01:34:46 pm »
Написать игру в крестики-нолики для двух игроков.
https://github.com/montonaro/java-lessons/blob/master/task4/TicTacToe.java

1) https://github.com/montonaro/java-lessons/blob/master/task4/TicTacToe.java#L56
56-ая строка. При вводе числе на границе - не пускает, говорит поле занято.
Тут или <= писать, или не отнимать 1-ку. Я за второй вариант:
if(x < (this.x) && y < (this.y)){
2) Ключевой вопрос: а как игра, собственно, останавливается? Заполнил все поле, при этом есть 3 нолика в ряд. Упорно просит ввести координаты хода.
В 20 лет он знал 9 операционных систем и 15 языков программирования, но ни одной женщины!

Vsevolod

  • CEO
  • Administrator
  • Пользователи
  • *****
  • Сообщений: 1917
    • Просмотр профиля
    • Курсы программирования
    • E-mail
Re: Массивы. Домашка. Крестики-нолики на Java
« Ответ #4 : Февраля 19, 2014, 02:34:15 pm »
1. Если задавать не число, программа зацикливалась на вводе: решилось путем добавления 35-ой строки sc.next();
Правильно т.к. sc.hasNextInt() == false и break никогда не вызовется -->> вечный цикл.

2. Если ввести число, но за пределами поля, не корректно отрабатывет ввод, т.е. не выводится новое предупреждение, поле и просьба ввести число. Эту проблему не решил. Уверен, что обе проблемы связаны. Перевод if на try...catch проблему не решил.
Любые замечания приветствуются.
У меня выводиться... расскажи по-подробней как воспроизвести.
Prog.kiev.ua - курсы Java/Android/QA/Front-End. (044) 232-65-48, (093) 256-51-48, (095) 0-777-300, (096) 0-555-111

Vsevolod

  • CEO
  • Administrator
  • Пользователи
  • *****
  • Сообщений: 1917
    • Просмотр профиля
    • Курсы программирования
    • E-mail
Re: Массивы. Домашка. Крестики-нолики на Java
« Ответ #5 : Февраля 19, 2014, 02:35:45 pm »
Товарищи, давайте по топику на задачу, а то потом фиг найдешь что надо. Можно и нужно подымать старые темы если уже кто-то задачу решал ранее.
Prog.kiev.ua - курсы Java/Android/QA/Front-End. (044) 232-65-48, (093) 256-51-48, (095) 0-777-300, (096) 0-555-111

Vsevolod

  • CEO
  • Administrator
  • Пользователи
  • *****
  • Сообщений: 1917
    • Просмотр профиля
    • Курсы программирования
    • E-mail
Re: Массивы. Домашка. Крестики-нолики на Java
« Ответ #6 : Февраля 19, 2014, 02:37:09 pm »
Цитировать
Среднее арифметическое элементов массива. (без цикла)
https://github.com/montonaro/java-lessons/blob/master/task4/Average.java
Тоже красиво! Думай как еще можно  ;)
Prog.kiev.ua - курсы Java/Android/QA/Front-End. (044) 232-65-48, (093) 256-51-48, (095) 0-777-300, (096) 0-555-111

montonaro

  • Клиенты
  • Пользователи
  • *****
  • Сообщений: 45
    • Просмотр профиля
    • E-mail
Re: Массивы. Домашка. Крестики-нолики на Java
« Ответ #7 : Февраля 19, 2014, 03:37:34 pm »
Цитировать
2) Ключевой вопрос: а как игра, собственно, останавливается? Заполнил все поле, при этом есть 3 нолика в ряд. Упорно просит ввести координаты хода.
это я упустил (
вот сейчас время как раз есть, доработаю
 

SunDrop

  • Клиенты
  • Пользователи
  • *****
  • Сообщений: 51
  • SunDrop
    • ICQ клиент - 404911
    • Просмотр профиля
    • http://www.sundrop.name/
Re: Массивы. Домашка. Крестики-нолики на Java
« Ответ #8 : Февраля 19, 2014, 05:26:54 pm »
1. Если задавать не число, программа зацикливалась на вводе: решилось путем добавления 35-ой строки sc.next();
Правильно т.к. sc.hasNextInt() == false и break никогда не вызовется -->> вечный цикл.
И как решать? Вот так как я, добавлением sc.next() ?

2. Если ввести число, но за пределами поля, не корректно отрабатывет ввод, т.е. не выводится новое предупреждение, поле и просьба ввести число. Эту проблему не решил. Уверен, что обе проблемы связаны. Перевод if на try...catch проблему не решил.
Любые замечания приветствуются.
У меня выводиться... расскажи по-подробней как воспроизвести.

Ход игрока 1
   1   2   3
   4   5   6
   7   8   9
Наберите число, куда вы хотите вставить крестик: x

Вы ввели неправильное число. Повторите ввод

Ход игрока 1
   1   2   3
   4   5   6
   7   8   9
Наберите число, куда вы хотите вставить крестик: 99
Вы ввели неправильное число. Повторите ввод
// Вот тут должно вывестись еще дополнительно
/*
Ход игрока 1
   1   2   3
   4   5   6
   7   8   9
Наберите число, куда вы хотите вставить крестик:
*/ // Этого нету ;(
В 20 лет он знал 9 операционных систем и 15 языков программирования, но ни одной женщины!

Vsevolod

  • CEO
  • Administrator
  • Пользователи
  • *****
  • Сообщений: 1917
    • Просмотр профиля
    • Курсы программирования
    • E-mail
Re: Массивы. Домашка. Крестики-нолики на Java
« Ответ #9 : Февраля 19, 2014, 09:12:07 pm »
Цитировать
И как решать? Вот так как я, добавлением sc.next() ?
Лучше или BufferedReader чтобы не морочится или цикл менять типа while ( !  sc.hasNextInt()) {...}

Цитировать
// Вот тут должно вывестись еще дополнительно
Надо подумать WTF...
Prog.kiev.ua - курсы Java/Android/QA/Front-End. (044) 232-65-48, (093) 256-51-48, (095) 0-777-300, (096) 0-555-111

Vania

  • Клиенты
  • Пользователи
  • *****
  • Сообщений: 3
    • Просмотр профиля
    • E-mail
Re: Массивы. Домашка. Крестики-нолики на Java
« Ответ #10 : Февраля 20, 2014, 09:57:35 pm »
Реалізація ігри хрестики-нолики, ще один приклад
так як подібний код я пишу вперше, будь ласка прокоментуйте, всі зауваження вітаються.
import java.util.Scanner;
public class noughtsAndCrosses {
public static void main (String[] args){
System.out.println(" 1 | 2 | 3 ");
System.out.println("--- --- ---");
System.out.println(" 4 | 5 | 6 ");
System.out.println("--- --- ---");
System.out.println(" 7 | 8 | 9 ");
Scanner s = new Scanner (System.in);
//Масив з вмістом комірок {x,x,0,0,x....}
char [] arr = new char [9];
//Цикл введення з консолі де j = кількость вводу ходів;
steps: for (int j = 0; j < 10; j++){
//Умова, який гравець грає;
if (j%2 == 0) System.out.println("Хід 1 гравця:");
else System.out.println("Хід 2 гравця:");
//Перевірка введення числа чи букви;
while (!s.hasNextInt()){
System.out.println("Неправильно введений номер комірки");
s.next();
}
int i = s.nextInt() - 1;
//Перевірка введеного числа від 1 до 9;
if (i < -1 | i > 10){
System.out.println("Неправильно введений номер комірки, введіть від 1 до 9");
--j;
continue steps;
}
//Перевірка чи вільна комірка;
for (int t = 0; t < arr.length - 1; t++ ){
if (arr[i] != 0){
System.out.println("Номер комірки зайнятий");
--j;
continue steps;
}
}
// Присвоєння гравцю і комірці Х або О;
if (j%2 == 0)arr [i] ='x';
else arr [i] = 'o';
//Виведення ходу гравця;
System.out.println(" "+arr[0]+" | "+arr[1]+" | "+arr[2]+"  ");
System.out.println("--- --- ---");
System.out.println(" "+arr[3]+" | "+arr[4]+" | "+arr[5]+"  ");
System.out.println("--- --- ---");
System.out.println(" "+arr[6]+" | "+arr[7]+" | "+arr[8]+"  ");
//Умови перемоги;
for ( int n = 0; n < arr.length - 3; n = n + 3){
if (arr[n] == arr[n+1] & arr[n] == arr[n+2] & arr[n] != 0){
System.out.println("Переміг гравець " +(j%2+1));
break steps;
}
}
for ( int n = 0; n < 3; n++){
if (arr[n] == arr[n+3] & arr[n] == arr[n+6] & arr[n] != 0){
System.out.println("Переміг гравець " +(j%2+1));
break steps;
}
}
int n = 0;
if (arr[n] == arr[n+4] & arr[n] == arr[n+8] & arr[n] != 0){
System.out.println("Переміг гравець " +(j%2+1));
break steps;
}
if (arr[n+2] == arr[n+4] & arr[n+2] == arr[n+6] & arr[n+2] != 0){
System.out.println("Переміг гравець " +(j%2+1));
break steps;
}
//Умова нічиї;
if ( j == 8){
System.out.println("Нічия");
break steps;
}
}
}
}

montonaro

  • Клиенты
  • Пользователи
  • *****
  • Сообщений: 45
    • Просмотр профиля
    • E-mail
Re: Массивы. Домашка. Крестики-нолики на Java
« Ответ #11 : Февраля 21, 2014, 12:49:41 am »
Слава. Спасибо за критику. Доработал код.

Обновление тут (если интересно). https://github.com/montonaro/java-lessons/blob/master/task4/TicTacToe.java

Vsevolod

  • CEO
  • Administrator
  • Пользователи
  • *****
  • Сообщений: 1917
    • Просмотр профиля
    • Курсы программирования
    • E-mail
Re: Массивы. Домашка. Крестики-нолики на Java
« Ответ #12 : Февраля 21, 2014, 10:44:55 am »
так як подібний код я пишу вперше, будь ласка прокоментуйте, всі зауваження вітаються.

if (i < -1 | i > 10){
Лучше так

if (i < -1 || i > 10){
| и || - это разные операторы. Тоже самое касается & и &&.

if (j%2 == 0)arr [i] ='x';
else arr [i] = 'o';


- это anti-Java coding style  :)

if (j%2 == 0)
  arr [i] ='x';
else
  arr [i] = 'o';
Prog.kiev.ua - курсы Java/Android/QA/Front-End. (044) 232-65-48, (093) 256-51-48, (095) 0-777-300, (096) 0-555-111

SunDrop

  • Клиенты
  • Пользователи
  • *****
  • Сообщений: 51
  • SunDrop
    • ICQ клиент - 404911
    • Просмотр профиля
    • http://www.sundrop.name/
Re: Массивы. Домашка. Крестики-нолики на Java
« Ответ #13 : Февраля 21, 2014, 02:53:47 pm »
Привет, Ваня.
Буду краток: "Молодец!"
Программа реально работающая и работающая правильно.

Единственное критическое замечание - границы!
int i = s.nextInt() - 1;
//Перевірка введеного числа від 1 до 9;
if (i < -1 | i > 10){
У тебя было число от 1 до 9. Ты отнял 1. Стало число от 0 до 8. А диапазон проверки - от -1 до 11. В результате проходят следующие числа и программа падает с ошибкой: 0, 10, 11.
Must fix.

Второй нюанс по границам. Он хоть и никогда не наступает т.к. в операторе проверки стоит break, но...
Вдруг в следующих модификациях программа поменяется и эта проверка исчезнет?
Цитировать
        //Цикл введення з консолі де j = кількость вводу ходів;
        steps: for (int j = 0; j < 10; j++) {
У тебя поле 3 на 3, т.е. кол-во ходов = 9. Т.к. счет начинается с 0, то цикл должен быть от 0 до 8 включительно, следовательно j<=8 или j<9.

if (j%2 == 0)arr [i] ='x';
else arr [i] = 'o';

- это anti-Java coding style  :)
:)
Тернарный оператор if-then-else
Общая форма оператора if-then-else такова:
Выражение1 ? Выражение2 : выражениеЗ
int e = (b == 0) ? 0 : (a / b);
В твоем случае:
arr[i] = (j%2 == 0)?'x':'o';ИМХО, красиво, понятно и лаконично.

Еще раз говорю тебе молодец!
В 20 лет он знал 9 операционных систем и 15 языков программирования, но ни одной женщины!

Vsevolod

  • CEO
  • Administrator
  • Пользователи
  • *****
  • Сообщений: 1917
    • Просмотр профиля
    • Курсы программирования
    • E-mail
Re: Массивы. Домашка. Крестики-нолики на Java
« Ответ #14 : Февраля 21, 2014, 04:38:09 pm »
steps: for (int j = 0; j < 10; j++)А я как злой препод после Славы добавлю каку: НЕ ИСПОЛЬЗУЙТЕ goto в Java. Это пережиток тяжелого прошлого!

А так всем, кто решил здачу - 5+. Будет интересно с такой группой работать... будет повод программу расширять  ;)
Prog.kiev.ua - курсы Java/Android/QA/Front-End. (044) 232-65-48, (093) 256-51-48, (095) 0-777-300, (096) 0-555-111