Blog Post

Small Basic Blog
4 MIN READ

Small Basic Game Programming - Separation Between Data And Procedure

NonkiTakahashi's avatar
NonkiTakahashi
Iron Contributor
Feb 12, 2019
First published on MSDN on Jul 28, 2014

Authored by Nonki Takahashi


Last week, I introduced a text adventure game.  If I expand the game story of that manner as in the program, the program will have a lot of If statements and Goto statements.   Today, I will introduce rewritten program with less If and Goto statements.  The updated version is published as FCD758-1 ,


Main


Main part of this program became very simple.



1. ' Text Adventure 0.2

2. ' Program ID FCD758-1

3. Init ( )

4. Game ( )

5. ' end of program


Initialization for Scenario Data


This data is like a main program of the previous text adventure program introduced last week.  So, this data is a kind of script language.  The grammar of this scenario data is:



  • A line started with " " (space) is displayed as a text.

  • A line ended with ":" (colon)  is treated as a label targeted by jump control statements.

  • A line started with "->" is treated as a jump (like Goto) control statement.  A jump with single label is non conditional.  A jump with several labels is conditional.

  • A line other than above and has "," (comma) is displayed as options and prompts user selection.


Game scenario ends at scenario[21] (line 32).  But for testing, I added scenario[22] (line 33) to loop back to the top.


6. Sub Init

7. scenario [ 1 ] = "stage_0:"

8. scenario [ 2 ] = " You're at a fork in the road."

9. scenario [ 3 ] = " Which way do you go?"

10. scenario [ 4 ] = "LEFT,RIGHT,STAY"

11. scenario [ 5 ] = "-> stage_1_1,stage_1_2,stage_1_3,stage_0"

12.

13. scenario [ 6 ] = "stage_1_1:"

14. scenario [ 7 ] = " Good choice, you find some money. :)"

15. scenario [ 8 ] = " Have a nice day."

16. scenario [ 9 ] = "-> end"

17.

18. scenario [ 10 ] = "stage_1_2:"

19. scenario [ 11 ] = " You're at a stairs."

20. scenario [ 12 ] = " Which way do you go?"

21. scenario [ 13 ] = "UP,BACK"

22. scenario [ 14 ] = "-> stage_2,stage_0,stage_1_2"

23.

24. scenario [ 15 ] = "stage_1_3:"

25. scenario [ 16 ] = " Nothing happend."

26. scenario [ 17 ] = " "

27. scenario [ 18 ] = "-> stage_0"

28.

29. scenario [ 19 ] = "stage_2:"

30. scenario [ 20 ] = " Hard choice. But, good luck!"

31.

32. scenario [ 21 ] = "end:"

33. scenario [ 22 ] = "-> stage_0"

34. nScenario = Array . GetItemCount ( scenario )

35. pScenario = 1

36. EndSub


Parsing and Executing the Scenario


Subroutine Game parses the scenario and execute each statement.



37. Sub Game

38. While pScenario < = nScenario

39. line = scenario [ pScenario ]

40. If Text . StartsWith ( line , " " ) Then

41. TextWindow . WriteLine ( Text . GetSubTextToEnd ( line , 2 ) )

42. pScenario = pScenario + 1

43. ElseIf Text . EndsWith ( line , ":" ) Then

44. pScenario = pScenario + 1

45. ElseIf Text . StartsWith ( line , "->" ) Then

46. id = 1

47. Jump ( )

48. ElseIf Text . IsSubText ( line , "," ) Then

49. choices = line

50. Choose ( )

51. TextWindow . WriteLine ( "" )

52. If id = 0 Then

53. id = n + 1

54. EndIf

55. pScenario = pScenario + 1

56. line = scenario [ pScenario ]

57. Jump ( )

58. Else

59. msg = "Unknown scenario: line " + pScenario

60. Error ( )

61. EndIf

62. EndWhile

63. EndSub


Processing for "->" Control Statement


"->" statement behaves as Goto statement if it has a single label.  But it has some labels, it behaves like ON GOTO statement in BASIC language.  If the previous line has options, label is selected as the selected option id (1, 2, ...).  If the choice is invalid then the last label is selected.



64. Sub Jump

65. ' param id - choice

66. ' param line

67. ' work label - destination

68. len = Text . GetLength ( line )

69. p = 3

70. While p < = len And Text . GetSubText ( line , p , 1 ) = " "

71. p = p + 1

72. EndWhile

73. label = ""

74. For i = 1 To id

75. c = Text . GetIndexOf ( Text . GetSubTextToEnd ( line , p ) , "," )

76. If c = 0 Then

77. c = len - p + 2

78. EndIf

79. If i = id Then

80. label = Text . GetSubText ( line , p , c - 1 ) + ":"

81. Else

82. p = p + c

83. If len < p Then

84. msg = "Label shortage: line " + pScenario

85. Error ( )

86. EndIf

87. EndIf

88. EndFor

89. For p = 1 To nScenario

90. If scenario [ p ] = label Then

91. pScenario = p

92. Goto break

93. EndIf

94. EndFor

95. msg = "Label " + label + " not found: line " + pScenario

96. Error ( )

97. break :

98. EndSub


Displaying Error


If the scenario has error, the program is not to be continued.  So, the program displays error and stops.



99. Sub Error

100. TextWindow . ForegroundColor = "Red"

101. TextWindow . WriteLine ( msg )

102. TextWindow . WriteLine ( "" )

103. TextWindow . ForegroundColor = "Gray"

104. pScenario = nScenario + 1

105. EndSub


And subroutine Choice is the same as the previous text adventure program.


With small change, the scenario can be read from a text file.  By today's update, procedures become simple.  But data (scenario) becomes little complex.  Because the scenario is a kind of script, it will be needed testing and debugging.


For this program, there is room for improvement.  But I'm going to write about text window base game program with action next week.


Have a happy programming!

Published Feb 12, 2019
Version 1.0
No CommentsBe the first to comment