Санкт-Петербургский Национальный Исследовательский Университет
Информационных Технологий, Механики и Оптики
ФКТиУ, кафедра Вычислительной техники
Лабораторная работа №2
по дисциплине
«Программирование»
Вариант -
Выполнил:
Санкт-Петербург
2017 г.
На основе базового класса Pokemon написать свои классы для заданных видов покемонов. Каждый вид покемона должен иметь один или два типа и стандартные базовые характеристики:
- очки здоровья (HP) атака (attack) защита (defense) специальная атака (special attack) специальная защита (special defense) скорость (speed)
Классы покемонов должны наследоваться в соответствии с цепочкой эволюции покемонов. На основе базовых классов PhysicalMove, SpecialMove и StatusMove реализовать свои классы для заданных видов атак.
Атака должна иметь стандартные тип, силу (power) и точность (accuracy). Должны быть реализованы стандартные эффекты атаки. Назначить каждому виду покемонов атаки в соответствии с вариантом. Уровень покемона выбирается минимально необходимым для всех реализованных атак.
Используя класс симуляции боя Battle, создать 2 команды покемонов (каждый покемон должен иметь имя) и запустить бой.
Базовые классы и симулятор сражения находятся в jar-архиве. Документация в формате javadoc - в zip-архиве.
Информацию о покемонах, цепочках эволюции и атаках можно найти на сайтах http://poke-universe. ru, http://, http:///dex/pokemon
Вариант

+Pokemon |
#name: String -types: Type[] -moves:Move[] -preparedMove: Move -stage: Efffect -condition: Effect -effects: List<Effect> -confusion: int #level: int -base: double[] |
+Pokemon(String) +setStats(double, double, double, double, double, double): void {final} +getStat(Stat): double {final} +hasType(Type): Boolean {final} +addEffect(Effect): void {final} ~setCondition(Effect): coid {final} +confuse(): void +restore(): void {final} +getHP(): double +setMod(Stat, int): void {final} +getTypes(): Type[] {final} +getLevel(): int {final} -getAttackChance(): double +prepareMove(): void {final} +isAlive(): boolean {final} +attack(Pokemon): Boolean +turn(): void {final} +win(Pokemon): void #setType(Type…): void{final} #setMove(Move…): void {final} #getPreparedMove(): Move {final} +toString(): String |
+Klefki | ||
+Klefki(String, int) | ||
+Ferroseed | +Ferrothorn | |
+Ferroseed(String, int) | +Ferrothorn(String, int) | |
+Slakoth | +Vigoroth | +Slaking |
+Slakoth(String, int) | +Vigoroth(String, int ) | +Slaking(String, int) |
+Battleground |
+main(String[]):void {static} |
Klefki. java
import ru. ifmo. se. pokemon.*;
public class Klefki extends Pokemon{
public Klefki (String name, int lvl) {
super (name, lvl);
setStats(57,80,91,80,87,75);
setType(Type. STEEL, Type. FAIRY);
setMove(new Psychic(), new FoulPlay(), new FairyWind(), new CalmMind());
}
}
class Psychic extends SpecialMove {
public Psychic () { super(Type. PSYCHIC,90,1.0); }
protected void applyOppEffects (Pokemon p) {
if (Math. random() < 0.1) p. setMod(Stat. SPECIAL_DEFENSE,-1);
}
}
class FoulPlay extends PhysicalMove {
public FoulPlay () { super(Type. DARK,95,1.0); }
}
class FairyWind extends SpecialMove {
public FairyWind () { super(Type. FAIRY,40,1.0); }
}
class CalmMind extends StatusMove {
public CalmMind () { super(Type. PSYCHIC,0,0); }
@Override
protected boolean checkAccuracy(Pokemon att, Pokemon def) {
return true;
}
protected void applySelfEffects(Pokemon p) {
p. setMod(Stat. SPECIAL_ATTACK,1);
p. setMod(Stat. SPECIAL_DEFENSE,1);
}
}
Ferroseed. java
import ru. ifmo. se. pokemon.*;
public class Ferroseed extends Pokemon {
public Ferroseed (String name, int lvl) {
super (name, lvl);
setStats(44,50,91,24,86,10);
setType(Type. GRASS, Type. STEEL);
setMove(new MirrorShot(), new PoisonJab(), new EnergyBall());
}
}
class MirrorShot extends SpecialMove {
public MirrorShot () { super(Type. STEEL,65,0.85); }
protected void applyOppEffects (Pokemon p) {
if (Math. random() < 0.3) p. setMod(Stat. ACCURACY,-1);
}
}
class PoisonJab extends PhysicalMove {
public PoisonJab () { super(Type. POISON,80,1.0); }
protected void applyOppEffects (Pokemon p) {
if (Math. random() < 0.3){
Effect. poison(p);
}
}
}
class EnergyBall extends SpecialMove {
public EnergyBall () { super(Type. GRASS,90,1.0); }
protected void applyOppEffects (Pokemon p) {
if (Math. random() < 0.1) p. setMod(Stat. SPECIAL_DEFENSE,-1);
}
}
Ferrothorn. java
import ru. ifmo. se. pokemon.*;
public class Ferrothorn extends Ferroseed {
public Ferrothorn(String name, int lvl) {
super(name, lvl);
setStats(74,94,131,54, 116,20);
setMove(new MirrorShot(), new PoisonJab(), new EnergyBall(), new Thunder());
}
}
class Thunder extends SpecialMove {
public Thunder () { super(Type. ELECTRIC,110,0.7); }
protected void applyOppEffects (Pokemon p) {
if (Math. random() < 0.3){
Effect e = new Effect();
e. condition(Status. PARALYZE);
p. setCondition(e);
}
}
}
Slakoth. java
import ru. ifmo. se. pokemon.*;
public class Slakoth extends Pokemon{
public Slakoth (String name, int lvl) {
super (name, lvl);
setStats(60,60,60,35,35,30);
setType(Type. NORMAL);
setMove(new ShadowBall(), new Confide());
}
}
class ShadowBall extends SpecialMove {
public ShadowBall () { super(Type. GHOST,80,1.0); }
protected void applyOppEffects (Pokemon p) {
if (Math. random() < 0.2) p. setMod(Stat. SPECIAL_DEFENSE,-1);
}
}
class Confide extends StatusMove {
public Confide () { super(Type. NORMAL,0,0); }
@Override
protected boolean checkAccuracy(Pokemon att, Pokemon def) {
return true;
}
protected void applyOppEffects (Pokemon p) {
p. setMod(Stat. SPECIAL_ATTACK,-1);
}
}
Vigoroth. java
import ru. ifmo. se. pokemon.*;
public class Vigoroth extends Slakoth {
public Vigoroth (String name, int lvl) {
super(name, lvl);
setStats(80,80,80,55,55,90);
setMove(new ShadowBall(), new Confide(), new Slash());
}
}
class Slash extends PhysicalMove {
public Slash() {
super(Type. NORMAL, 70, 1.0);
}
@Override
protected double calcCriticalHit(Pokemon att, Pokemon def) {
if (att. getStat(Stat. SPEED) / 64.0 > Math. random()) {
System. out. println("Критический удар!");
return 2.0;
} else {
return 1.0;
}
}
}
Slaking. java
import ru. ifmo. se. pokemon.*;
public class Slaking extends Vigoroth {
public Slaking (String name, int lvl) {
super(name, lvl);
setStats(150,160,100,95,65,100);
setMove(new ShadowBall(), new Confide(), new Slash(), new IceBeam());
}
}
class IceBeam extends SpecialMove {
public IceBeam() { super(Type. ICE,90,1.0); }
protected void applyOppEffects (Pokemon p) {
if (Math. random() < 0.1){
Effect. freeze(p);
}
}
}
Battleground. java
import ru. ifmo. se. pokemon.*;
public class Battleground {
public static void main(String[] args) {
Battle b = new Battle();
b. addAlly(new Ferroseed("Christopher", 30));
b. addAlly(new Slaking("Mark", 1));
b. addAlly(new Klefki("James", 27));
b. addFoe(new Ferrothorn("Francesco", 30));
b. addFoe(new Slakoth("Slava", 1));
b. addFoe(new Vigoroth("Viktor", 23));
b. go();
}
}
Ferroseed Christopher из команды полосатых вступает в бой!
Ferrothorn Francesco из команды красных вступает в бой!
Ferrothorn Francesco атакует.
Критический удар!
Ferroseed Christopher теряет 1 здоровья.
Ferroseed Christopher не замечает воздействие типа POISON
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 4 здоровья.
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 8 здоровья.
Ferroseed Christopher парализован
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 3 здоровья.
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 4 здоровья.
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 2 здоровья.
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 1 здоровья.
Ferroseed Christopher не замечает воздействие типа POISON
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 4 здоровья.
Ferrothorn Francesco уменьшает точность.
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 7 здоровья.
Ferroseed Christopher уменьшает точность.
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 1 здоровья.
Ferrothorn Francesco не замечает воздействие типа POISON
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 5 здоровья.
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 3 здоровья.
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 5 здоровья.
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 1 здоровья.
Ferrothorn Francesco не замечает воздействие типа POISON
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 4 здоровья.
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 3 здоровья.
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 4 здоровья.
Ferroseed Christopher уменьшает специальную защиту.
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 3 здоровья.
Ferrothorn Francesco уменьшает специальную защиту.
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 4 здоровья.
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 1 здоровья.
Ferrothorn Francesco не замечает воздействие типа POISON
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 2 здоровья.
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 2 здоровья.
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 1 здоровья.
Ferroseed Christopher не замечает воздействие типа POISON
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 2 здоровья.
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 2 здоровья.
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 1 здоровья.
Ferrothorn Francesco не замечает воздействие типа POISON
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 4 здоровья.
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 3 здоровья.
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 4 здоровья.
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 2 здоровья.
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 3 здоровья.
Ferroseed Christopher атакует.
Критический удар!
Ferrothorn Francesco теряет 1 здоровья.
Ferrothorn Francesco не замечает воздействие типа POISON
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 3 здоровья.
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 1 здоровья.
Ferrothorn Francesco не замечает воздействие типа POISON
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 1 здоровья.
Ferroseed Christopher не замечает воздействие типа POISON
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 1 здоровья.
Ferrothorn Francesco не замечает воздействие типа POISON
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 6 здоровья.
Ferroseed Christopher атакует.
Ferrothorn Francesco теряет 2 здоровья.
Ferrothorn Francesco атакует.
Ferroseed Christopher теряет 5 здоровья.
Ferroseed Christopher теряет сознание.
Slaking Mark из команды полосатых вступает в бой!
Slaking Mark атакует.
Критический удар!
Ferrothorn Francesco теряет 13 здоровья.
Ferrothorn Francesco атакует.
Slaking Mark теряет 20 здоровья.
Slaking Mark атакует.
Критический удар!
Ferrothorn Francesco теряет 17 здоровья.
Ferrothorn Francesco атакует.
Slaking Mark теряет 14 здоровья.
Slaking Mark атакует.
Критический удар!
Ferrothorn Francesco теряет 21 здоровья.
Ferrothorn Francesco теряет сознание.
Slakoth Slava из команды красных вступает в бой!
Slaking Mark атакует.
Slakoth Slava теряет 31 здоровья.
Slakoth Slava атакует.
Slaking Mark теряет 1 здоровья.
Slaking Mark не замечает воздействие типа GHOST
Slaking Mark атакует.
Slakoth Slava уменьшает специальную атаку.
Slakoth Slava атакует.
Slaking Mark теряет 1 здоровья.
Slaking Mark не замечает воздействие типа GHOST
Slaking Mark атакует.
Slakoth Slava теряет 28 здоровья.
Slakoth Slava атакует.
Slaking Mark уменьшает специальную атаку.
Slaking Mark атакует.
Критический удар!
Slakoth Slava теряет 43 здоровья.
Slakoth Slava теряет сознание.
Vigoroth Viktor из команды красных вступает в бой!
Slaking Mark атакует.
Vigoroth Viktor уменьшает специальную атаку.
Vigoroth Viktor атакует.
Критический удар!
Slaking Mark теряет 36 здоровья.
Slaking Mark атакует.
Vigoroth Viktor теряет 36 здоровья.
Vigoroth Viktor атакует.
Slaking Mark уменьшает специальную атаку.
Slaking Mark атакует.
Vigoroth Viktor не замечает воздействие типа GHOST
Vigoroth Viktor атакует.
Slaking Mark уменьшает специальную атаку.
Slaking Mark атакует.
Критический удар!
Vigoroth Viktor теряет 45 здоровья.
Vigoroth Viktor теряет сознание.
В команде красных не осталось покемонов.
Команда полосатых побеждает в этом бою!
Выводы: в процессе выполнения лабораторной работы были получены
навыки использования объектно-ориентированного подхода
программирования.


