public class Bomba extends GraphicsProgram { public static final int WINDOW_SIZE = 500; public static final int FIELD_SIZE=10; public static final int MASHTAB=50; public static final int SPEED=5; public static final GImage bombs[]=new GImage[10]; public static final int count[]=new int[10]; public static final int countPl[]=new int[10]; public static final GImage fire[][]=new GImage[10][18]; public static final int countFire[]=new int[10]; public static final GRect block[]=new GRect[20];
private int kolvoKvadr=16; private GLabel lifeL1,lifeL2; private int life1=3,life2=3; private int explode1Length=2,explode2Length=3; private int bomb1=0,bomb2=0; private int bomb1Max=5,bomb2Max=5; private int lol1; private int lol2; private int dX1,dX2,dY1,dY2; private GImage player1; private GImage player2;
private Random random = new Random(); }
Знаете такую игру бомберы? Ну вот тут по сути основная оболочка игрового процесса. Осталось только ещё понакидать разрушаемые ящики и апгрейды в них. А всё передвижение, блоки, взаимодействие с бомбами уже реализовано. В первый день это было интересно. Сегодня это уже просто сложно. Мб просто я болею и мало хаваю, а это сразу настроение не оч.
Добавлено (24.11.2012, 02:56) --------------------------------------------- Это пиздец... тут буквально несколько страниц, сколько же Скайнет въебывал хз, после этого можно точно сказать, что карту делать не стоит.
Ок, тогда я не делаю английский, украинский, матанализ. дискретную математику, не хожу на физру.
Въебывал весь день, хоть и суббота. Зато доделал. Реализована вся хуйня, кроме красивой графики. Ну первоначальное поле также рисуется вручную, ибо рандомом будет хуйня.
public class Bomba extends GraphicsProgram { public static final int WINDOW_SIZE = 500; public static final int FIELD_SIZE=10; public static final int MASHTAB=50; public static final int SPEED=5; public static final GImage bombs[]=new GImage[10]; public static final int count[]=new int[10]; public static final int countPl[]=new int[10]; public static final GImage fire[][]=new GImage[10][18]; public static final int countFire[]=new int[10]; public static final GRect block[]=new GRect[20]; public static final GRect box[]=new GRect[100]; public static final GImage prize[]=new GImage[100]; public static final int prizeType[]=new int [100];
//Initialising; public void init(){ this.setSize(WINDOW_SIZE+150,WINDOW_SIZE); createField(); addPlayers(); addKeyListeners(listener); lifeL1=new GLabel("Жизни первого: "+life1); lifeL2=new GLabel("Жизни второго: "+life2); add(lifeL1,510,50); add(lifeL2,510,100); immuneBlocks(); notImmuneBlocks(); //скорость бега для первого run1.schedule(leha1(), 0, speed1);
//cкорость бега для второго run2.schedule(leha2(), 0, speed2);
KeyListener listener = new KeyListener(){ @Override public void keyTyped(KeyEvent e) {} @Override public void keyReleased(KeyEvent e) { switch(e.getKeyCode()){ case 39: case 37: dX1 = 0; dY1=0; break; case 38: case 40: dY1 = 0; dX1=0; } switch(e.getKeyChar()){ case 'ф': case 'в': dX2=0; dY1=0; break; case 'ц': case 'ы': dY2=0; dX1=0; } } @Override public void keyPressed(KeyEvent e){ // 32 пробел, 10 энтер switch(e.getKeyCode()){ case 37: if(dX1==1){dX1-=2;} else if (dX1==0) {dX1--;} lol1=1; break; case 38: if(dY1==1){dY1-=2;} else if (dY1==0) {dY1--;} lol1=0; break; case 39: if(dX1==-1){dX1+=2;} else if (dX1==0) {dX1++;} lol1=1; break; case 40: if(dY1==-1){dY1+=2;} else if (dY1==0) {dY1++;} lol1=0; break; case 10: bomb(1); break; case 32: bomb(2); } switch(e.getKeyChar()){ case 'ф': if(dX2==1){dX2-=2;} else if (dX2==0) {dX2--;} lol2=1; break; case 'ц': if(dY2==1){dY2-=2;} else if (dY2==0) {dY2--;} lol2=0; break; case 'в': if(dX2==-1){dX2+=2;} else if (dX2==0) {dX2++;} lol2=1; break; case 'ы': if(dY2==-1){dY2+=2;} else if (dY2==0) {dY2++;} lol2=0; } } };
//Взрывает бомбу через время Timer timer2 = new Timer(); TimerTask mainTask2 = new TimerTask(){ @Override public void run(){ for(int i=0; i<bombs.length; i++){ if (count[i]!=0) {count[i]--; if(count[i]==0) { playAnimation(bombs[i],countPl[i]); countCurrentBomb--; remove(bombs[i]); bombs[i]=null; if (countPl[i]==1) bomb1--; else bomb2--; } }
} } };
//Убирает огонь через время Timer timer3 = new Timer(); TimerTask mainTask3 = new TimerTask(){ @Override public void run(){ for(int i=0; i<countFire.length; i++){ if(countFire[i]!=0){ countFire[i]--; if(countFire[i]==0){ for(int l=0; l<18; l++){ if(fire[i][l]!=null){ remove(fire[i][l]); fire[i][l]=null; } else break; } } } } } };
//Рисует огонь и запускает проверки на пересечение с блоком или игроком private void playAnimation(GImage bomb,int player){ int k,n=0,explode,mnog=1,mnog1=1; boolean mognoPlus=true,mognoMinus=true; for(k=0; k<10;){ if (fire[k][0]==null) break; else k++; } if(player==1)explode=explode1Length; else explode=explode2Length; for(int i=0; i<=explode; i+=mnog,mnog1*=-1,mnog=(mnog+mnog1*(-1))*(-1)){ if(((bomb.getX()-1)+i*50)>=0 && ((bomb.getX()-1)+i*50)<=(WINDOW_SIZE-MASHTAB)){
//Метод описывает как огонь убивает разрушаемый блок. private void destroyBox(GRect box, int i){ addPrize(box); remove(box); for(int k=i+1; k<countBox; k++){ this.box[k-1]=this.box[k]; } countBox--; }
private void addPrize(GRect box){ int n=1+random.nextInt(2); if(n==1){ n=1+random.nextInt(4); switch(n){ case 1:{ n=countPrize; prize[n]=new GImage("plusBomb.png",box.getX(),box.getY()); countPrize++; prizeType[n]=1; add(prize[n]); break; } case 2:{ n=countPrize; prize[n]=new GImage("plusHealth.png",box.getX(),box.getY()); countPrize++; prizeType[n]=2; add(prize[n]); break; } case 3:{ n=countPrize; prize[n]=new GImage("plusRadius.png",box.getX(),box.getY()); countPrize++; prizeType[n]=3; add(prize[n]); break; } case 4:{ n=countPrize; prize[n]=new GImage("plusSpeed.png",box.getX(),box.getY()); countPrize++; prizeType[n]=4; add(prize[n]); } } }
}
//Проверяет не появится ли огонь на блоке. private boolean checkFireBlock(double x, double y){ for(int i=0; i<16; i++){ if(block[i].getX()-1==x && block[i].getY()-1==y) return false; } return true; }
//Даёт награду игроку за поднятый итем. private void givePrize(int player,int nomer){ if(player==1){ switch(prizeType[nomer]){ case 1: if(bomb1Max!=5) bomb1Max++; break; case 2: if(life1!=3) {life1++; table();} break; case 3: if(explode1Length!=4)explode1Length++; break; case 4: if(speed1!=5) {speed1--; run1.cancel(); run1=new Timer(); run1.schedule(leha1(), speed1, speed1);} } } else switch(prizeType[nomer]){ case 1: if(bomb2Max!=5) bomb2Max++; break; case 2: if(life2!=3) {life2++; table();} break; case 3: if(explode2Length!=4)explode2Length++; break; case 4: if(speed2!=5) {speed2--; run2.cancel(); run2=new Timer(); run2.schedule(leha2(), speed1, speed2);} } remove(prize[nomer]); for(int i=nomer; i<countPrize-1; i++){ prize[i]=prize[i+1]; prizeType[i]=prizeType[i+1]; } countPrize--;
private int speed1=10,speed2=10; private int countPrize=0; private int countCurrentBomb=0; private int countBox; private int kolvoKvadr=0; private GLabel lifeL1,lifeL2; private int life1=3,life2=3; private int explode1Length=1,explode2Length=1; private int bomb1=0,bomb2=0; private int bomb1Max=1,bomb2Max=1; private int lol1; private int lol2; private int dX1,dX2,dY1,dY2; private GImage player1; private GImage player2;
private Random random = new Random(); }
665 строк кода за 3 дня. хороший высер Принцесса
Сообщение отредактировал kebal - Воскресенье, 25.11.2012, 02:33
Ну это не форум программистов, хотя там просто помогать не будут)) Ну если есть желание искать ошибки в коде, то playerX.move(d??, d??); Когда ты делал код, не посещала идея, что копирование строчек кода, это, как странно... Есть такая вещь, как функция, она сократит твой код где то строчек 100. [VnGF]Ciklop.
Нихуя. Когда препод сегодня говорит: Сколько у тебя строк в коде? Я говорю, там с движением у меня в два раза больше, чем должно быть, поэтому по идее раза в полтора меньше, чем вы тут видите. Поэтому идите нахуй. Какая функциональность? Оно бы только визуально было бы меньше. А так оно что первый, что второй вызывает только по вызову.
Добавлено (26.11.2012, 22:56) --------------------------------------------- ciklopper, это можно сделать иначе, чем передавать методу дохуя параметров? и тогда он будет подставлять эти параметры, например первый Player, второй это строка lol которая переделывается либо в lol1 либо в lol2 и так для каждого параметра?
Ну блин, ты же знаешь что такое ООП. Вот в данном случае ты им не пользуешься и так прогать грешно=) Смысл вот в чем у тебя мув.плэир 1, 2, вверх, вниз, право, лево, лень вникать в код, но ты это делаешь повторяя 2 разных кода по 4ре раза! Вместо этого можно создать 2 функции которой будут передаваться определенные параметры, тем саммым уменьшая код и делая возможность усовершенствования программы. Вот ты сейчас себе вбил, что у меня 2 игрока. А если их сделать 4? То у тебя код увеличится в 1.5 раза??? А если 8 игроков(не вдумываясь про клаву). То всё прога растёт на глазах и мы ловим полный пиздец! Хотя у обычного прогера с добавлением еще 1го игрока добавилось пару строк. Прогать функциями придётся всегда и в любом языке без этого в сложных прогах не обойтись, защищу диплом выложу свою прогу. [VnGF]Ciklop.
Нихуя. Когда препод сегодня говорит: Сколько у тебя строк в коде? Я говорю, там с движением у меня в два раза больше, чем должно быть, поэтому по идее раза в полтора меньше, чем вы тут видите. Поэтому идите нахуй. Какая функциональность? Оно бы только визуально было бы меньше. А так оно что первый, что второй вызывает только по вызову. Добавлено (26.11.2012, 22:56) --------------------------------------------- ciklopper, это можно сделать иначе, чем передавать методу дохуя параметров? и тогда он будет подставлять эти параметры, например первый Player, второй это строка lol которая переделывается либо в lol1 либо в lol2 и так для каждого параметра?
какая нахуй разница, я повторюсь - код нихуя не граммотный, + не выёбывайся, гы
Добавлено (20.12.2012, 01:49) --------------------------------------------- ciklopper, слышишь, умник. Task для Timera по сути создается единожды и работает дальше. В таске соответственно dx1, dy1 для первого игрока и dx2, dy2 для второго игрока. По ходу игры они постоянно изменяются, а вот сам Task нет. Соответственно при запуске этого Task я смогу передать эти dx и dy только вначале. Соответственно когда dx и dy будут меняться, сам Task это нихуя колыхать не будет, и он соответственно работать не будет, так как первоначальные значения dx и dy передаваемые в метод были равны 0.