субота, 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){...}