< [ на главную ]

Игра ходом коня .
    Эта статья содержит короткие пояснения по листингу моей программы "Ходом коня" и естественно архив с самой программой. Для запуска игры необходимо распаковать проект и открыть его в gambas.  Упакованный проект:    HodKonem02.tar.gz

1) Об игре :
Целью игры является обойти на поле 10*10 ходом коня максимальное количество клеток (на одну клетку можно поставить коня только 1 раз )
Я устойчиво набираю 97-100 очков из 100, т.к. в далекие годы моего голопузого детства игра была достаточно популярна и в школе на переменах, а иногда и на уроках в нее рубились все кому не лень. Более того один раз выработав правильную стратегию Вы добьетесь таких же результатов  , но объяснять ее не буду иначе играть будет не интересно. Вообще я написал эту игру как пример для программирования игр на языке gambas с использованием массивов и если поймете как работает эта программа, то написать игру подобного плана - colour lines , tetris и т.п. для вас не составит большого труда. Вообще программирование игр при помощи массивов во времена ZX-Spectrum-а было очень неплохо описано в книгах "Инфоркома" и не входит в задачи этой статьи, но все зависит от вашего интереса - будут пожелания, могу написать по этой тематике статью для тех кто хотел бы разобраться в теме глубже, тем более, что ходилки / стрелялки программируются по тем же принципам.
Но мы отвлеклись в сторону, вот как выглядит сама игра:



Для совершения хода необходимо поставить курсор на свободную клетку и дважды кликнуть по ней мышкой, а уж комп. сам  проверит правильность этого хода и возможность дальнейшего продолжения игры.
Записи на винт я не делал поэтому рекордом является лучший результат за время одного сеанса игры , при желании такую штуку довольно легко приклепать , но перегружать эту прогу (написанную как пример) нет ни малейшего желания !

2)  Листинг:      Листинг этой программы не блещет изяществом и не страдает глубокой оптимизацией, но тем не менее работает .
Небольшие пояснения к листингу.
Для программирования игры используется массив dsk 10x10, нули в котором соответствуют пустым клеткам ,а единицы занятым . Соответственно вся игра построена на проверке / установке в единицу элементов этого массива !( учтите что в массивах индексы элементов считаются начиная с нуля т. е. dsk[0,0] соответствует левому верхнему углу доски , а dsk[9,9] - правому нижнему.
Процедуры:
Setka - рисует игровое поле
Zero - обнуляет массив
Setkon - рисует коня по координатам из массива
DrawA1_DblClick - основная процедура программы выполняется по двойному щелчку мыши на игровом поле и включает в себя проверки правильности хода и проверки на окончание игры.
Остальное легко можно понять из листинга:
' Gambas class file
PUBLIC xkon AS Integer 'позиция коня в массиве 0-9
PUBLIC ykon AS Integer
PUBLIC xcur AS Integer 'позиция курсора в пиксел
PUBLIC ycur AS Integer
PUBLIC numb AS Integer ' номер хода
PUBLIC x AS Integer = 600
PUBLIC y AS Integer = 520
PUBLIC rec AS Integer
dsk[10, 10] AS Integer 'массив поля 10х10

PUBLIC SUB _new()

END

PUBLIC SUB Form_Open()
xkon = 0
ykon = 0
numb = 0
'DIM dsk[10, 10] AS Integer
LbEnd.Visible = FALSE
DrawA1.Cached = TRUE
FMain.Width = x
FMain.Height = y
DrawA1.Width = 501
DrawA1.Height = 501
ButNew.X = 520
ButNew.Y = 100
ButExit.X = 520
ButExit.Y = 460
lb1.X = 520
lb1.Y = 60
lb1.Width = 75
Lab1.X = 520
Lab1.Y = 15
Lab2.X = 520
Lab2.Y = 170
Lab3.X = 520
Lab3.Y = 210
TB1.X = 520
TB1.Y = 300


LbEnd.x = 2
LbEnd.y = 150
LbEnd.Width = 496
LbEnd.Height = 200


Setka
Zero
dsk[0, 0] = 1 ' конь в углу доски
Setkon

END

PUBLIC SUB Setkon() 'рисует коня по координатам массива xkon ykon
DIM hImage AS Image ' Gambas class file
Draw.Begin(DrawA1)
hImage = Image.Load("kon.jpg")
Draw.Image(hImage, (xkon * 50) + 2, (ykon * 50) + 2)
Draw.End
dsk[xkon, ykon] = 1
numb = numb + 1
lb1.Text = numb

END


PUBLIC SUB Zero() 'обнуление массива поля
DIM i AS Integer
DIM j AS Integer

FOR i = 0 TO 9
FOR j = 0 TO 9
dsk[i, j] = 0
NEXT
NEXT


END


PUBLIC SUB ButExit_Click()

ME.Close

END

PUBLIC SUB Setka() 'создает новое игровое поле
DIM x1, x2, y1, y2, i, j AS Integer
DrawA1.Clear()
DrawA1.Visible = TRUE
Draw.Begin(DrawA1)
FOR i = 0 TO 500 STEP 50
Draw.Line(i, 0, i, 500)
NEXT
FOR j = 0 TO 500 STEP 50
Draw.Line(0, j, 500, j)
NEXT
Draw.End

END


PUBLIC SUB DrawA1_DblClick()

DIM xknew AS Integer
DIM yknew AS Integer
xcur = Mouse.ScreenX
ycur = Mouse.ScreenY
PRINT "xcur = ", xcur, " ycur = ", ycur
PRINT "XF= ", DrawA1.ScreenX, " YF= ", DrawA1.ScreenY
xknew = (xcur - DrawA1.ScreenX) \ 50
yknew = (ycur - DrawA1.ScreenY) \ 50
IF dsk[xknew, yknew] = 1 THEN RETURN ' Поле уже занято
IF xknew = xkon - 2 AND (yknew = ykon - 1 OR yknew = ykon + 1) THEN GOTO label1 'правильность хода
IF xknew = xkon - 1 AND (yknew = ykon - 2 OR yknew = ykon + 2) THEN GOTO label1
IF xknew = xkon + 1 AND (yknew = ykon - 2 OR yknew = ykon + 2) THEN GOTO label1
IF xknew = xkon + 2 AND (yknew = ykon - 1 OR yknew = ykon + 1) THEN GOTO label1

RETURN

label1:
Draw.Begin(DrawA1)
Draw.FillColor = Color.Gray
Draw.FillStyle = Fill.Solid
Draw.Rect(((xkon * 50) + 2), ((ykon * 50) + 2), 47, 47)

Draw.End
xkon = xknew
ykon = yknew
Setkon

IF xkon > 1 AND ykon > 0 THEN
IF dsk[xkon - 2, ykon - 1] = 0 THEN RETURN
ENDIF
IF xkon > 1 AND ykon < 9 THEN 'возможность следующего хода
IF dsk[xkon - 2, ykon + 1] = 0 THEN RETURN
ENDIF
IF xkon > 0 AND ykon > 1 THEN
IF dsk[xkon - 1, ykon - 2] = 0 THEN RETURN
ENDIF
IF xkon > 0 AND ykon < 8 THEN
IF dsk[xkon - 1, ykon + 2] = 0 THEN RETURN
ENDIF
IF xkon < 9 AND ykon > 1 THEN
IF dsk[xkon + 1, ykon - 2] = 0 THEN RETURN
ENDIF
IF xkon < 9 AND ykon < 8 THEN
IF dsk[xkon + 1, ykon + 2] = 0 THEN RETURN
ENDIF
IF xkon < 8 AND ykon > 0 THEN
IF dsk[xkon + 2, ykon - 1] = 0 THEN RETURN
ENDIF
IF xkon < 8 AND ykon < 9 THEN
IF dsk[xkon + 2, ykon + 1] = 0 THEN RETURN
ENDIF
Game_Over
PRINT "GAME OVER !!!"
'Form_Open



PRINT "xkon = ", xkon, " ykon = ", ykon
END

PUBLIC SUB Game_Over()

LbEnd.Visible = TRUE

END





PUBLIC SUB ButNew_Click()
IF numb > rec THEN rec = numb
Lab3.Text = rec
Form_Open
END


PUBLIC SUB TB1_Click()

LbHelp.Visible = TRUE

END

PUBLIC SUB TB1_Leave()

LbHelp.Visible = FALSE

END


Если Вы дочитали до этого места, остается пожелать Вам дальнейших успехов в программировании !  
kostyalamer 08.03.2009
< [ на главную ]




Hosted by uCoz