PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » OpenSource » Игра Пятнашки


Игра Пятнашки

Сообщений 1 страница 30 из 32

1

Код:
Enumeration
  #Window_0
EndEnumeration


Enumeration
  #Button_0
  #Button_1
  #Button_2
  #Button_3
  #Button_4
  #Button_5
  #Button_6
  #Button_7
  #Button_8
  #Button_9
  #Button_10
  #Button_11
  #Button_12
  #Button_13
  #Button_14
  #Button_15
EndEnumeration


Global dvig

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 516, 346, 325, 353, "Пятнашки",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_WindowCentered )
    
    If LoadFont(0, "Arial", 22)
      SetGadgetFont(#PB_Default, FontID(0))   ; Устанавливаем шрифт по умолчанию
    EndIf


      ButtonGadget(#Button_1, 5, 10, 75, 75, "1")
      ButtonGadget(#Button_2, 85, 10, 75, 75, "2")
      ButtonGadget(#Button_3, 165, 10, 75, 75, "3")
      ButtonGadget(#Button_4, 245, 10, 75, 75, "4")
      ButtonGadget(#Button_5, 5, 90, 75, 75, "5")
      ButtonGadget(#Button_6, 85, 90, 75, 75, "6")
      ButtonGadget(#Button_7, 165, 90, 75, 75, "7")
      ButtonGadget(#Button_8, 245, 90, 75, 75, "8")
      ButtonGadget(#Button_9, 5, 170, 75, 75, "9")
      ButtonGadget(#Button_10, 85, 170, 75, 75, "10")
      ButtonGadget(#Button_11, 165, 170, 75, 75, "11")
      ButtonGadget(#Button_12, 245, 170, 75, 75, "12")
      ButtonGadget(#Button_13, 5, 250, 75, 75, "13")
      ButtonGadget(#Button_14, 85, 250, 75, 75, "14")
      ButtonGadget(#Button_15, 165, 250, 75, 75, "15")
 
      
    If CreateMenu(1,WindowID(#Window_0))         ;Создаем меню
       MenuTitle("Меню")
        MenuItem(1,"Новая игра")
        MenuItem(2,"Об игре")
        MenuBar()
        MenuItem(3,"Выход")
    EndIf
       
  EndIf
EndProcedure

Procedure.l Pustoe_mesto(a)
 razmer_x = GadgetX(a)     ;местонахождение гаджета
 razmer_y = GadgetY(a)

  For gad=1 To 15
    raz_x = GadgetX(gad)
    raz_y = GadgetY(gad)
    
      If razmer_x + 80 < 320
       If razmer_x + 80 <> raz_x Or razmer_y <> raz_y      ; проверка справа
        Schet=Schet+1
       EndIf
      EndIf

      If razmer_x - 80 >= 5 
       If razmer_x - 80 <> raz_x  Or razmer_y <> raz_y           ;проверка слева
        Schet1=Schet1+1
       EndIf
      EndIf
      

      If razmer_y + 80 < 325
       If razmer_y + 80 <> raz_y  Or razmer_x <> raz_x         ;проверка снизу
        Schet2=Schet2+1
       EndIf
      EndIf

      
     
      If razmer_y - 80 >= 10 
       If razmer_y - 80 <> raz_y  Or razmer_x <> raz_x           ;проверка сверху
        Schet3=Schet3+1
       EndIf
      EndIf  
  Next
 

  If Schet=15
   dvig=1
  EndIf
  
  If Schet1=15
   dvig=2
  EndIf
   
  If Schet2=15
   dvig=3
  EndIf
  
  If Schet3=15
   dvig=4
   
  EndIf


EndProcedure

Procedure peremeshenie(a,b)

 Select a
  Case 1
   ResizeGadget(b, GadgetX(b)+80, #PB_Ignore, #PB_Ignore, #PB_Ignore)              ;Перемещение кнопок
  Case 2
   ResizeGadget(b, GadgetX(b)-80, #PB_Ignore, #PB_Ignore, #PB_Ignore)
  Case 3
   ResizeGadget(b, #PB_Ignore,GadgetY(b)+80,  #PB_Ignore, #PB_Ignore)
  Case 4
   ResizeGadget(b, #PB_Ignore,GadgetY(b)-80,  #PB_Ignore, #PB_Ignore)
 EndSelect
 dvig=0
EndProcedure

Procedure sluch()

        For ww=1 To 2000             
           gadget= Random(15)                ; случайная расстановка
           If gadget=0
            gadget=1
           EndIf 
           Pustoe_mesto(gadget) 
           peremeshenie(dvig,gadget) 
        Next

EndProcedure



Open_window_0()
sluch()

Repeat

  ev=WaitWindowEvent()

 If ev=#PB_Event_Gadget                        
    For gadget=1 To 15                         
     If EventGadget()=gadget                   ; Индефикация гаджета    
      Pustoe_mesto(gadget) 
      peremeshenie(dvig,gadget)                      
      Break                                    
     EndIf                                     
    Next                                       
 EndIf
 
 
 If GadgetX(1)+GadgetY(1)=15 And GadgetX(2)+GadgetY(2)=95 And GadgetX(3)+GadgetY(3)=175 And GadgetX(4)+GadgetY(4)=255
   If GadgetX(5)+GadgetY(5)=95 And GadgetX(6)+GadgetY(6)=175 And GadgetX(7)+GadgetY(7)=255 And GadgetX(8)+GadgetY(8)=335
     If GadgetX(9)+GadgetY(9)=175 And GadgetX(10)+GadgetY(10)=255 And GadgetX(11)+GadgetY(11)=335 And GadgetX(12)+GadgetY(12)=415
       If GadgetX(13)+GadgetY(13)=255 And GadgetX(14)+GadgetY(14)=335 And GadgetX(15)+GadgetY(15)=415
         MessageRequester("Победа", "Молодец ты сумел(а) собрать пятнашку.")
         sluch()
       EndIf 
     EndIf
   EndIf
 EndIf                                      
  
  Menu=EventMenu()                     ;события меню
    If ev=#PB_Event_Menu
      Select Menu
        Case 1
          sluch()
        Case 2 
          MessageRequester("Об игре", "Создано в PureBasic, автор: Станислав Будинов")
        Case 3
          End
      EndSelect  
    EndIf
      
Until ev=#PB_Event_CloseWindow

0

2

Нашел когда то на забугорном сайте, по теме:
http://www.mirashic.narod.ru/shiftit.zip

0

3

Чуть- чуть изменил.
Пятнашки_img

0

4

mirashic написал(а):

Чуть- чуть изменил.

Ну уж тогда доводи до конца.  :crazy:  Человек должен знать какой рисунок собирать надо. В самом начале на несколько секунд должно появится полное изображение. А так отлично получилось  :cool:

0

5

Изменил код, добавил просмотр в начале и в конце.
(может не правильно ?)

0

6

Неплохие пазлы получились! Осталось добавить функцию свои фото добавлять. И будет готовый полноценный продукт!

0

7

Не представляю как программно  резать изображение.

0

8

mirashic написал(а):

Не представляю как программно  резать изображение

Как-то так

Код:
Result = GrabImage(#Image1, #Image2, x, y, Width, Height)

0

9

Не могу разобраться, как правильно её использовать ?

Код:
UsePNGImageDecoder()    

Enumeration 
#Window_0     
#Button_1
#Image1
#Image2 
EndEnumeration

CatchImage(1111,  ?Im1111,  ?Im1111End -?Im1111 )

OpenWindow (#Window_0,  0,  0,  320,  320,  "Заглавие",#PB_Window_ScreenCentered|#PB_Window_SystemMenu) 

ButtonImageGadget(#Button_1,  5,   10,  81, 81, 0)
ImageGadget(#Image1, 3, 3, 314, 314, ImageID(1111))

Repeat
Event =  WaitWindowEvent() 
Window = EventWindow() 
Gadget = EventGadget()
   Select Event
        Case #PB_Event_Gadget
          Select EventGadget()
             Case #Button_1
               
               GrabImage(#Image1, #Image2, 0, 0, 74, 74)
               
              ; SetGadgetAttribute(#Button_1,  #PB_Button_Image, ImageID(1111))
                                  
          EndSelect
   EndSelect
If Event = #PB_Event_CloseWindow
Break   
EndIf
ForEver 


DataSection
 Im1111:
 IncludeBinary "img_1/1111.png"
 Im1111End:
EndDataSection

0

10

mirashic написал(а):

Не могу разобраться, как правильно её использовать

В место #Image1 должен быть идентификатор реального рисунка, в нашем случае это 1111.

Код:
UsePNGImageDecoder()    

Enumeration 
#Window_0     
#Button_1
#Image1
#Image2 
EndEnumeration

CatchImage(1111,  ?Im1111,  ?Im1111End -?Im1111 )

OpenWindow (#Window_0,  0,  0,  320,  320,  "Заглавие",#PB_Window_ScreenCentered|#PB_Window_SystemMenu) 

ButtonImageGadget(#Button_1,  5,   10,  81, 81, 0)
ImageGadget(#Image1, 3, 3, 314, 314, ImageID(1111))

Repeat
Event =  WaitWindowEvent() 
Window = EventWindow() 
Gadget = EventGadget()
   Select Event
        Case #PB_Event_Gadget
          Select EventGadget()
             Case #Button_1
               
               GrabImage(1111, #Image2, 0, 0, 74, 74)
               
               SetGadgetAttribute(#Button_1,  #PB_Button_Image, ImageID(#Image2))
                                  
          EndSelect
   EndSelect
If Event = #PB_Event_CloseWindow
Break   
EndIf
ForEver 


DataSection
 Im1111:
 IncludeBinary "img_1/1111.png"
 Im1111End:
EndDataSection

0

11

Спасибо, я писал ImageID(1111), и выскакивала ошибка.

0

12

Новый вариант : пятнашки 2
С дуру нарезал много изображений, но архив слишком большой получится.

0

13

Ох уж этот аватар, блин! %-)

0

14

297 строка , при отмене выбора изображения, горит желтым цветом, как это исправить ?

0

15

Это потому, что рисунок не загружен.
Это только предупреждение, а не ошибка.
Сделай так

Код:
    File.s=OpenFileRequester("","","*.*|*.*",0)
    If File
           a= LoadImage(#Ima, File )
         
    ImageGadget(#Imag, 8,13,314,314,a)
    Delay(2000)
    ImageGadget(#Imag, 8,13,314,314,0)
         
          Open_img(#Ima)
   EndIf

0

16

Спасибо !
И ещё, как правильно перечислять все форматы?

OpenFileRequester("","",".png|*.png*",0) )

Отредактировано mirashic (14.02.2010 20:39:42)

0

17

Код:
OpenFileRequester("","","png и jpg а также, bmp|*.png;*.jpg;*.bmp|Все файлы|*.*",0)

0

18

Спасибо .

0

19

А изображения только указанного размера загружаются?  Наверно надо чтобы любые можно было. С помощью ResizeImage сделать эту функцию при загрузке, если есть конечно желание

0

20

Можно, но будет не совсем корректно,  если подгонять по высоте - потеря композиции.

0

21

Обновил с изменением размера.
12 пост

Отредактировано mirashic (14.02.2010 21:53:44)

0

22

Наверное так будет корректней по сохранении композиции:

Код:
     If File
        LoadImage(#Ima, File )
   
       w = ImageWidth(#Ima)
       h = ImageHeight(#Ima) 
       w1 = (w*316)/h
  
      ResizeImage(#Ima, w1, 316)   ; изменяем размер по высоте 
      
     GrabImage(#Ima, #img333,  50,  0, 316, 316)  ;  отступаем 50пикс от края и вырезаем 
     
     ImageGadget(#Imag, 8,13,314,314,ImageID(#img333))
      Delay(2000)
     ImageGadget(#Imag, 8,13,314,314,0)
         
      Open_img(#img333)
      a= ImageID(#img333)
   EndIf

Отредактировано mirashic (15.02.2010 00:10:10)

0

23

Я не смотрел код, загрузил первую попавшуюся картинку, все хорошо работает.

0

24

Не правильно отображалась картинка - когда собрана.
Добавил подсказку.
Исправил  Пятнашка

0

25

Появился баг(по крайней мере у меня). При  загрузке нового изображения:
http://s001.radikal.ru/i195/1002/4a/3402b90d9508.jpg

Как я понял из-за этого:

Код:
GrabImage(#Ima, #img333,  50,  0, 316, 316)  ;  отступаем 50пикс от края и вырезаем

Непонятно зачем 50, ставишь ноль и все корректно работает.

Отредактировано haav (15.02.2010 07:16:16)

0

26

Эта картинка загружена изначально в память, предполагается что  её уже загружать не будут.
Так как основная масса изображений  прямоугольной формы (квадратных мало) и ширина, как правило
больше высоты, отступ сделан для сохранения более - мение композиции рисунка.

Хотя, можно и не делать , по усмотрению (загрузил, не понравилось -грузи следующею).

0

27

Пример
Оригинал:
http://www.mirashic.narod.ru/0_22.png

С отступом и без:

http://www.mirashic.narod.ru/2_22.png  http://www.mirashic.narod.ru/1_22.png

0

28

Тогда наверно надо создать условие для проверки соотношения сторон, при которых по разному работает этот код:

Код:
GrabImage(#Ima, #img333,  50,  0, 316, 316)  ;  отступаем 50пикс от края и вырезаем

0

29

Точно !

0

30

Пазлы

0


Вы здесь » PureBasic - форум » OpenSource » Игра Пятнашки