This is a documentation for Board Game Arena: play board games online !

Туториал гомоку

Извор: Board Game Arena
Пређи на навигацију Пређи на претрагу

Тхис туториал wилл гуиде yоу тхроугх тхе басицс оф цреатинг а симпле гаме он БГА Студио, тхроугх тхе еxампле оф Гомоку (алсо кноwн ас Гобанг ор Фиве ин а Роw).

Yоу wилл старт фром оур 'емтпy гаме' темплате

Хере ис хоw yоур гамес лоокс бy дефаулт wхен ит хас јуст беен цреатед :

Гомоку туто1.пнг

Сетуп тхе боард

Гатхер усефул имагес фор тхе гаме анд едит тхем ас неедед. Уплоад тхем ин тхе 'имг' фолдер оф yоур СФТП аццесс.

Едит .тпл то адд соме дивс фор тхе боард ин тхе ХТМЛ.

<div id="gmk_game_area">
	<div id="gmk_background">
		<div id="gmk_goban">
		</div>
	</div>	
</div>

Едит .цсс то сет тхе див сизес анд поситионс анд схоw тхе имаге оф тхе боард ас бацкгроунд.

#gmk_game_area {
	text-align: center;
	position: relative;
}

#gmk_background {
	width: 620px;
	height: 620px;	
	position: relative;
	display: inline-block;
}

#gmk_goban {	
	background-image: url( '../../img/gomoku/goban.jpg');
	width: 620px;
	height: 620px;
	position: absolute;	
}

Гомоку туто2.пнг

Сетуп тхе бацкбоне оф yоур гаме

Едит дбмодел.сqл то цреате а табле фор интерсецтионс. Wе неед цоординатес фор еацх интерсецтион анд а фиелд то сторе тхе цолор оф тхе стоне он тхис интерсецтион (иф анy).

CREATE TABLE IF NOT EXISTS `intersection` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `coord_x` tinyint(2) unsigned NOT NULL,
   `coord_y` tinyint(2) unsigned NOT NULL,
   `stone_color` varchar(8) NULL,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Едит гомоку.гаме.пхп->сетупНеwГаме() то инсерт тхе емптy интерсецтионс (19x19) wитх цоординатес инто тхе датабасе.

        // Insert (empty) intersections into database
        $sql = "INSERT INTO intersection (coord_x, coord_y) VALUES ";
        $values = array();
        for ($x = 0; $x < 19; $x++) {
            for ($y = 0; $y < 19; $y++) {
        	
            	$values[] = "($x, $y)";   	
            }
        }
        $sql .= implode( $values, ',' );
        self::DbQuery( $sql );

Едит гомоку.гаме.пхп->гетАллДатас() то ретриеве тхе стате оф тхе интерсецтионс фром тхе датабасе.

        // Intersections
        $sql = "SELECT id, coord_x, coord_y, stone_color FROM intersection ";
        $result['intersections'] = self::getCollectionFromDb( $sql );

Едит .тпл то цреате а темплате фор интерсецтионс (јстпл_интерсецтион).

var jstpl_intersection='<div class="gmk_intersection ${stone_type}" id="intersection_${x}_${y}"></div>';

Дефине тхе стyлес фор тхе интерсецтион дивс

.gmk_intersection {
    width: 30px;
    height: 30px;
    position: relative;
}

Едит гомоку.јс->сетуп() то сетуп тхе интерсецтионс лаyер тхат wилл бе усед то гет цлицк евентс анд то дисплаy тхе стонес. Тхе дата yоу ретурнед ин $ресулт['интерсецтионс'] ин гомоку.гаме.пхп->гетАллДатас() ис ноw аваилабле ин yоур гомоку.јс->сетуп() ин гамедатас.интерсецтионс.

            // Setup intersections
            for( var id in gamedatas.intersections )
            {
                var intersection = gamedatas.intersections[id];

                dojo.place( this.format_block('jstpl_intersection', {
                    x:intersection.coord_x,
                    y:intersection.coord_y,
                    stone_type:(intersection.stone_color == null ? "no_stone" : 'stone_' + intersection.stone_color)
                } ), $ ( 'gmk_background' ) );

                var x_pix = this.getXPixelCoordinates(intersection.coord_x);
                var y_pix = this.getYPixelCoordinates(intersection.coord_y);
                
                this.slideToObjectPos( $('intersection_'+intersection.coord_x+'_'+intersection.coord_y), $('gmk_background'), x_pix, y_pix, 10 ).play();

                if (intersection.stone_color != null) {
                    // This intersection is taken, it shouldn't appear as clickable anymore
                    dojo.removeClass( 'intersection_' + intersection.coord_x + '_' + intersection.coord_y, 'clickable' );
                }
            } 

Усе соме темпорарy цсс бордер-цолор ор бацкгроунд-цолор анд опацитy то сее тхе дивс анд маке суре yоу хаве тхем поситионед ригхт.

.gmk_intersection {
    width: 30px;
    height: 30px;
    position: relative;
    background-color: blue;
    opacity: 0.3;
}

Yоу цан децларе соме цонстантс ин материал.инц.пхп

$this->gameConstants = array(
		"INTERSECTION_WIDTH" => 30,
		"INTERSECTION_HEIGHT" => 30,		
		"INTERSECTION_X_SPACER" => 2.8, // Float
		"INTERSECTION_Y_SPACER" => 2.8, // Float
		"X_ORIGIN" => 0,
		"Y_ORIGIN" => 0,
);

Анд пасс тхем то yоур гомоку.јс тхроугх гомоку.гаме.пхп->гетАллДатас() фор еасy репоситионинг (модифy цонстант, рефресх).

       // Constants
       $result['constants'] = $this->gameConstants;

Хере ис wхат yоу схоулд гет:

Гомоку туто3.пнг

Манаге статес анд евентс

Дефине yоур гаме статес ин статес.инц.пхп

Адд онцлицк евентс он интерсецтионс ин .јс, цаллинг ан ацтион wитх аппроприате параметерс

Адд ацтион ин .ацтион.пхп, ретриевинг параметерс анд цаллинг тхе аппроприате гаме ацтион

Адд гаме ацтион ин .гаме.пхп то упдате тхе датабасе, тхен нотифy тхе цлиент усинг а метход ‘стонеПлаyед’

Имплемент тхис метход ин јавасцрипт то упдате тхе интерсецтион то схоw тхе стоне, анд регистер ит инсиде тхе сетНотифицатионс фунцтион.

Тхе басиц гаме турн ис имплементед: yоу цан дроп соме стонес!

Гомоку туто4.пнг

Цлеануп yоур стyлес

Ремове темпорарy цсс висуалисатион хелперс : лоокс гоод!

Гомоку туто5.пнг

Имплемент рулес анд енд оф гаме цондитионс

Имплемент специфиц рулес фор тхе гаме (иф анy)

 Nothing special for Gomoku

Имплемент руле фор цомпутинг гаме прогрессион ин .гаме.пхп->гетГамеПрогрессион()

Имплемент енд оф гаме детецтион анд упдате тхе сцоре аццординг то wхо ис тхе wиннер ин .гаме.пхп->стЦхецкЕндОфГаме()

Нотифy тхе сцоре анд имплемент тхе цорреспондинг интерфаце упдате ин .јс

Тест еверyтхинг тхороугхлy... yоу аре доне!

Гомоку туто6.пнг