Advertisement
Guest User

Untitled

a guest
Aug 6th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Strict
  2.  
  3. import mojo
  4.  
  5. Global myGame:MyGame
  6.  
  7. Function Main:int()
  8.     myGame = new MyGame
  9.     return 0
  10. End Function
  11.  
  12. Class MyGame extends App
  13.     Field list:LinkedList<Alien>
  14.  
  15.     Method OnCreate:Int()
  16.    
  17.         list = New LinkedList<Alien>
  18.    
  19.         Local a:Alien = new Alien()
  20.         a.name = "Fred"
  21.         list.AddLast(a)
  22.  
  23.         a = new Alien()
  24.         a.name = "George"
  25.         list.AddLast(a)
  26.  
  27.         For Local a:Alien = Eachin list
  28.             Print a.name
  29.         Next
  30.         Print list.Count()
  31.        
  32.         list.Sort()
  33.        
  34.         SetUpdateRate 60
  35.         return 0
  36.     End Method
  37.    
  38.     Method OnLoading:Int()
  39.         return 0
  40.     End Method
  41.    
  42.     Method OnUpdate:Int()
  43.         return 0
  44.     End Method
  45.    
  46.     Method OnRender:Int()
  47.         Cls
  48.        
  49.         return 0
  50.     End Method 
  51. end class
  52.  
  53. Class Sprite
  54.     Field x#, y#
  55. End
  56.  
  57. Class Alien Extends Sprite
  58.     Field name$
  59. End
  60.  
  61. Class LinkedList<T>
  62.     Field head:LinkedNode<T> = New LinkedNode<T>
  63.    
  64.     Method AddLast:LinkedNode<T>( data:T )
  65.         Return New LinkedNode<T>( head, head.pred, data )
  66.     End
  67.    
  68.     Method ObjectEnumerator:LinkedEnumerator<T>()
  69.         Return New LinkedEnumerator<T>( Self )
  70.     End Method
  71.    
  72.     Method Count:Int()
  73.         Local n:Int
  74.         local node := head.succ
  75.         While node <> head
  76.             node = node.succ
  77.             n+=1
  78.         Wend
  79.         Return n
  80.     End
  81.    
  82.     Method FirstLink:LinkedNode<T>()
  83.         Return head.succ
  84.     End
  85.  
  86.    
  87.     Method Sort:Void( ascending?=True )
  88.         Print "sort"
  89.         Local h:LinkedNode<T> = FirstLink( )
  90.         If h = Null Then Return
  91.         If h.NextLink( ) = Null Then Return ' No need to sort one element
  92.         h = ISort( h, head )
  93.         head.succ = h
  94.         While h.NextLink( )
  95.             h = h.NextLink( )
  96.         Wend
  97. '         If Not ascending Then Swap Reversed( )
  98.     End Method
  99.      
  100.     ' Internal sort function
  101.     Method ISort:LinkedNode<T>( h:LinkedNode<T>, oh:LinkedNode<T> )
  102.         Print "sorting"
  103.         Local p:LinkedNode<T>, q:LinkedNode<T>, e:LinkedNode<T>, tail:LinkedNode<T>, oldhead:LinkedNode<T>
  104.         Local insize%, merges%, psize%, qsize%, i%
  105.         If h = Null Then Return null
  106.         insize = 1
  107.         While True
  108.             p = h
  109.             oldhead = h
  110.             h = Null
  111.             tail = Null
  112.             merges = 0
  113.             While p
  114.                 merges += 1
  115.                 q = p
  116.                 psize = 0
  117.                 For i = 0 To insize-1
  118.                    psize += 1
  119.                    q = q.NextLink( )
  120.                    If Not q Then Exit
  121.                 Next
  122.                
  123.                 qsize = insize
  124.                
  125.                 While psize > 0 Or ( qsize > 0 And q )
  126.                     If psize = 0 Then
  127.                        e = q
  128.                        q = q.NextLink( )
  129.                        qsize -= 1
  130.                     ElseIf qsize = 0 Or Not q
  131.                        e = p
  132.                        p = p.NextLink( )
  133.                        psize -= 1
  134.                     Else
  135.                        Local cmp%
  136.                        If p.data And q.data Then
  137.                             'cmp = p.data.Compare( q.data )
  138.                          cmp = Compare(  p.data, q.data )
  139.                         ElseIf p.data
  140.                             cmp = -1
  141.                         ElseIf q.data
  142.                             cmp = 1
  143.                         Else
  144.                             cmp = 0
  145.                         EndIf
  146.                        
  147.                         If cmp <= 0 Then
  148.                             e = p
  149.                             p = p.NextLink( )
  150.                             psize -= 1
  151.                         Else
  152.                             e = q
  153.                             q = q.NextLink( )
  154.                             qsize -= 1
  155.                         EndIf
  156.                     EndIf
  157.                    
  158.                     If tail Then
  159.                         tail.succ = e
  160.                     Else
  161.                         h = e
  162.                     EndIf
  163.                    
  164.                     tail = e
  165.                    
  166.                 Wend
  167.                
  168.                 p = q
  169.             Wend
  170.             tail.succ = oh
  171.             h.pred = oh
  172.             If merges <= 1 Then Return h
  173.             insize *= 2
  174.         Wend
  175.     Return null
  176.     End Method
  177.    
  178. End
  179.  
  180. Function Compare:Int(o1:Object, o2:Object)
  181.     Local c1:Card = Card(o1)
  182.     Local c2:Card = Card(o2)
  183.     If c2 = c1 Return False
  184.  
  185.     If c1.shuffleOrder = c2.shuffleOrder
  186.         Return True
  187.     endif
  188.    
  189.     Return Sgn(c1.shuffleOrder - c2.shuffleOrder)
  190.    
  191. End
  192.  
  193. Class LinkedEnumerator<T>
  194.     Field list:LinkedList<T>
  195.     Field curr:LinkedNode<T>
  196.    
  197.     Method New( lst:LinkedList<T> )
  198.         list = lst
  199.         curr = lst.head.succ
  200.     End Method
  201.  
  202.     Method HasNext:Bool()
  203.         Return curr <> list.head
  204.     End
  205.  
  206.     Method NextObject:T()
  207.         Local data:T = curr.data
  208.         curr = curr.succ
  209.         Return data
  210.     End
  211.  
  212.  
  213. End
  214.  
  215. Class LinkedNode<T>
  216.     Field succ:LinkedNode
  217.     Field pred:LinkedNode
  218.     Field data:T
  219.    
  220.     Method New()
  221.         succ=Self
  222.         pred=Self
  223.     End
  224.    
  225.     Method New( succ:LinkedNode, pred:LinkedNode, data:T )
  226.         self.succ=succ
  227.         self.pred=pred
  228.         self.succ.pred=Self
  229.         self.pred.succ=Self
  230.         self.data=data
  231.     End
  232.    
  233.            
  234.     Method NextLink:LinkedNode<T>()
  235.         If succ.data<>succ Return succ
  236.         Return succ
  237.     End
  238.    
  239. End
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement