forum.ge
reklama
FORUM.GE წესები  · დახმარება  · ძებნა  · წევრები  · კალენდარი  · ჩატი
  გამოხმაურება · ახალი თემა · ახალი გამოკითხვა

> ჩემი თამაში
VakhoQor
Super Member


****
ჯგუფი: Registered
წერილები: 470
წევრი No.: 121774
რეგისტრ.: 29-September 10

გამოგზავნილია: 15 Aug 2011, 11:51  #26912679      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
user posted image


ალგორითმის პრინციპი შემდეგნაირია:

ა) თავიდან მაქვს 1 ცალი წერტილი, რომელსაც პიქსელებზე ვატარებ, დეფაულთან მიყენია მარჯვივ, ანუ თავიდანვე ფუნქცია R() გამოიძახება
ბ) წერტილების გადაადგილების პრინციპი შემდეგნაირია: მაგალითად მაქვს 3 ცალი წერტილი, მაშინ მესამე იკავებს მეორეს ადგილს, მეორე პირველის ადგილს ხოლო პირველი გადავა იმ მიმართულებაზე სადაც ჩვენ უთითებთ, ანუ დამოკიდებულია თუ რომელი ფუნქციაა გამოძახებული R(), l(), U() თუ D();

event.keyCode დან ვგებულობ თუ რომელ კნოპკას ვაწვები კლავიატურაზე, თუმცა Gnu/linux -ზე (+) და (-) კეი კოდები არ დაემთხვა, იქ სხვა კოდს მიგდებდა რომ დავტესტე, მერე აღარც ჩამისწორებია და არც ჩავძიებულვარ რადგად დრო არ მქონდა.

გ) თავიდანვე, როდესაც უკვე დოკუმენტი არის ჩატვირთული (loaded), პიქსელები წინასწარ განზმადებული მაქვს, რომლებიც იმალება ქვემოთა შავ ზოლში. ჩავთვალე რომ 200 საკმარისი იქნებოდა:

CODE

<script type="text/java[ertad]script">
   for( var i = 2; i <= 200; i++ )
       document.write( "<div id='" + i + "'>*</div>" );
</script>


თუმცა, შეგილიათ აქვე კოდშივე შეცვალოთ და მისცეთ ლიმიტი. 700 ც რომ მოსეთ პრობლემა არ აქვს, როდესაც i ური კოდი დაემატება შეჯახებისას, i+1-ე იდ ელემენტს ვაბამ მაინც.


ალგორითმი არის რეკურსიული და ყოველ ბიჯზე ვამოწმებ ხომ არ ვეჯახები ბომბს, ამას checkBoomb() ფუნქცია ამოწმებს.

ვდებ კოდს, თავისი დეტალური კომენტარებით.




CODE


<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<style>
.gveli_div {
   background:black;   padding:1px; margin:0px; border:1px solid black; width:525; height:25;
}

.gveli_div div {
   position:absolute; padding:0px; margin:10px; font-family:consolas;
}

</style>
<script>
var x=10, y=10;
var a,b,c,d;
var DefaulT=1; // თავიდანვე რომ რომელიმე მიმართლებით მიდიოდეს
var SpeedValue=400; // სიჩქარე სიარულის.
var r=10; // დაშორება წერტილებს შორის

var NewDivIsAlreadyCreated=false; // ჯერ არ დაგვიმატებია div -ი ბოლო ელემენტის ბოლოს (თუ 3 ელემენტია 3-ის ბოლოს უნდა იყოს ანუ 4-ე)
var CountAddedBoombs=0;
var Timing;
var checkisTrue=1;   // ქულების დასათვლელად ფუნქცია. თავიდან ქულა 0 უნდა იყოს მაგრამ ციკლში თავიდან -1-ს ხდის, თუ რატომ ქვემოთ წერია
var Congratulation=false; // bool-ტიპის ფინქცია
var x1=x+=r; var y1=y; // პირველი წერტილის კორდინატები

var i=2;
var temp;
var X="x"; var Y="y";



function snake()
{
    if(DefaulT==1)   //  თუ თავიდან იწყება, ჯერ კლავიატურის ღილაკებს არ შევხებივართ
    {  
    KeyID=39;
    boomb()  // პროგრამის დაწყებისთანავე გაუშვი ფუნცცია ბომბი. ეს ბომბი აგდებს იმ ერტილს, რომელსაც უნდა დავეჯახო.
    KeyCheck();
    DefaulT=0;  
    }
   document.getElementById("added").value=CountAddedBoombs;
         document.onkeydown=KeyCheck;     // როცა დავაწვებით კავიატურას  
             function KeyCheck(e)
         {
         
              if(DefaulT==0){ // თუ თავიდან აღარ იწყება
             
              /******We can do like this too;)*******************
            KeyID = (window.event) ? event.keyCode : e.keyCode;  
            event-ს თუ ვერ აღიქვამს ბრაუზერი, პარამეტრიდან გამოიყენოს  
            ****************************************************/
            e = e || window.event;
              KeyID =e.keyCode || e.charCode;
                }                      
               else{
               // დარჩეს  KeyID -რაც იყო;)
               }    
               
               /*########### რომელ ღილაკს არის დაჭერილი, იმის დასადგენად #########*/
                 if(KeyID==39)              R();  
                     if(KeyID==37)               L();  
                   if(KeyID==38)             U();
                     if(KeyID==40)             D();  
                     if(KeyID==107)    SpeedUp();
                     if(KeyID==109) SpeedDown();          
            }
           
         
}

function SpeedUp(){
     SpeedValue-=50;
}
function SpeedDown(){
     SpeedValue+=50;
}

function boomb(){
clearTimeout(Timing); // ორჯერ ერთდროულად რომ არ გაეშვას. ფუნქცია თუ იქნება ბევრჯერ გამოძახებული. ყოველ t ინტევალში
                                // გამოჩნდებ ახალი წერტილი. თუ ბობს ავიღბ გამოჩენიდან 2 წამში. შემდგომ კიდე დაიყება ათვლა და t წამი მექნება დრო.
 var n=Math.floor(Math.random()*500)
 var m=Math.floor(Math.random()*500)
 Bx1=n-n%10; document.getElementById("B").style.left=Bx1;
 By1=m-m%10; document.getElementById("B").style.top=By1;
 Timing=setTimeout("boomb()", 9000);  
 
    if(Congratulation==true){   // თუ ბომბს დავეჭახე მაშინ ==>
    checkisTrue++;                   // ქულა გამიზარდე
    document.getElementById("Values").value=checkisTrue;
    Congratulation=false;    
    }
    else{  // თუ არადა, ქულა შემიმცირე. ანუ თუ არ დაეყახე დააკლე ქულა.
    checkisTrue--;  // თავდაპირველად ბომბი ეშვება snake() ფუნქციიდან, ამიტომ თავიდან Congratulation==false,
                        // შესაბამისად -1 ქულა იწერება, ამის გამო ქულების ათვლა ზემოთ 1 იდან ვაიწყე. ინიცილიზებისას
                    // ქულების ცვლადის მნიშნელობა არის 1 -ის ტოლი: checkisTrue=1;
    document.getElementById("Values").value=checkisTrue;
    }
   
}


function crash(){

   if(CountAddedBoombs>0){
    CheckIfsnakeCrash=1;
    do{    
          CheckIfsnakeCrash++;
          if(x1==window[X+CheckIfsnakeCrash] && y1==window[Y+CheckIfsnakeCrash]){
             document.write("Game Over");
           break;
        }
        if((CheckIfsnakeCrash-1)==CountAddedBoombs){
        break;
        }
        } while(1);
    }

}


function checkBoomb(){  
   
   
  if(x1==Bx1 && y1==By1){   // თუ ბომბს დაეჯახა პირველი წერტილი , უნდა გადიდდეს გველი
  i=2+CountAddedBoombs   // აქ სულ თავიდან i=2-იანს, რანდგ CountAddedBoombs=0. რა საჭიროა ეს i?
                                  // i-იმისათვის არის საჭირო, რომ ფუნქცია RightNewX(), ... , DownNewY()-ებს ვუთხრათ, თუ რამდენჯერ
                         // დაატრიალოს ციკლი. რისთვის? 2-ი რატომ? ახალი ელემენტი ID-ით არის 2-ის ტოლი და ამიტომ.
                         
  NewDivIsAlreadyCreated=true;    // ეს ცვლადი იმისათვის რომ     ფუნქცია  ვუთხრა, R(), L(), U(),D()-ებს ვუთხრა , რომ
                                            //   ახალი დივი შექმნილია და დაიწყე მისი გამოყენებაც, უფროსწორად გამოძახება. მაგრამ საიდან უნდა
                                             //  გამოიძახოს? საიდან და      RightNewX(), ... , DownNewY()-ებიდან.                                        
  Congratulation=true;   // ანუ ბომბს დავეჯახეთ :)
  document.getElementById("added").value=++CountAddedBoombs;
  boomb();  // გამოიძახე ფუნქცია, იმისათვის რომ ახალ ბომბს ახალი მდებარეობა მივცეთ
  }
}


/*  ესენია RightNewX(), ... , DownNewY() ფუნქციები, რომელებიც ახალ div-ამატებენ ბოლოში.
   უფრო სწორედ კი, ახალ იდს კი არა, იმ ედებს რომლებიც <body> , .... , </body> ში ყრია, ერთ წერტილში */
   
function RightNewX(){
temp=i;
 do{
 window[X+i]=document.getElementById(i).style.left=(window[X+(i-1)]) // ბოლო ელემენტი ბოლოს წინას მნიშნელობებს იღებს,
 i--;
 if(i==1) break;  // სულ პირველი კი მიდის იქ სადაც მივუთითებთ.
 }while(1);
 i=temp;
}
function RightNewY(){
 temp=i;
 do{
 window[Y+i]=document.getElementById(i).style.top=(window[Y+(i-1)])
 i--;
 if(i==1) break;
 }while(1);
 i=temp;
}

function LeftNewX(){
temp=i;
do{
window[X+i]=document.getElementById(i).style.left=(window[X+(i-1)])
i--;
if(i==1) break;
}while(1);
i=temp;
}
function LeftNewY(){
 temp=i;
 do{
 window[Y+i]=document.getElementById(i).style.top=(window[Y+(i-1)])
 i--;
 if(i==1) break;
 }while(1);  
 i=temp;
}


function UpNewX(){
temp=i;
do{
window[X+i]=document.getElementById(i).style.left=(window[X+(i-1)])
i--;
if(i==1) break;
}while(1);
 i=temp;
}
function UpNewY(){
temp=i;
do{
window[Y+i]=document.getElementById(i).style.top=(window[Y+(i-1)])
i--;
if(i==1) break;
}while(1);
i=temp;
}

function DownNewX(){
temp=i;
 do{
 window[X+i]=document.getElementById(i).style.left=(window[X+(i-1)])
 i--;
 if(i==1) break;
 }while(1);
 i=temp;
}
function DownNewY(){
temp=i;
 do{
 window[Y+i]=document.getElementById(i).style.top=(window[Y+(i-1)])
 i--;
 if(i==1) break;
  }while(1);
 i=temp;
}

function R(){
       /**********************************************************************
       *learTimeOut-იმისათვის, რომ, 1) თუ ორჯერ ზედიზედ დავაწვები              *
       *მარჯვენა ისარს, ორჯერ გამოიძახება R()-ი და პუქსელების გაზრდა 2-ჯერ         *
       * ჩქარა მოხდება.2) ამასთან ერთად, როდესაც n() ფუნქციაა გაშვებული და         *
       * m()-ზე გადავდივარ, ამ დროს საჭიროა n()-ის გათიშვა - ან X-ები იცვლება      *
       *ფუნქციაში, ან Y-ები - თუ ორივე შეიცვალა ერთ გუნქციაში, ისეთი შემთხვევა      *
       *ინქება რომ , განა ვერტიკალურ-ჰორიზონტალურად ვივლით, არამედ მოვუხვევთ     *
       *როცა მოგვინება, სხვა სიტვებით რომ ვთქვათ 90 გრადუსით მობრუნება არ მოხდება. *                
       ************************************************************************/
clearTimeout(a); clearTimeout(b);
clearTimeout(c); clearTimeout(d);
if(x>500) x=10;
  crash();
 
 if(NewDivIsAlreadyCreated==true)  RightNewX();  
  x1=document.getElementById("1").style.left=x+=r;

   /********************************************************
  თუ 3 წერტილს ვიხილავთ: მარჯვივ მოხვევისას y1,y2,y3 უნდა გავუტოლოთ ერთმანეთს. y3 მა უნდა დაიკავოს
  y2-ის ადგილი, y2-მა y1-ის ადგილი, y1-მა კი რა უნდა ქნას?- არც არაფერი. რატომ?
  იმიტომ რომ მარჯვვ სიარული უნდა გაგრძელდეს y1-ის გასწვრივ.  
  *********************************************************/
 
 if(NewDivIsAlreadyCreated==true)   RightNewY();
  y1=document.getElementById("1").style.top=y;

  checkBoomb();
a=setTimeout("R()", SpeedValue)
}


function L(){
clearTimeout(a);
clearTimeout(b);
clearTimeout(c);
clearTimeout(d);
if(x<10) x=500;
  crash();
   /*აქ ყველაფერი იგივეა რაც R() ში გარდა იმისა რომ x1=(x-=r)-ს */
  if(NewDivIsAlreadyCreated==true)  LeftNewX();
  x1=document.getElementById("1").style.left=x-=r;
 
  if(NewDivIsAlreadyCreated==true)  LeftNewY();
  y1=document.getElementById("1").style.top=y;
  checkBoomb();
b=setTimeout("L()", SpeedValue)
}



function U(){
clearTimeout(a);
clearTimeout(b);
clearTimeout(c);
clearTimeout(d);
if(y<10) y=500;
/* აქაც იგივე ფუნქციაა რაც D()-ში, უბრალოდ აქ  y=(y-=r) */
   crash();
 if(NewDivIsAlreadyCreated==true)  UpNewY();
 y1=document.getElementById("1").style.top=y-=r;
 
  if(NewDivIsAlreadyCreated==true)  UpNewX();
  x1=document.getElementById("2").style.left=x;  
  checkBoomb();
c=setTimeout("U()", SpeedValue)
}


function D(){
clearTimeout(a);
clearTimeout(b);
clearTimeout(c);
clearTimeout(d);
if(y>500) y=10;
    /************************************************************
    თავდაპირველად y1,y2,y2...,yn-უდრის ერთიდა იმავეს, შესაბამისად თავიდან მხოლოდ y1
    დაიწევს დაბლა:  y1=document.getElementById("1").style.top=y+=r
   ************************************************************ */
   crash();
    if(NewDivIsAlreadyCreated==true)  UpNewY();
    y1=document.getElementById("1").style.top=y+=r;

    /***********************************************************************
    1-ელი წერტილი როდესაც ქვემოთ ჩამოვა საჭირო 2- წერტილის r-ით მარჯვივ გაწევა
    და 3-ე წერტილის 2*r-ით გაწევა, და ასე შემდეგ, რადგან ისინი r-ით იყვნენ დაშორებულნი.
   ************************************************************************/
     if(NewDivIsAlreadyCreated==true)  UpNewX();
   x1=document.getElementById("2").style.left=x; // x1-ი ისედაც კარგ ადგილას იდგა, აქ არაფერს აკეთებს ეს ხაზი
   checkBoomb();
d=setTimeout("D()", SpeedValue)
}

</script>
</head>
<body onload="snake()">

<div style="border:2px solid black; width:525; height:525;  padding:0px; margin:0px; background:#ebfccf; ">
<div style="position: absolute; padding: 0px; margin: 10px; font-family: consolas; left: 40px; top: 430px;" id="B">*</div>
<div style="position: absolute; padding: 0px; margin: 10px; font-family: consolas; left: 130px; top: 10px;" id="1">*</div>

<br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br>

</div>

<div style="background:black;   padding:1px; margin:0px; border:1px solid black; width:525; height:20; ">
</div>

<div style="background:#cfe2fc;  padding:1px; margin:0px; border:1px solid black; width:525; height:200; ">
<b>values: </b> <input value="0";="" id="Values" size="5" style="font-family: consolas;" type="text"><br>
<b>added: (CountAddedBoombs) </b> <input value="0";="" id="added" size="5" style="font-family: consolas;" type="text"><br>
<b>Speed Up and Down: +/- </b><br>
<b>moving direction by:</b> 4 arrows from the keyboard;
<br>
</div>

<div class="gveli_div">

<script type="text/java[ertad]script">
   for( var i = 2; i <= 200; i++ )
       document.write( "<div id='" + i + "'>*</div>" );
</script>



სულ ეს იყო;


vakho@qoroglishvili: sudo halt

* * *
იხილით პროგრამა: http://vakho.comyr.com/snake.html , Firefox ის Source-ში უკეთესად ჩანს, notepad++ დან დაკოპირებული კარგად არ გამოვიდა მგონი კოდი smile.gif


--------------------
sudo atp-cache search Everything Interesting about Science of Computer Programming;
sudo apt-get learn Everything is Interesting;
Kirchi
Super Crazy Member


******
ჯგუფი: Members
წერილები: 7224
წევრი No.: 4820
რეგისტრ.: 7-April 04

გამოგზავნილია: 24 Aug 2011, 23:10  #27048215      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
კაია smile.gif

მომწონს ესეთი ალგორითმების გარჩევა

ერთადერთი რასაც გამოვასწორებდი ალბათ არის ფორმატირება და კონსტანტებში გავიტანდი ბევრ რამეს - მაგ. სათამაშო მოედანის ზომა და ა.შ.

1) მაგალითად ბევრი ფუნქცია არის მოკლედ სახელიანი - მე უფრო გრძელ და გასაგებ სახელს დავარქმევდი (მაგალითად კრიპტული სახელები a,b,c,d,U,R,L,D,x1,y2 etc
2) ზოგი ფუნქცია იწყება დიდი ასოთი ზოგი პატარათი - ალბათ ჯობია ერთი სტანდარტი
3) ზოგი გლოვალური ცვლადი იქყება დიდი ასოთი ზოგი პატარათი - ერთი სტანდარტი ჯობია
4) (ჩემი გემოვნების ამბავია მაგრამ მაინც დავწერ) - if -ის მერე მიყვარს {} გამოყენბება რომ უფრო კარგად ჩანდეს if-ის რეგიონი
5) არაა დაცული tab-ებით კოდის nested {} რეგიონების გამოყოფა - მე მირჩევნია გამოვყო და დავაფორმატო (იგივე შეეხება HTML-ს)

მაგრამ ფორმატირებას ეშველება მთავარია რო თამაში მუშაობს თან საკაიფოდ

კიდევ შესაძლოა ოპტიმიზაციები მაგალითად მოჭრაობის მიმართულებებიც გაერთიანება ერთ ფუნქციაში ოთხის მაგივრად მაგრამ ეგაც ისეთ პონტში რა ეს ხომ პატარა პროგრამაა რომელიც თავსატეხის პონტში უნდა გააკეთო და ისიამოვნო შედეგით

კაია მოკლედ


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

Blog: http://blog.devarchive.net
Youtube: http://www.youtube.com/user/kirchikgmailcom
VakhoQor
Super Member


****
ჯგუფი: Registered
წერილები: 470
წევრი No.: 121774
რეგისტრ.: 29-September 10

გამოგზავნილია: 28 Aug 2011, 21:26  #27104374      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
Kirchi
1) კი მართალი ხარ, Up, Right, Left, Down და ასეთი ფუქნციები მაქ შემოკლებული, თუმცა კომენტარებში ახნილი
2) 3) ნუ, სტილის ამბავია ცვალდების განაცხადიsmile.gif
4) აქაც სტილის ამბავია, დიდი კოდი რო არ გამოსულიყო ერთ ხაზიანზე არ გმაიწერია. smile.gif
5) გასაგებია

ოპტიმიზაციას რაც შეეხება, პირველივე ვარიანტი რაც მომაფიქრდა ის გავწერე smile.gif
femme
Junior Member


**
ჯგუფი: Registered
წერილები: 25
წევრი No.: 89551
რეგისტრ.: 22-April 09

გამოგზავნილია: 30 Aug 2011, 11:21  #27126194      · პროფილი · პირადი მიმოწერა · ჩატი
სამუშაოს შემოთავაზების თემა დახურულია და სად შეიძება რომ დავწერო? გვჭირდება PHP პროგრამისტი, დაინტერესებულმა პირებმა გამოაგზავნეთ CV მისამართზე kandelakil@gmail.com.

მადლობა


--------------------
never say never again

Multi Multa; Nemo Omnia Novit
xotabich
halt!


****
ჯგუფი: Registered
წერილები: 622
წევრი No.: 36129
რეგისტრ.: 7-June 07

გამოგზავნილია: 30 Aug 2011, 18:01  #27132455      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
VakhoQor
ახალი ბომბის დადებისას როცა პრასტოი რანდომს იყენებ, შეიძლება მისი მდებარეობა გველის ტანს დაემთხვეს... wink.gif


--------------------
paredise is very nice...
VakhoQor
Super Member


****
ჯგუფი: Registered
წერილები: 470
წევრი No.: 121774
რეგისტრ.: 29-September 10

გამოგზავნილია: 1 Sep 2011, 12:45  #27160899      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
xotabich
ოოპს! კარგი შენიშვნაა, არ მქონდა ამაზე ნაფიქრი. გამოსავალს მარტო იმაში ვხედავ თუ ყველა window[Y+i], window[X+i] ს გადავამოწმებ, რომ არ ემთხვეოდეს, სხვა შემთხვევაში, თუ დახლართული გველი იქნება , ვერანაერი კანონზიმიერებით ვერ დავიწყებთ მის გამორიცხვას.... smile.gif


ეხლა Java-ზე GUI მაქვს სასწავლი, დრო თუ მექნა და ხალისი შეილება ჩავუჯდე, თუმცა დრო იმდენად ცოტაა, კაცმა არ იცის თავში რა აზრი დამარყოამს smile.gif
0 წევრი ათვალიერებს ამ თემას (0 სტუმარი და 0 უჩინარი წევრი)
0 წევრი:
Topic Options გამოხმაურება · ახალი თემა · ახალი გამოკითხვა

 



ფორუმის სერვერების განთავსებას და ინტერნეტთან კავშირს უზრუნველყოფს: CLOUD9
[ Script Execution time: 0.0433 ]   [ 13 queries used ]   [ GZIP Disabled ]