понеділок, 14 грудня 2020 р.

Java4Kids The Last but not Least

 The previous week we had the last 6th lesson in between our little online group of 4 kids-boys. This time I decided to check how Java worked in their heads. Here is how it went.

Picking the best tasks

My goal was to make each student feel he owns the project. 

I've prepared the pool of tasks for the discussion. Kids voted, which ones everyone liked, and which were less interesting. When even one person was against some task, we would put it down in the lesson wishlist. Being a product team is not about democratic decisions, it's about "all or nothing". Kids added some of their nice-to-haves to our list too. Those tasks were also postponed for the better. 


Handling the tasks

This lesson was different because I wasn't the one showing examples of code. I was the one picking who would implement the task. Five lessons I'd been teaching, this time I checked the knowledge. 

Here is the list of our tasks:

- Add more kinds of food with different weights.

- Autogenerate food in different places.

- Let anteater eat ant's food.

The harder tasks were done by more professional kids. The intention was to make them help each other for the sake of a cooler project. It worked. Still, I have to admit that my expectations were higher. I counted that pretty much all of it will be more like a rehearsal, but it wasn't so for all of them. 



Expectations and Reality

- When you explain something, don't expect everyone listens to you even if a moment ago all wanted to know the answer. 

+ The true understanding comes when a question is put to a child and he tries to find the answer. At this moment he may remember what you've just said and take-repeat your explanation.


Summing up the Course

Before and during the first lesson, I was afraid of online with kids, I was so to say touching kids with a stick trying to understand how they work in such mode.

The third lesson was a turning point after which I understood that now I know how to handle the group.

In the next lessons we were heading to a specific goal: to implement the max amount of features to make our game competitive.

The last 6th lesson could be named "Show what you've learned". What made me happy is that some kids learned to work on the code by themselves.

We discussed the plan for the future, possible enhancements. I wish kids continue working on their own or with parents.

 

субота, 14 листопада 2020 р.

Java4Kids 5. Team Spirit

I should say that I'm pleased with today's lesson. It started as usual, from fixing student's code that doesn't compile. This time I was cheered up when one student needed just a bit of my help, and then he made almost everything on his own. And that's not it.


What Can Make a Lesson Happy?

This time we were writing the end of the game. No, it's not that we did everything we planned. We just wrote "You WIN" and "You LOOSE" screens and logically connected them. Now our product has finished look. This made me and all the students HAPPY. At the end of the lesson, we said goodbye feeling accomplishment. 

Let's sum up what we did in each lesson.

1 - Get to know each other; see a bit of Greenfoot; Java and OOP main points; ant moves.

2 - How objects are created in Greenfoot; create Pear - food, Grass - house; hide pear when brought home.

3 - Create Food-apple as a parent of the Pear; mark a different weight of the Pair and the Apple classes; the Ant can carry only light objects (apples). 

4 - Add possibility for the Ant to get more powers when eating Food and so the ability to carry heavy foods; created score counters on the screen.

5 - Created AntEaters and Game Over screens, its logic.

What shall we do at the next and last lesson? Polish our features, add minor nice-to-haves, share the project.

Here is the link to the project with code. Go and try to win!



What can make a lesson pleasant for a teacher?

The best award for a teacher is when his students show they understand the subject and all the given information is accepted and processed. 

Yes. I had it. After the student questioned the problem in his new code, he didn't stop the screen share. As a result, we developed a substantial feature on his computer with his hands. 

Amazing that it wasn't just me advising what to do and how to do it, but other students also were involved. One thing is when a teacher shows the feature and another when your student-partner acts instead. Anyone could be in his place. The fortune of the common game is in the hands of another boy. The rest of the team was much more involved compared to when listening to just me.


What can pull a children's team together when online?

Working on a common thing makes people a team. Common success made children more active and easygoing. When they were told that the next lesson would be the last, everyone started saying what else they wanted to implement to make our game more interesting and fun. 

I'm happy that everything worked out so well! 


Code from the lesson

import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class AntEater extends Actor

{

    public void act() 

    {

        move(4);

        if(Greenfoot.getRandomNumber(10) < 1){

            turn(Greenfoot.getRandomNumber(15)-30);

        }

        eatAnt();

    }    

    

    public void eatAnt(){

        if(isTouching(Ant.class)){

            removeTouching(Ant.class);

            getWorld().showText("YOU LOOSE", 

                getWorld().getWidth()/2, getWorld().getHeight()/2);

        }

    }

}

-----------------------------
Class Food, updated method
...
public void disappear(){
        Grass.hasFood += this.weight;
        foodAmount -= 1;
        if(foodAmount == 0){
            getWorld().removeObject(getOneIntersectingObject(Ant.class));
            getWorld().showText("YOU WIN", 
                    getWorld().getWidth()/2, getWorld().getHeight()/2);
        }
        getWorld().removeObject(this);
    }  
...

Java4Kids 4. Score

Ну что же за игра без подсчетов очков? Как же тогда доказать, что я лучше чем мой одноклассник?

Задача

На прошлом уроке добавили силу муравья, есть вес еды. 

Теперь осталось вести подсчет принесенной еды в дом-хранилище и есть ее по мере необходимости. 


Препятствие на пути к цели

Переменную для дома-хранилища добавили. 

Написали логику для добавления еды в дом. 

Но что-то не работает.

Вспомнили, что ведь муравья не научили есть. 

Научили. 

Но все равно не работает!!! Что делать? 

Дебаг? Действительно дебаг на 4-том уроке? Еще испугаются. 

Собственно, мы ведь хотели вывести подсчет баллов на экран. Так давайте заодно выведем и другие переменные чтоб понять, что не работает!


Что меня порадовало

Признаюсь, что прошлый урок был тяжелым. Когда говорили про наследование, дети, которые выражали идеи просто замолчали услышав о таком, а потом мы его написали-списали. Я только надеялась, что они поняли.

В этот раз, когда мы добавили вывод счетчиков на экран и запустили проект, сразу стало весело, дети оживились и стали думать над моментом, где что не так. Оказалось, что не в то место код вставили. С 3его раза таки вышло. 

Что бы улучшить

Стала ощущать душок от нашего кода. Много маленьких методв, чтоб максимально не подписывать, что где происходит. Муравей, как главный персонаж, все-таки заложник большинства логики. Надо бы рефакторинг. Все же не хочется тратить на него много времени. Постараемся сделать по ходу анализируя, где мы находимся. Много фичей в плане.

Домашнее задание

Отладить работу всех переменных и муравья, разобравшись, куда разместить метод updateCounter(). На уроке вышло почти все, но не все. Я этому рада, потому что есть место для размышлений, а ответ где-то на кончиках пальцев.

Код с урока

import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Counter extends Actor
{
    public void act() 
    {
        setImage(new GreenfootImage(
            "Score: " + Ant.power + 
            " Has food: " + Grass.hasFood +
            " Needs food: " + Ant.needFood
   
            ,24, Color.ORANGE, Color.GRAY));
    }    
}

-----------------------------------------------
public class Ant extends Actor
{
    static int power = 1;
    static boolean needFood = false;
    /**
     * Act - do whatever the Ant wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() 
    {
        move();
        searchFood();

     }
      
    
    public void searchFood(){
        Food myFood = (Food) getOneIntersectingObject(Food.class);
        if (myFood != null){
            if (myFood.weight <= power){
                myFood.jumpOn(getX(), getY()); 
                if (myFood.atHome()){
                    myFood.disappear(); 
                }
            }else {
                needFood = true;
            }
        }
    }
    
    public void move(){
        int y = getY();
        int x = getX();
        if(Greenfoot.isKeyDown("DOWN")){
            setRotation(90);
            y+=5;}
        if(Greenfoot.isKeyDown("UP")){    
            setRotation(270);
            y-=5;}
        if(Greenfoot.isKeyDown("RIGHT")){
            setRotation(0);
            x+=5;}
        if(Greenfoot.isKeyDown("LEFT")){    
            setRotation(180);
            x-=5;}
        setLocation(x, y);
    }
}
-----------------------------------------------
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Домик муравья
 * 
 * @author Aleksandra 
 * @version 2.0
 */
public class Grass extends Actor
{
    static int hasFood = 0;

    public Grass(){
        getImage().scale(100, 100);
    }
    
    public void act() 
    {
    }    
    
    public void updateCounter(){
        if (Ant.needFood){
            Ant.power += hasFood;
            hasFood = 0;
            Ant.needFood = false;
        }
    }
}

-----------------------------------------------
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Food here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Food extends Actor
{
    public int weight; 
    
    public Food(){
        weight = 1;
    }
    
    public void act() 
    {
        //if (atHome()){
          //  disappear(); 
        //}
    }

    public void jumpOn(int x, int y){
        setLocation(x, y);
    }

    public void disappear(){
        Grass.hasFood += this.weight;
        updateCounter();
        getWorld().removeObject(this);
        //getImage().clear();
    }
    
    public void updateCounter(){
        if (Ant.needFood){
            Ant.power += Grass.hasFood;
            Grass.hasFood = 0;
            Ant.needFood = false;
        }
    }    
    
    public boolean atHome(){
        Grass home = (Grass) getOneIntersectingObject(Grass.class);
        if (home != null){
            return true;
        }else{
            return false;
        }
    }
}

пʼятниця, 13 листопада 2020 р.

Java для детей 3. Наследование

Все знания произошли от яблока. 

Сейчас расскажу, почему. Сколько будет 1 + 2? Не знаете? А сколько будет одно яблоко плюс два яблока? А если у меня одно яблоко, а у тебя 2 яблока. Я тебе дам своё. Сколько яблок у тебя будет? Теперь понятнее, правда? Всех в детстве учили на яблоках, и не понятно, были бы мы такими же способными, если бы не они. Пример на грушах - уже не то.

Недолго думая, решила, что наследование в Java стоит объяснять именно на яблоках. 

У нас была большая груша и маленький муравей. Идея урока состояла в том, чтоб научить муравья есть не только грушу, а еще и другую еду. Также хотелось сделать мир более пропорциональным. 

Стали думать и гадать, как нам код реализовать, да так, чтоб не дублировать.


К великому прародителю 

Дети предложили повторяемые части кода перенести в класс муравья. Звучит неплохо: муравей совершает акт поедания, и честно, чтоб его класс заведовал едой. 

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

Появилась идея создать то самое яблоко, а для поедания вызывать метод груши. Вскоре, мы и пришли к необходимости наследования.


Все в мире относительно

Яблоко создали как элементарную еду весом в 1 (килограмм, слон, поинт, или в чем вы там считаете на вашем проекте). Грушу сделали наследником яблока с весом 2. Размеры фруктов на картинках примерно так и выглядят. 

Раз уже и вес добавили, пришлось добавить силу муравья, говорящую о его грузоподъемности. Изначально она равна 1 и справедливости ради не может он принести домой грушу без подкрепления. 


Место для фантазии

Когда вела Scratch у 10-12 леток, было очень весело наблюдать за тем, как они творят свой мир игры с актерами, которых выбрали. Они даже не спрашивали разрешения: "У вас там бегает котик за мышкой. Можно ли я сделаю, чтоб бегал тигр за конем?". Они просто делали что, хотели и вышло прикольно. 

В современной группе у меня только мальчики, которым 11-13 лет, и прям с первого урока ощущается, что я имею дело с серьезными парнями. Я им предлагала фантазировать, выбрать картошку фри вместо моей груши, а они сопротивлялись. Хотя кто-то из уважения к моей просьбе таки взял что-то другое. 

Проблема в том, что теперь я жалею об этом. С каждым уроком кода становится больше, и не у всех он одинаковый. Когда ищешь ошибку, да и вообще, удобно общаться одинаковыми понятиями, а не уточнять отдельно для разных учеников, что вместо моей груши, у тебя картошка, и логика работала бы, если в этом месте учёл то-то. 


Домашнее задание

  1. Поменять в коде вес груши на 1, яблока на 3, и проверить, что логика все еще правильно работает.
  2. Добавить новые яблоки-груши на экран и убедится, что логика работает для многих элементов. 
  3. Подумать и предложить варианты, как накапливать еду и ее есть, чтоб мочь поднять тяжелую еду.


Код с урока

public class Food extends Actor

{

    protected int weight;

    public Food(){

        weight = 1;

    }

    public void jumpOn(int x, int y, int size){

        setLocation(x, y+7);

    }

    public void disappear(Food food){

        getWorld().removeObject(food);

    }

}


public class FoodPair extends Food
{
    public FoodPair(){
        weight = 2;
    }

}

 В классе муравья добавили переменную его силы power и усовершенствовали метод подъема еды добавив условие:

if (myFood.weight <= power){...}

            

субота, 24 жовтня 2020 р.

Java4Kids 2

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


Задача урока

Стартовая точка: поле с муравьем, который умеет двигаться по нажатию стрелочек на клавиатуре.

Надо реализовать: добавить 2 объекта: 1 вид еды (грушу) и дом муравья (травку).
    Когда муравей подползает к еде, он ее берет и несет в дом, где она скрывается.

Время урока: 1.5 часа.

Обсудить с детьми

  1. Вспомнить, как делать создание объекта, что такое конструктор и показать, как работает код внутри конструктора.

    Реализация: в конструкторе задавать размер травки-домика.

  2. Проговорить с детьми план захвата груши муравьем, где писать код, какому объекту он будет принадлежать.

    Реализация: дети сами предложили где и что писать. Сделали, но не все сработало. Подумали о причинах, почему что-то не работает или почему работает что-то неожиданно. Обсудили, что триггер выполнения кода кроется в "цикле" нажатия на кнопки клавиатуры, поэтому ручной цикл писать не надо.

  3. Предложить детям самим написать код, аналогичный уже созданному.

    Реализация: Для захвата груши использовали метод пересечения объектов. Для того, чтоб положить грушу в дом, необходим тот же метод. Я показала код, который прячет объект, а сопутствующий код дети должны написать сами в качестве домашнего задания.


Что прошло хорошо

  • Один ученик моментально взялся делать самостоятельное задание и даже предложил лучшее место его разместить, чем я предлагала.
  • Отсутствующие ранее смотрели видео с первого урока, и это позволило им быстро выполнить нехватающий код.


Что было не очень хорошо

  • Как всегда проблемы со связью. У одного ребенка плохо работал Zoom.
  • Все же было бы лучше, если бы все, кого не было раньше, выполнили задание дома, чтоб мы не тратили лишнее время на уроке. Урок продолжался 2 часа вместо 1.5. 

Код в студию:

import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Ant extends Actor
{
    /**
     * Act - do whatever the Ant wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() 
    {
        // Add your action code here.
        move();
        
        Fries fries = (Fries) getOneIntersectingObject(Fries.class);
        if (fries!=null){
            fries.jumpOn(getX(), getY());
        }
        //TODO: аналогично пересечь траву и картошку-фри, 
        // чтоб cпрятать картошку-фри fries.getImage().clear();
    }  
    
    public void move(){
        int y = getY();
        int x = getX();
        if(Greenfoot.isKeyDown("DOWN")){
            setRotation(90);
            y+=5;}
        if(Greenfoot.isKeyDown("UP")){    
            setRotation(270);
            y-=5;}
        if(Greenfoot.isKeyDown("RIGHT")){
            setRotation(0);
            x+=5;}
        if(Greenfoot.isKeyDown("LEFT")){    
            setRotation(180);
            x-=5;}
        setLocation(x, y);
    }
}

public class Grass extends Actor
{
    public Grass(){
        getImage().scale(100, 100);
    }
}

public class Fries extends Actor
{
    public void jumpOn(int x, int y){
        setLocation(x, y+57);
    }
}

субота, 17 жовтня 2020 р.

Java для детей

Время от времени знакомые родители, переживающие за будущее своих детей, меня спрашивают: "Куда отдать своего ребенка учить программирование?". Существует уже достаточно много курсов по робототехнике, радиотехнике и просто програмированию для детей в Киеве. Мне иногда попадаются вывески на глаза. Но что же насчет Java? Зачем ребенку учить какой-нибудь Scratch, если это "для простачков"?

Говоря по правде, я бы отговаривала родителей садить ребенка за сложный формальный язык программирования. В прошлом году я вела Python для деток и считаю это лучшим выбором на данный момент для тех, кто хочет заниматься мясо-кодом. Но недавно меня попросили вести именно Java. Как ни странно, первый урок детям понравился! =)


Как все прошло или как провести первый урок по Java

  • Знакомство:
рассказать о себе в веселой форме
  • ООП:
пофантазировать на тему, что если бы от мяча унаследовать класс круглой головы человека?
  • Свойства ООП:
соединить картинку с характеристикой композиции, агрегации, ассоциации и наследования. 

Презентация помогла осуществить вышесказанное.

А дальше мясокод!

Шучу. Я смухлевала, потому что все еще считаю, что детям в их 10-12 лет рано такое видеть. Поэтому мы скачали Greenfoot и создали приложение со стеной и муравьем, который по ней ползал после нажатия на кнопки клавиатуры. 


Доска с первого урока

Научилась работать с Greenfoot пользуясь туториалом. Конечно мы придумывали разные сюжеты и шутили на тему "муравей съест гроздь бананов, приведет своих друзей, они потом пойдут дальше и станут пожирать все на своем пути" и т.д. 


Ведь зачем программирование и кому нужна "жизнь моя жестянка", если она скучна?  

Что прошло хорошо?

  • Дети с пониманием отнеслись к пропаданию звука, спасибо, я благодарна.
  • Дети реагировали на шутки, и постоянно были со мной в комуникации. 
  • После рассказанного, дети почти правильно смогли повторить аналогичные действия для другого объекта.
  • Самое главное, это они стали думать о следующих действиях для своей программы!

Что бы я изменила?

  • Были маленькие неполадки с видео, пользовались бесплатным Zoom.
  • В презентации можно было не текстом писать, а картинками делать пункты, от которых отталкиваться рассказывая "о себе".
  • Хотелось быть более раскованной и легче общаться, но на первом уроке, да еще и онлайновском, так не всегда можно. 
  • Один мальчик похоже очень любит свой телефон, и когда тот попал ему в руки, мальчику пришлось отвлекаться. Телефон это зло!


неділя, 30 серпня 2020 р.

Вся правда про казку "Ріпка"

Передмова

Це є альтернативна версія відомої казки "Ріпка", яка розкриває істині помисли всіх її учасників. Користуйтесь цією версією, коли вам вже в печінках сидить банальний сюжет казки, а дитині треба щось розказувати.

-----------------------------------------------------------------------------------------------------------------------------

Ріпка. Вся правда

Був обідній час. Бабця каже діду:

- З чого мені борщ варити? Саму воду їстимеш з вареною морквою, капустою та буряком! Іди ріпу дістань, ту, що аж стирчить, така велика! І хронцю потім викопай!"

Нічого робити діду, довелось іти в город під палючим сонцем, вдень, коли він вже так сподівався відпочити в очікуванні обіду. 

Узяв він ріпку за зелений чуб: тягне руками, вперся ногами, але витягти не може. 

- Ууух! Ееех! Впав. Щоб було добре тій ріпці. 

Пішов дід кликати бабу на допомогу.

- Бабцю, йди, витягти допоможи! 

А баба вже й сама їсти хоче, чуж кроки й думає: 

- Нарешті дід прийшов, ріпу приніс. Але зась тобі! Знову руками розводить. Нічого без мене не може! Доведеться йти.

Пішли вони в город.

Взяв дід ріпку за зелений чуб, баба діда за плече. Тягнуть рукми, вперлись ногами, але витягти не можуть. Баба кличе:

- Йди дочко, йди, витягти ріпку допоможи!

Закотила донька очі, опустила руки та почала жалітись подругам:

- Ці баба й дід, такі вже старі, нічого без мене не можуть! Доведеться йти! 

Взяв дід ріпку за зелений чуб, баба діда за плече, донька бабу за спідницю. Тягнуть рукми, вперлись ногами, але витягти не можуть. 

Донька думає, кого ж покликати на допомогу? 

- Дівчата руки марати не хочуть, хлопців - одного покличеш, інший дізнається й образиться. Треба своїх кликати. 

Тупнула на собаку, та й прокинулась. 

- Йди Жучко, допоможи, а я тебе погладжу.

Взяв дід ріпку за зелений чуб, баба діда за плече, донька бабу за кофтину, Жучка доньку за спідницю. Тягнуть рукми, вперлись ногами, але витягти не можуть. 

Жучка собі й мислить:

- Кіт у нас лінивий, але розумний, він щось та й вигалає! Котику Мурчику, йди, витягти ріпку допоможи!

Взяв дід ріпку за зелений чуб, баба діда за плече, донька бабу за кофтину, Жучка доньку за спідницю, Мурчик Жучку за хвоста. Тягнуть рукми, вперлись ногами, але витягти не можуть. 

Тут кіт згадав про мишу:

Ми же на початку літа домовились, що я лежу на сонечку, відпочиваю, а миша на подвір'я носа не сує. Бо як суне, то я її цап! Йди мишо, допоможи, бо кінець нашій домовленості буде!

Почула нявкання кота миша, злякалась і аж відпустила корінь ріпки. Каже своїм трьохстам діточкам: 

- Як тільки всі почнуть ріпку тягти, то ви перестаньте її тримати та гризти, хутко біжіть на грядку з кукурудзою, там ми й поживимось!

О мышах и людях на полях Украины

Взяв дід ріпку за зелений чуб, баба діда за плече, донька бабу за кофтину, Жучка доньку за спідницю, Мурчик Жучку за хвоста, миша котика за лапку. Тягнуть рукми, вперлись ногами, а ріпка взяла і аж вистрибнула з землі! Зраділи тут усі. Котик подякував миші й промуркав, що тепер вона може ні про що не переживати. 

Ось казочці кінець, а хто їв борщ із ріпою - молодець!