You are on page 1of 10

%XLOGLQJ%UDLQVLQWR<RXU*DPHV

*DPHGHYHORSHUVKDYHDOZD\VSXVKHGWKHOLPLWVRIWKHKDUGZDUHZKHQLWFRPHVWRJUDSKLFVDQGVRXQGEXW,
WKLQNZHDOODJUHHWKDWZKHQLW
VWLPHWRLPSOHPHQWDUWLILFLDOLQWHOOLJHQFHIRUDJDPH$,DOZD\VJHWVWKHVKRUW
HQGRIWKHVWLFN,QWKLVDUWLFOHZHDUHJRLQJWRVWXG\DSRWSRXUULRI$,WRSLFVUDQJLQJIURPWKHVLPSOHWRWKH
FRPSOH[

$ORQJWKHZD\ZHDUHJRLQJWRWU\RXWDIHZGHPRVWKDWXVHDYHU\UXGLPHQWDU\JUDSKLFVLQWHUIDFHWR
LOOXVWUDWHVRPHRIWKHVLPSOHUFRQFHSWV+RZHYHUPRVWRIRXUGLVFXVVLRQZLOOEHTXDVLWKHRUHWLFDODQG
DEVWUDFW7KLVLVEHFDXVH$,LVQRWDVVLPSOHDVDQDOJRULWKPDGDWDVWUXFWXUHRUVLPLODUWKLQJV$UWLILFLDO
LQWHOOLJHQFHLVDIOXLGFRQFHSWWKDWPXVWEHVKDSHGE\WKHJDPHLWLVWREHXVHGRQ*UDQWHG\RXPD\XVHWKH
VDPHIXQGDPHQWDOWHFKQLTXHVRQP\ULDGJDPHVEXWWKHIRUPDQGLPSOHPHQWDWLRQPD\EHUDGLFDOO\GLIIHUHQW

/HW
VEHJLQRXUGLVFXVVLRQZLWKVRPHVLPSOHVWDWHPHQWVWKDWGHILQHZKDW$,LVLQWKHFRQWH[WRIJDPHV
$UWLILFLDOLQWHOOLJHQFHLQWKHDUHQDRIFRPSXWHUJDPHVLPSOLHVWKDWWKHFRPSXWHUFRQWUROOHGRSSRQHQWVDQG
JDPHREMHFWVVHHPWRVKRZVRPHNLQGRIFRJQLWLYHSURFHVVZKHQWDNLQJDFWLRQVRUUHDFWLQJWRWKHSOD\HU
V
DFWLRQV7KHVHDFWLRQVPD\EHLPSOHPHQWHGLQDPLOOLRQGLIIHUHQWZD\VEXWWKHERWWRPOLQHIURPDQ
REVHUYHUVSRLQWRIYLHZLVWKDWWKH\VHHPWRVKRZLQWHOOLJHQFH

7KLVEULQJVXVWRWKHIXQGDPHQWDOGHILQLWLRQRILQWHOOLJHQFH)RURXUSXUSRVHVLQWHOOLJHQFHLVVLPSO\WKHDELOLW\
WRVXUYLYHDQGSHUIRUPWDVNVLQDQHQYLURQPHQW7KHWDVNVPD\EHWRKXQWGRZQDQGGHVWUR\WKHSOD\HUILQG
IRRGQDYLJDWHDQDVWHURLGILHOGRUZKDWHYHU1HYHUWKHOHVVWKLVZLOOEHRXUORRVHGHILQLWLRQRILQWHOOLJHQFH

1RZWKDWZHKDYHDQLGHDRIZKDWZHDUHWU\LQJWRDFFRPSOLVKZKHUHRQHDUWKVKRXOGZHEHJLQ":HZLOO
EHJLQE\XVLQJKXPDQVDVRXUPRGHOVRILQWHOOLJHQFHEHFDXVHWKH\VHHPWREHUHDVRQDEO\LQWHOOLJHQWIRU
FDUERQXQLWV,IZHREVHUYHDKXPDQLQDQHQYLURQPHQWZHFDQH[WUDSRODWHDIHZNH\EHKDYLRUVRI
LQWHOOLJHQFHWKDWZHFDQPRGHOXVLQJIDLUO\VLPSOHFRPSXWHUDOJRULWKPVDQGWHFKQLTXHV

7KHVHEHKDYLRUVDUHEOLQGUHIOH[HVUDQGRPVHOHFWLRQXVHRINQRZQSDWWHUQVHQYLURQPHQWDODQDO\VLV
PHPRU\EDVHGVHOHFWLRQVDQGVHTXHQWLDOEHKDYLRUVWKDWPD\HQFRPSDVVVRPHRUDOORIWKHRWKHUEHKDYLRUV
:H
OOWDNHDORRNDWDOORIWKHVHEHKDYLRUVDQGH[SORUHKRZZHPLJKWLPSOHPHQWWKHPLQDFRPSXWHUJDPH
EXWILUVWOHW
VWDONDERXWWKHJUDSKLFVPRGXOHZHDUHJRLQJWRXVHIRUVRPHRIWKHGHPRV

7KH*UDSKLFV0RGXOH

+DOIWKHZRUOGXVHV0LFURVRIW&DQG&FRPSLOHUVDQGWKHRWKHUKDOIXVHV%RUODQG&DQG&FRPSLOHUVVR
LW
VDOZD\VDSUREOHPSXEOLVKLQJGHPRVWKDWGHSHQGRQWKHXVHRIHLWKHU+HQFHZHDUHJRLQJWRZULWH&FRGH
WKDWLVWRWDOO\FRPSLOHULQGHSHQGHQWEDVHGRQDJUDSKLFVLQWHUIDFHWKDWZHDUHJRLQJWRZULWHRXUVHOYHVDQG
WKDWZLOOZRUNRQERWKFRPSLOHUV7KHJUDSKLFVLQWHUIDFHZLOOEHEDVHGRQJUDSKLFVPRGHKZKLFKLVE\
SL[HOVZLWKFRORUV)RUWKHVLPSOHGHPRVZHDUHJRLQJWRZULWHDOOZHZDQWWRGRLVSODFHWKH
9*$69*$FDUGLQPRGHKDQGSORWVLQJOHSL[HOVRQWKHVFUHHQ7KXVZHQHHGWZRIXQFWLRQV

Set_Video_Mode(int mode);

DQG

Plot_Pixel(int x, int y,unsigned char color);

:HZLOOXVHWKHYLGHR%,26IXQFWLRQKWRVHWWKHYLGHRPRGHEXWKRZFDQZHSORWSL[HOV"3ORWWLQJSL[HOVLQ
PRGHKLVYHU\VLPSOHEHFDXVHWKHJUDSKLFVDUHIXOO\PHPRU\PDSSHG%DVLFDOO\PRGHKLVDWRWDOO\
OLQHDUDUUD\RIPHPRU\WKDWUHSUHVHQWVHDFKSL[HOZLWKDVLQJOHE\WH)XUWKHUWKLVYLGHRPHPRU\VWDUWVDW
ORFDWLRQ$DQGFRQVLVWVRIURZVDQGFROXPQV7KHUHIRUHWRFRPSXWHWKHDGGUHVVRIDQ\
SL[HODW [\ ZHVLPSO\PXOWLSO\WKH<FRPSRQHQWE\DQGDGGWKH;2ULQRWKHUZRUGV

memory offset = y*320+x;

$GGLQJWKLVPHPRU\RIIVHWWR$JLYHVXVWKHILQDOPHPRU\ORFDWLRQWRDFFHVVWKHGHVLUHGVFUHHQ
SL[HO+HQFHLIZHDOLDVD)$5SRLQWHUWRWKHYLGHRPHPRU\OLNHWKLV

unsigned char far* video_buffer = (unsigned char far*)A0000000L;

7KHQZHFDQDFFHVVWKHYLGHRPHPRU\XVLQJDV\QWD[OLNH

video_buffer[y*320+x] = color;

$QGWKDW
VLW6RXVLQJWKDWLQIRUPDWLRQZHFDQWKHQZULWHDVLPSOHSL[HOSORWWLQJIXQFWLRQDQG
JUDSKLFVPRGHIXQFWLRQ7KHVHWZRIXQFWLRQVVKRXOGEHDGGHGWRHDFKGHPRVRWKDWWKHGHPRVFDQSHUIRUP
WKHJUDSKLFVUHODWHGIXQFWLRQVZLWKRXWKHOSIURPWKHFRPSLOHUGHSHQGHQWJUDSKLFVOLEUDU\:H
UHDOVRJRLQJWR
DGGDOLWWOHWLPHGHOD\IXQFWLRQEDVHGRQWKH3&
VLQWHUQDOWLPHU7KHIXQFWLRQLVFDOOHG7LPHB'HOD\ DQG
WDNHVDVLQJOHSDUDPHWHUZKLFKLVWKHQXPEHURIFOLFNVWRZDLWIRU/LVWLQJVKRZVWKHFRPSOHWHJUDSKLFV
LQWHUIDFHQDPHG*02'+IRUWKHGHPRVFRQWDLQHGZLWKLQWKLVDUWLFOH6LPSO\LQFOXGHWKHFRGHRIWKHJUDSKLFV
PRGXOHZLWKHDFKGHPRDQGHYHU\WKLQJVKRXOGZRUNILQH1RZWKDWZHKDYHWKHVRIWZDUHZHQHHGWRGR
JUDSKLFVOHW
VEHJLQRXUGLVFXVVLRQRI$,

/LVWLQJ7KH*UDSKLFV0RGXOH*02'+

// GMOD.H graphics module for demos

unsigned char far *video_buffer = (unsigned char far *)0xA0000000L;

void Plot_Pixel(int x,int y,int color)


{
// plots the pixel in the desired color a little quicker using binary shifting
// to accomplish the multiplications

video_buffer[((y<<8) + (y<<6)) + x] = (unsigned char )color;

} // end Plot_Pixel

void Set_Graphics_Mode(int mode)


{
// use the video interrupt 10h and the C interrupt function to set
// the video mode

union REGS inregs,outregs;

inregs.h.ah = 0; // set video mode sub-function


inregs.h.al = (unsigned char)mode; // video mode to change to
int86(0x10, &inregs, &outregs);

} // end Set_Graphics_Mode

void Time_Delay(int clicks)


{
// this function uses the internal timer to wait a specified number of "clicks"
// the actual amount of real time is the number of clicks * (time per click)
// usually the time per click is set to 1/18th of a second or 55ms

long far *clock = (long far *)0x0000046CL, // address of timer


start_time; // starting time

// get current time


start_time = *clock;

// when the current time minus the starting time >= the requested delay then
// the function can exit
while(labs(*clock - start_time) < (long)clicks){}

} // end Time_Delay

'HWHUPLQLVWLF$OJRULWKPV

'HWHUPLQLVWLFDOJRULWKPVDUHWKHVLPSOHVWRIWKH$,WHFKQLTXHVXVHGLQJDPHV7KHVHDOJRULWKPVXVHDVHWRI
YDULDEOHVDVWKHLQSXWDQGWKHQXVHVRPHVLPSOHUXOHVWRGULYHWKHFRPSXWHUFRQWUROOHGHQHPLHVRUJDPH
REMHFWVEDVHGRQWKHVHLQSXWV:HFDQWKLQNRIGHWHUPLQLVWLFDOJRULWKPVDVUHIOH[HVRUYHU\ORZOHYHOLQVWLQFWV
$FWLYDWHGE\VRPHVHWRIFRQGLWLRQVLQWKHHQYLURQPHQWWKHDOJRULWKPVWKHQSHUIRUPWKHGHVLUHGEHKDYLRU
UHOHQWOHVVO\ZLWKRXWFRQFHUQIRUWKHRXWFRPHWKHSDVWRUIXWXUHHYHQWV

7KHFKDVHDOJRULWKPLVDFODVVLFH[DPSOHRIDGHWHUPLQLVWLFDOJRULWKP7KHFKDVHDOJRULWKPLVEDVLFDOO\D
PHWKRGRILQWHOOLJHQFHXVHGWRKXQWGRZQWKHSOD\HURUVRPHRWKHUREMHFWRILQWHUHVWLQDJDPHE\DSSO\LQJ
WKHVSDWLDOFRRUGLQDWHVRIWKHFRPSXWHUFRQWUROOHGREMHFWDQGWKHREMHFWWREHWUDFNHG,PDJLQHDJDPHZLWK
DWRSGRZQYLHZRIDEDWWOHJURXQGRQZKLFKWKUHHFRPSXWHUFRQWUROOHGEDGJX\VDQGRQHSOD\HUDUHILJKWLQJ
7KHTXHVWLRQLVKRZFDQZHPDNHWKHFRPSXWHUFRQWUROOHGEDGJX\VWUDFNDQGPRYHWRZDUGWKHSOD\HU"2QH
ZD\LVWRXVHWKHFRRUGLQDWHVRIWKHEDGJX\VDQGWKHFRRUGLQDWHVRIWKHSOD\HUDVLQSXWVLQWRDGHWHUPLQLVWLF
DOJRULWKPWKDWRXWSXWVGLUHFWLRQFKDQJHVRUGLUHFWLRQYHFWRUVIRUWKHEDGJX\VLQUHDOWLPH

/HW
VXVHEDGJX\RQHDVWKHH[DPSOH:HVHHWKDWKHLVORFDWHGDWFRRUGLQDWHV E[E\ DQGWKHSOD\HULV
ORFDWHGDWFRRUGLQDWHV S[S\ 7KHUHIRUHDVLPSOHDOJRULWKPWRPDNHWKHEDGJX\PRYHWRZDUGWKHSOD\HU
ZRXOGEH
// process x-coords
if (px>bx1) bx1++;
else

if (px<bx1) bx1--;

// process y-coords
if (py>by1) by1++;
else

if (py<by1) by1--;

7KDW
VDOOWKHUHLVWRLW,IZHZDQWHGWRUHYHUVHWKHORJLFDQGPDNHWKHEDGJX\UXQWKHQWKHFRQGLWLRQDOORJLF
FRXOGEHLQYHUWHGRUWKHRXWFRPHLQFUHPHQWRSHUDWRUVFRXOGEHLQYHUWHG$VDQH[DPSOHRIGHWHUPLQLVWLF
ORJLF/LVWLQJLVDFRPSOHWHSURJUDPWKDWZLOOPDNHDOLWWOHFRPSXWHUFRQWUROOHGGRWFKDVHDSOD\HUFRQWUROOHG
GRW8VHWKHQXPHULFNH\SDGWRFRQWURO\RXUSOD\HUDQGSUHVV(6&WRH[LWWKHSURJUDP

/LVWLQJ$'HPRRI'HWHUPLQLVWLF/RJLF

// Deterministic chasing algorithm demo


// use numeric keypad to move player

#include <io.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <bios.h>
#include <math.h>
#include <string.h>

#include "gmod.h" // include our graphics module

int main(void)
{

int px=160, // starting position of player


py=100,
bx=0, // starting position of bad guy
by=0,
done=0; // exit flag

// set the video mode to 13h


Set_Graphics_Mode(0x13);

// main event loop


while(!done)
{
// perform player logic

// get input from keyboard


if (kbhit())

// which way is player moving?


switch(getch())
{
case '8': // up
{

if ((py-=2)<0)
py+=200;

} break;

case '2': // down


{

if ((py+=2)>=200)
py-=200;

} break;

case '6': // right


{
if ((px+=2)>=320)
px-=320;

} break;

case '4': // left


{

if ((px-=2)<0)
px+=320;

} break;

case 27: // exit


{
done=1;
} break;

} // end switch

} // end if

// perform bad guy logic


if (px>bx)
bx++;
else
if (px<bx)
bx-;

if (py>by)
by++;
else
if (py<by)
by-;

// draw player and bad guy


Plot_Pixel(bx,by,12);
Plot_Pixel(px,py,9);

// wait a bit
Time_Delay(1);

} // end main while

// reset graphics back to text


Set_Graphics_Mode(0x03);

// return success to DOS


return(0);

} // end main

1RZOHW
VPRYHRQWRDQRWKHUW\SLFDOEHKDYLRUZKLFKZHFDQFDWHJRUL]HDVUDQGRPORJLF

5DQGRP/RJLF

6RPHWLPHVDQLQWHOOLJHQWFUHDWXUHH[KLELWVDOPRVWUDQGRPEHKDYLRUV7KHVHUDQGRPEHKDYLRUVPD\EHWKH
UHVXOWRIDQ\RQHRIDQXPEHURILQWHUQDOSURFHVVHVEXWWKHUHDUHWZRPDLQRQHVWKDWZHVKRXOGWRXFK
XSRQODFNRILQIRUPDWLRQDQGGHVLUHGUDQGRPQHVV

7KHILUVWSUHPLVHLVDQREYLRXVRQH0DQ\WLPHVDQLQWHOOLJHQWFUHDWXUHGRHVQRWKDYHHQRXJKLQIRUPDWLRQWR
PDNHDGHFLVLRQRUPD\QRWKDYHDQ\LQIRUPDWLRQDWDOO7KHFUHDWXUHWKHQVLPSO\GRHVWKHEHVWLWFDQZKLFK
LVWRVHOHFWDUDQGRPEHKDYLRULQKRSHVWKDWLWPLJKWEHWKHFRUUHFWRQHIRUWKHVLWXDWLRQ)RUH[DPSOHOHW
V
VD\\RXZHUHGURSSHGLQWRDGXQJHRQDQGSUHVHQWHGZLWKIRXULGHQWLFDOGRRUV.QRZLQJWKDWDOOEXWRQH
PHDQWFHUWDLQGHDWK\RXZRXOGVLPSO\KDYHWRUDQGRPO\VHOHFWRQH

7KHVHFRQGSUHPLVHWKDWEULQJVRQDUDQGRPVHOHFWLRQLVLQWHQWLRQDO)RUH[DPSOHVD\\RXDUHDVS\WU\LQJWR
PDNHDJHWDZD\DIWHUDFTXLULQJVRPHVHFUHWGRFXPHQWV WKLVKDSSHQVWRPHDOOWKHWLPH 1RZLPDJLQH\RX
KDYHEHHQVHHQDQGWKHEDGJX\VVWDUWVKRRWLQJDW\RX,I\RXUXQLQDVWUDLJKWOLQHFKDQFHVDUH\RXDUH
JRLQJWRJHWVKRW+RZHYHULIGXULQJ\RXUHVFDSH\RXPDNHPDQ\UDQGRPGLUHFWLRQFKDQJHVDQG]LJ]DJDELW
\RXZLOOJHWDZD\HYHU\WLPH

:KDWZHOHDUQIURPWKDWH[DPSOHLVWKDWPDQ\WLPHVUDQGRPORJLFDQGVHOHFWLRQVDUHJRRGEHFDXVHLWPDNHV
LWKDUGHUIRUWKHSOD\HUWRGHWHUPLQHZKDWWKHEDGJX\VDUHJRLQJWRGRQH[WDQGLW
VDJRRGZD\WRKHOSWKH
EDGJX\VPDNHDVHOHFWLRQZKHQWKHUHLVQ
WHQRXJKLQIRUPDWLRQWRXVHDGHWHUPLQLVWLFDOJRULWKP0RWLRQ
FRQWUROLVDW\SLFDOSODFHWRDSSO\UDQGRPORJLFLQEDGJX\$,<RXFDQXVHDUDQGRPQXPEHURUSUREDELOLW\
WRVHOHFWDQHZGLUHFWLRQIRUWKHEDGJX\DVDIXQFWLRQRIWLPH/HW
VHQYLVLRQDPXOWLSOD\HUJDPHZLWKD
VLQJOHFRPSXWHUFRQWUROOHGEDGJX\VXUURXQGHGE\IRXUKXPDQSOD\HUV7KLVLVDJUHDWSODFHWRDSSO\
UDQGRPPRWLRQXVLQJWKHIROORZLQJORJLF

// select a random translation for X axis


bx1 = bx1 + rand()%11 - 5;
// select a random translation for Y axis
by1 = by1 + rand()%11 - 5;

7KHSRVLWLRQRIWKHEDGJX\LVWUDQVODWHGE\DUDQGRPDPRXQWLQERWK;DQG<ZKLFKLQWKLVFDVHLV
SL[HOVRUXQLWV

2IFRXUVHZHFDQXVHUDQGRPORJLFIRUDORWRIRWKHUWKLQJVEHVLGHVGLUHFWLRQFKDQJHV6WDUWLQJSRVLWLRQV
SRZHUOHYHOVDQGSUREDELOLW\RIILULQJZHDSRQVDUHDOOJRRGSODFHVWRDSSO\UDQGRPORJLF,W
VGHILQLWHO\D
JRRGWHFKQLTXHWKDWDGGVDELWRIXQSUHGLFWDELOLW\WRJDPH$,/LVWLQJLVDGHPRRIUDQGRPORJLFXVHGWR
FRQWUROPRWLRQ7KHGHPRFUHDWHVDQDUUD\RIIOLHVDQGXVHVUDQGRPORJLFWRPRYHWKHPDURXQG3UHVV(6&WR
H[LWWKHGHPR

/LVWLQJ$%XQFKRI'XPE)OLHV

// Random logic demo


// moves a flock of flies around
// hit any key to exit

#include <io.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <bios.h>
#include <math.h>
#include <string.h>

#include "gmod.h" // include our graphics module

#define NUM_FLIES 64 // start off with 64 flies

typedef struct fly_typ


{
int x,y; // position of fly
} fly;

int main(void)
{

fly flys[NUM_FLIES]; // the array of flies

int index; // looping variable

// set the video mode to 13h


Set_Graphics_Mode(0x13);

// initialize all flies to random position


for (index=0; index<NUM_FLIES; index++)
{
flys[index].x = rand()%320;
flys[index].y = rand()%200;
} // end for index

// main event loop


while(!kbhit())
{
// erase flies

for (index=0; index<NUM_FLIES;


index++)
Plot_Pixel(flys[index].x,flys[index].y,0);

// perform fly logic, translate


each fly +-2 pixels
for (index=0; index<NUM_FLIES;
index++)
{
flys[index].x+=(-2+rand()%5);
flys[index].y+=(-2+rand()%5);
} // end for index

// draw flies
for (index=0; index<NUM_FLIES;
index++)
Plot_Pixel(flys[index].x,flys[index].y,10);

// wait a bit
Time_Delay(2);

} // end main while

// reset graphics back to text


Set_Graphics_Mode(0x03);

// return success to DOS


return(0);

} // end main

1RZOHW
VWDONDERXWSDWWHUQV

(QFRGHG/LVW3URFHVVLQJ

0DQ\LQWHOOLJHQWFUHDWXUHVKDYHSUHUHFRUGHGSDWWHUQVRUOLVWVRIEHKDYLRUVWKDWWKH\KDYHHLWKHUOHDUQHGIURP
H[SHULHQFHRUDUHLQVWLQFWLYH:HFDQWKLQNRIDSDWWHUQDVDVHTXHQFHRIVWHSVZHSHUIRUPWRDFFRPSOLVKD
WDVN*UDQWHGWKLVVHTXHQFHPD\EHLQWHUUXSWHGLIVRPHWKLQJKDSSHQVGXULQJWKHVHTXHQFHWKDWQHHGV
DWWHQWLRQ%XWLQJHQHUDOLIZHIRUJHWDERXWLQWHUUXSWLRQVWKHQZHFDQWKLQNRISDWWHUQVDVDOLVWRIHQFRGHG
LQVWUXFWLRQVWKDWDQLQWHOOLJHQWFUHDWXUHFRQVXPHVWRDFFRPSOLVKVRPHWDVN

)RUH[DPSOHZKHQ\RXGULYHWRZRUNVFKRRORU\RXUJLUOIULHQG
VRUER\IULHQG
VKRXVH\RXDUHIROORZLQJD
SDWWHUQ<RXJHWLQWR\RXUFDUVWDUWLWGULYHWRWKHGHVWLQDWLRQVWRSWKHFDUWXUQLWRIIJHWRXWDQGILQDOO\GR
ZKDWHYHULWLV\RX
UHJRLQJWRGR7KLVLVDSDWWHUQRIEHKDYLRU$OWKRXJKGXULQJWKHHQWLUHH[SHULHQFHDELOOLRQ
WKLQJVPD\KDYHJRQHWKURXJK\RXUKHDGWKHREVHUYHGEHKDYLRUZDVDFWXDOO\YHU\VLPSOH+HQFHSDWWHUQV
DUHDJRRGZD\WRLPSOHPHQWVHHPLQJO\FRPSOH[WKRXJKWSURFHVVHVLQJDPH$,,QIDFWPDQ\JDPHVWRGD\
VWLOOXVHSDWWHUQVIRUPXFKRIWKHJDPHORJLF

6RKRZFDQZHLPSOHPHQWSDWWHUQVIRUJDPH$,"6LPSO\E\XVLQJDQLQSXWDUUD\WRDOLVWSURFHVVRU7KH
RXWSXWRIWKHSURFHVVRULVWKHFRQWURORIDJDPHREMHFWRUEDGJX\,QWKLVFDVHWKHHQFRGHGOLVWKDVWKH
IROORZLQJVHWRIYDOLGLQVWUXFWLRQV

Turn right
Turn left
Move forward
Move backward
Sit still
Fire weapon

(YHQWKRXJKZHRQO\KDYHVL[VHOHFWLRQVZHFDQFRQVWUXFWTXLWHDIHZSDWWHUQVZLWKDVKRUWLQSXWOLVWRI
HOHPHQWVDVLQWKHH[DPSOH,QIDFWWKHUHDUHGLIIHUHQWSRVVLEOHSDWWHUQVRUURXJKO\WULOOLRQGLIIHUHQW
EHKDYLRUV,WKLQNWKDW
VHQRXJKWRPDNHVRPHWKLQJORRNLQWHOOLJHQW6RKRZFDQZHXVHHQFRGHGOLVWVDQG
SDWWHUQVLQDJDPHIRUWKH$,"2QHVROLGZD\LVWRXVHWKHPWRFRQWUROWKHPRWLRQRIDEDGJX\RUJDPH
REMHFW)RUH[DPSOHDGHWHUPLQLVWLFDOJRULWKPPLJKWGHFLGHLW
VWLPHWRPDNHDEDGJX\SHUIRUPVRPH
FRPSOH[PRWLRQWKDWZRXOGEHGLIILFXOWLIZHXVHGVWDQGDUGFRQGLWLRQDOORJLF7KXVZHFRXOGXVHWKDWSDWWHUQ
ZKLFKVLPSO\UHDGVDQHQFRGHGOLVWGLUHFWLQJWKHEDGJX\WRPDNHVRPHWULFN\PRYHV)RUH[DPSOHZHPLJKW
KDYHDVLPSOHDOJRULWKPOLNHWKLV

int move_x[16] = {-2,0,0,0,3,3,2,1,0, -2,-2,-,0,1,2,3,4};


int move_y[16] = {0,0,0,1,1,1,0,0,-1,-1, 2,3,4,0,0.-1};

// encoded pattern logic for a 16 element list


for (index=0; index<16; index++)
{
bx1+=move_x[index]; by1+=move_y[index];
}
// end for index

<RX
OOQRWLFHWKDWWKHHQFRGHGSDWWHUQLVPDGHXSVLPSO\RI;DQG<WUDQVODWLRQV7KHSDWWHUQFRXOGMXVWDV
ZHOOKDYHFRQWDLQHGFRPSOH[UHFRUGVZLWKDPXOWLWXGHRIGDWDILHOGV,
YHZULWWHQGHWDLOHGFRGHWKDWZLOOFUHDWH
DQH[DPSOHRISDWWHUQVDQGOLVWSURFHVVLQJDGHPRRIDQDQWWKDWFDQSURFHVVRQHRIIRXUSDWWHUQVVHOHFWHG
E\WKHNH\V8QIRUWXQDWHO\LW
VWRRORQJWRSULQWKHUH*RWRWKH*DPH'HYHORSHUIWSVLWHDQG\RXFDQ
GRZQORDGLWWKHUH

1RZZH
UHVWDUWLQJWRJHWVRPHZKHUHEXWZHQHHGDQRYHUDOOFRQWUROXQLWZLWKVRPHIRUPRIPHPRU\DQGZH
PXVWVHOHFWWKHDSSURSULDWHW\SHVRIEHKDYLRUV

)LQLWH6WDWH0DFKLQHV

)LQLWHVWDWHPDFKLQHVRU)60VDUHDEVWUDFWPRGHOVWKDWFDQEHLPSOHPHQWHGHLWKHULQKDUGZDUHRUVRIWZDUH
)60VDUHQRWUHDOO\PDFKLQHVLQWKHPHFKDQLFDOVHQVHRIWKHZRUGEXWUDWKHUDEVWUDFWPRGHOVZLWKDVHWRI
VWDWHVWKDWFDQEHWUDYHUVHG:LWKLQWKHVHVWDWHVWKH)60QRWRQO\KDVDVSHFLDOVHWRIRXWSXWVEXW
UHPHPEHUVWKHVWDWHDQGFDQWUDQVLWLRQWRDQRWKHUVWDWHLIDQGRQO\LIDVHWRILQSXWVRUSUHPLVHVDUHPHW
6D\ZHKDYHDW\SLFDOILQLWHVWDWHPDFKLQHLQZKLFKWKHUHDUHDVHWRIVWDWHVODEHOHG666DQG6QDQG
ZLWKLQHDFKVWDWHLVDVHWRIRXWSXWV7KHVHRXWSXWVFDQEHDQ\WKLQJZHZLVKIURPPRWLRQFRQWUROVIRUD
JDPH
VEDGJX\VWRKDUGGLVNFRPPDQGV+RZGRZHPRGHODQ)60LQVRIWZDUHDQGXVHLWWRFRQWUROWKH
JDPH$,"/HW
VEHJLQZLWKWKHILUVWTXHVWLRQ

:HFDQPRGHODQ)60ZLWKDVLQJOHYDULDEOHDQGDVHWRIORJLFDOFRQGLWLRQVXVHGWRPDNHVWDWHWUDQVLWLRQV
DORQJZLWKWKHRXWSXWIRUHDFKVWDWH)RUH[DPSOHOHW
VDFWXDOO\EXLOGDVLPSOHVRIWZDUHVWDWHPDFKLQHWKDW
FRQWUROVDFRPSXWHUEDGJX\GLIIHUHQWO\EDVHGRQWKHEDGJX\
VGLVWDQFHWRWKHSOD\HU7KHVWDWHPDFKLQHZLOO
KDYHWKHIROORZLQJIRXUVWDWHV

6WDWH6HOHFWQHZVWDWH 67$7(B1(:
6WDWH0RYHUDQGRPO\ 67$7(B5$1'20
6WDWH7UDFNSOD\HU 67$7(B75$&.
6WDWH8VHDSDWWHUQ 67$7(B3$77(51

7KH)60
VWUDQVLWLRQVKRXOGEHVHWXSVRWKDWLIWKHEDGJX\LVZLWKLQXQLWVRIWKHSOD\HUWKHQWKHEDGJX\
PRYHVLQWR6WDWHDQGVLPSO\DWWDFNV,IWKHEDGJX\LVLQWKHUDQJHRIWRXQLWVIURPWKHSOD\HUWKHQ
WKHEDGJX\JRHVLQWR6WDWHDQGPRYHVLQDSDWWHUQ)LQDOO\LIWKHEDGJX\LVIDUWKHUWKDQXQLWVIURP
WKHSOD\HUWKHQFKDQFHVDUHWKHEDGJX\FDQ
WHYHQVHHWKHSOD\HU LQWKHLPDJLQDU\FRPSXWHUXQLYHUVH ,Q
WKDWFDVHWKHEDGJX\PRYHVLQWR6WDWHZKLFKLVUDQGRPPRWLRQ

6RKRZFDQZHLPSOHPHQWWKLVVLPSOH)60PDFKLQH"$OOZHQHHGLVDYDULDEOHWRUHFRUGWKHFXUUHQWVWDWHDQG
VRPHFRQGLWLRQDOORJLFWRSHUIRUPWKHVWDWHWUDQVLWLRQVDQGRXWSXWV/LVWLQJVKRZVDURXJKDOJRULWKPWKDW
ZLOOGRDOOWKLV

/LVWLQJ7KH&RUH)60/RJLF

typedef unsigned short DISTANCE;


const DISTANCE Tracking_Threshold = 50;
const DISTANCE Random_Threshold = 100;
DISTANCE theDistance;

//Define states and initialize


enum states{new, random, track, pattern};
states currentState = new;

//FSM loop
for(;;){
switch (currentState)
{
case new:

//Note: Switchbox only, causes no behavior


theDistance = CalcDistanceToPlayer();

if (theDistance > Random_Threshold){


currentState = random;
}

else {
if (theDistance > Tracking_Threshold) {
currentState = pattern;
}

else {
currentState = track;
}
}
break;
case track:
DoTrackBehavior();
currentState = new;
break;

case pattern:
DoPatternBehavior();
currentState = new;
break;

case random:
DoRandomBehavior();
currentState = new;
break;

case default:
cerr<<"state machine has entered an unknown
state\n";
assert(FAIL);
}
}

1RWHWKDW6 WKHQHZVWDWH GRHVQRWWULJJHUDQ\EHKDYLRURQWKHSDUWRIWKHRSSRQHQW5DWKHULWDFWVDVD


VWDWHVZLWFKER[WRZKLFKDOOVWDWHV H[FHSWLWVHOI WUDQVLWLRQ7KLVDOORZV\RXWRORFDOL]HLQDVLQJOHFRQWURO
EORFNDOOWKHGHFLVLRQPDNLQJDERXWWUDQVLWLRQV

$OWKRXJKWKLVUHTXLUHVWZRF\FOHVWKURXJKWKH)60ORRSWRFUHDWHRQHEHKDYLRULW
VZHOOZRUWKLW,QWKHFDVH
RIDVPDOO)60WKHHQWLUHORRSFDQVWD\LQWKHFDFKHDQGLQWKHFDVHRIDODUJH)60ORRSWKHORFDOL]DWLRQRI
WKHWUDQVLWLRQORJLFZLOOPRUHWKDQSD\IRUWKHSHUIRUPDQFHSHQDOW\,I\RXDEVROXWHO\UHIXVHWRGRXEOHORRS
\RXFDQKDQGFUDIWWKHWUDQVLWLRQVEHWZHHQVWDWHV$ILQLWHVWDWHPDFKLQHGLDJUDPZLOOYLYLGO\LOOXVWUDWHLQWKH
IRUPRIVSDJKHWWLWUDQVLWLRQVZKHQ\RXUWUDQVLWLRQORJLFLVRXWRIFRQWURO

1RZWKDWZHKDYHDQRYHUDOOWKRXJKWFRQWUROOHUWKDWLVDQ)60ZHVKRXOGGLVFXVVVLPXODWLQJVHQVRU\
H[FLWDWLRQLQDYLUWXDOZRUOG

(QYLURQPHQWDO6HQVLQJ

2QHSUREOHPWKDWSODJXHV$,JDPHSURJUDPPLQJLVWKDWLWFDQEHYHU\XQIDLUDWOHDVWWRWKHSOD\HU7KH
UHDVRQIRUWKLVLVWKDWWKHSOD\HUFDQRQO\VHHZKDW
VRQWKHFRPSXWHUVFUHHQZKHUHDVWKHFRPSXWHU$,
V\VWHPKDVDFFHVVWRDOOYDULDEOHVDQGGDWDWKDWWKHSOD\HUFDQ
WDFFHVV

7KLVEULQJVXVWRWKHFRQFHSWRIVLPXODWHGVHQVRU\RUJDQVIRUWKHEDGJX\VDQGJDPHREMHFWV)RUH[DPSOH
LQDWKUHHGLPHQVLRQDOWDQNJDPHWKDWWDNHVSODFHRQDIODWSODLQWKHSOD\HUFDQRQO\VHHVRIDUEDVHGRQKLV
RUKHUILHOGRIYLHZ)XUWKHUWKHSOD\HUFDQ
WVHHWKURXJKURFNVEXLOGLQJVDQGREVWDFOHV+RZHYHUEHFDXVH
WKHJDPHORJLFKDVDFFHVVWRDOOWKHV\VWHPYDULDEOHVDQGGDWDVWUXFWXUHVLWLVWHPSWLQJIRULWWRXVHWKLV
H[WUDGDWDWRKHOSZLWKWKH$,IRUWKHEDGJX\V

7KHTXHVWLRQLVLVWKLVIDLUWRWKHSOD\HU":HOORIFRXUVHQRW6RKRZFDQZHPDNHVXUHZHVXSSO\WKH$,
HQJLQHRIWKHEDGJX\VDQGJDPHREMHFWVZLWKWKHVDPHLQIRUPDWLRQWKHSOD\HUKDV":HPXVWXVHVLPXODWHG
VHQVRU\LQSXWVVXFKDVYLVLRQKHDULQJYLEUDWLRQDQGWKHOLNH(DFKRSSRQHQWDQGWKHSOD\HUKDVDFRQHRI
YLVLRQDVVRFLDWHGZLWKLW%RWKWKHEDGJX\VDQGWKHSOD\HUFDQRQO\VHHREMHFWVZLWKLQWKLVFRQH7KHSOD\HU
FDQRQO\VHHZLWKLQWKLVFRQHDVDIXQFWLRQRIWKH'JUDSKLFVHQJLQHEXWWKHEDGJX\VFDQRQO\VHHZLWKLQ
WKLVFRQHDVDIXQFWLRQRIWKHLU$,SURJUDP/HW
VEHDOLWWOHPRUHVSHFLILFDERXWWKLV

6LQFHZHNQRZWKDWZHPXVWEHIDLUWRWKHSOD\HUZKDWZHFDQGRLVZULWHDVLPSOHDOJRULWKPWKDWVFDQVWKH
DUHDLQIURQWRIHDFKEDGJX\DQGGHWHUPLQHVLIWKHSOD\HULVZLWKLQYLHZ7KLVVFDQQLQJLVVLPLODUWRWKHSOD\HU
YLHZLQJWKHYLHZSRUWRUORRNLQJRXWWKHYLUWXDOZLQGRZ2IFRXUVHZHGRQ
WQHHGWRSHUIRUPDIXOO
WKUHHGLPHQVLRQDOVFDQZLWKUD\WUDFLQJRUWKHOLNHZHFDQVLPSO\PDNHVXUHWKHSOD\HULVZLWKLQWKHYLHZ
DQJOHRIWKHEDGJX\LQTXHVWLRQE\XVLQJWULJRQRPHWU\RIDQ\WHFKQLTXHZHZLVK

%DVHGRQWKHLQIRUPDWLRQREWDLQHGIURPHDFKEDGJX\VFDQWKHSURSHU$,GHFLVLRQFDQEHPDGHLQDPRUH
XQLIRUPDQGIDLUPDQQHU2IFRXUVHZHPD\ZDQWWRJLYHWKHFRPSXWHUFRQWUROOHG$,V\VWHPPRUHDGYDQWDJH
WKDQWKHKXPDQSOD\HUWRPDNHXSIRUWKH$,V\VWHPLWVHOIEHLQJUDWKHUSULPLWLYHZKHQFRPSDUHGWRWKH
ELOOLRQFHOOQHXUDOQHWZRUNLWLVFRPSHWLQJDJDLQVWEXW\RXJHWWKHLGHD

)LQDOO\ZHPLJKWDVN&DQZHSHUIRUPRWKHUNLQGVRIVHQVLQJ"<HV:HFDQFUHDWHVLPXODWHGOLJKWGHWHFWRUV
VRXQGGHWHFWRUVDQGVRIRUWK,KDYHEHHQH[SHULPHQWLQJZLWKDQXQGHUZDWHUJDPHHQJLQHDQGLQWRWDO
GDUNQHVVWKHRQO\ZD\WKHHQHP\FUHDWXUHVFDQVHH\RXLVWROLVWHQWR\RXUSURSXOVLRQXQLWV%DVHGRQWKH
SRZHUOHYHORIWKHSOD\HU
VHQJLQHVWKHJDPH$,GHWHUPLQHVWKHVRXQGOHYHOWKDWWKHEDGJX\VKHDUDQG
PRYHVWKHPWRZDUGWKHVRXQGVRXUFHRUVRXUFHV

0HPRU\DQG/HDUQLQJ

7KHILQDOWRSLFZH
UHJRLQJWRWRXFKXSRQLVPHPRU\DQGOHDUQLQJ0HPRU\LVHDV\HQRXJKWRXQGHUVWDQGEXW
OHDUQLQJLVDELWPRUHQHEXORXV/HDUQLQJDVIDUDVZHDUHFRQFHUQHGLVWKHDELOLW\WRLQWHUDFWLQDQ
HQYLURQPHQWLQVXFKDZD\WKDWEHKDYLRUVWKDWVHHPWRZRUNEHWWHUWKDQRWKHUVXQGHUFHUWDLQFRQGLWLRQVDUH
PHPRUL]HGDQGXVHGPRUHRIWHQ,QHVVHQFHOHDUQLQJLVEDVHGRQPHPRU\RISDVWDFWLRQVEHLQJJRRGRU
EDGRUZKDWHYHU,PDJLQHWKDWZHKDYHZULWWHQDIDLUO\FRPSOH[JDPHFRPSRVHGRIFRPSXWHUFRQWUROOHG
DOLHQV7KHVHDOLHQVXVHDQ)60EDVHG$,HQJLQHDQGHQYLURQPHQWDOVHQVLQJ7KHSUREOHPLVWKDWRQHRIWKH
UHVRXUFHVLQWKHJDPHLVHQHUJLRQFXEHVDQGWKHSOD\HUDQGDOLHQVPXVWFRPSHWHIRUWKHVHFXEHV

$VWKHSOD\HULVPRYLQJDURXQGLQWKHHQYLURQPHQWKHRUVKHFDQFUHDWHDPHQWDOPDSRIZKHUHHQHUJLRQ
FXEHVVHHPWREHSOHQWLIXOEXWWKHDOLHQFUHDWXUHVKDYHQRVXFKDELOLW\WKH\FDQRQO\VWDQGDQGDUHDWD
GLVDGYDQWDJH&DQZHJLYHWKHPDPHPRU\DQGWHDFKWKHPZKHUHWKHVHHQHUJLRQFXEHVDUH"2IFRXUVHZH
FDQZHDUHF\EHUJRGV

2QHVXFKLPSOHPHQWDWLRQZRXOGZRUNDVIROORZV:HFRXOGXVHDVLPSOHGDWDVWUXFWXUHWKDWZRXOGWUDFNWKH
QXPEHURIWLPHVDQDOLHQIRXQGHQHUJLRQLQHDFKJHRJUDSKLFDOUHJLRQRIWKHJDPH7KHQZKHQDQDOLHQZDV
SRZHUKXQJU\LQVWHDGRIUDQGRPO\ERXQFLQJDURXQGWKHDOLHQZRXOGUHIHUWRWKLVPHPRU\GDWDVWUXFWXUHDQG
VHOHFWWKHJHRJUDSKLFDOUHJLRQZLWKWKHKLJKHVWSUREDELOLW\RIILQGLQJHQHUJLRQDQGVHWLWVWUDMHFWRU\IRUWKLV
UHJLRQ

7KHSUHYLRXVH[DPSOHLVDVLPSOHRQHEXWDVZHFDQVHHPHPRU\DQGOHDUQLQJDUHDFWXDOO\YHU\HDV\WR
LPSOHPHQW0RUHRYHUZHFDQPDNHWKHFRPSXWHU$,OHDUQPXFKPRUHWKDQZKHUHHQHUJLRQLV,WFRXOGOHDUQ
WKHPRVWFRPPRQGHIHQVLYHPRYHVRIWKHSOD\HUDQGXVHWKLVLQIRUPDWLRQDJDLQVWWKHSOD\HU

:HOOWKDW
VHQRXJKIRUEDVLF$,WHFKQLTXHV/HW
VWDNHDTXLFNORRNDWKRZZHFDQSXWLWDOOWRJHWKHU

%XLOGLQJ0RQVWHUVIURPWKH,G

:HKDYHTXLWHDUHSHUWRLUHRIFRPSXWHU$,WULFNVDWRXUILQJHUWLSVVRKRZVKRXOGZHXVHLWDOO"%DVLFDOO\
ZKHQ\RXZULWHDJDPHDQGDUHLPSOHPHQWLQJWKH$,\RXVKRXOGOLVWWKHW\SHVRIEHKDYLRUVWKDWHDFKJDPH
REMHFWRUEDGJX\QHHGVWRH[KLELW6LPSOHFUHDWXUHVVKRXOGXVHGHWHUPLQLVWLFORJLFUDQGRPQHVVDQG
SDWWHUQV&RPSOH[FUHDWXUHVWKDWZLOOLQWHUDFWZLWKWKHSOD\HUVKRXOGXVHDQ)60EDVHG$,HQJLQH$QGWKH
PDLQJDPHREMHFWVWKDWKDUDVVDQGWHVWWKHSOD\HUVKRXOGXVHDQ)60DQGVHQVRU\LQSXWVDQGPHPRU\

7KH)XWXUH

,VHH$,DVWKHQH[WIURQWLHUWRH[SORUH:LWKRXWDGRXEWPRVWJDPHSURJUDPPHUVKDYHIRFXVHGVRPXFKRQ
JUDSKLFVWKDW$,KDVQ
WEHHQUHVHDUFKHGPXFK7KHLURQ\LVWKDWUHVHDUFKHUVKDYHEHHQPDNLQJOHDSVDQG
ERXQGVLQ$,UHVHDUFKDQG$UWLILFLDO/LIHRU$/LIH

,
PVXUH\RX
YHKHDUGWKHFRPPRQWHUPVJHQHWLFDOJRULWKPVDQGQHXUDOQHWZRUNV*HQHWLFDOJRULWKPVDUH
VLPSO\DPHWKRGRIUHSUHVHQWLQJVRPHDVSHFWRIDFRPSXWHUEDVHG$,PRGHOZLWKDVHWRIJHQHVZKLFKFDQ
UHSUHVHQWZKDWHYHUZHZLVKDJJUHVVLYHQHVVPD[LPXPVSHHGPD[LPXPYLVLRQGLVWDQFHDQGVRRQ7KHQD
SRSXODWLRQRIFUHDWXUHVLVJHQHUDWHGXVLQJDQDOJRULWKPWKDWDGGVDOLWWOHUDQGRPQHVVLQHDFKRIWKHRXWSXW
FUHDWXUHV
JHQHV

2XUJDPHZRUOGLVWKHQSRSXODWHGZLWKWKHVHJHQHEDVHGFUHDWXUHV$VWKHFUHDWXUHVLQWHUDFWLQWKH
HQYLURQPHQWWKH\DUHNLOOHGVXUYLYHDQGDUHUHERUQ7KHELRORJLFDODQDORJFRPHVLQWRSOD\GXULQJWKH
UHELUWKLQJSKDVH(LWKHUPDQXDOO\RUE\VRPHRWKHUPHDQVWKHFRPSXWHU$,HQJLQHPDWHVYDULRXVSDLUVRI
FUHDWXUHVDQGPL[HVWKHLUJHQHV7KHUHVXOWLQJRIIVSULQJWKHQVXUYLYHDQRWKHUJHQHUDWLRQDQGWKHSURFHVV
FRQWLQXHV7KLVFDXVHVWKHFUHDWXUHVWRHYROYHVRWKDWWKH\DUHPRVWDGDSWHGIRUWKHJLYHQHQYLURQPHQW

1HXUDOQHWZRUNVRQWKHRWKHUKDQGDUHFRPSXWHUDEVWUDFWLRQVRIDFROOHFWLRQRIEUDLQFHOOVWKDWKDYHILULQJ
WKUHVKROGV<RXFDQHQKDQFHRUGLPLQLVKWKHVHWKUHVKROGVDQGWKHFRQQHFWLRQVEHWZHHQFHOOV%\WHDFKLQJD
QHXUDOQHWZRUNRUVWUHQJWKHQLQJDQGZHDNHQLQJWKHVHFRQQHFWLRQVWKHQHXUDOQHWFDQOHDUQVRPHWKLQJ6R
ZHFDQXVHWKHVHQHWVWRKHOSPDNHGHFLVLRQVDQGHYHQFRPHXSZLWKQHZPHWKRGV
$QGUH/D0RWKHLVWKHDXWKRURIWKHEHVWVHOOLQJ7ULFNVRIWKH*DPH3URJUDPPLQJ*XUXV 6$06
3XEOLVKLQJ DQG7HDFK<RXUVHOI*DPH3URJUDPPLQJLQ'D\V 6$063XEOLVKLQJ 
+LVODWHVWFUHDWLRQLVWKH%ODFN$UWRI'*DPH3URJUDPPLQJ :DLWH*URXS3UHVV 

You might also like