主题:[讨论]游戏王国
三国风云
[专家分:140] 发布于 2009-06-29 14:07:00
谁有游戏都加分
回复列表 (共31个回复)
21 楼
我爱qbasic [专家分:160] 发布于 2009-07-13 19:06:00
接上
SUB DrawTable (Move)
LongX = (TableSize - 1) * FootStep.X
LongY = (TableSize - 1) * FootStep.Y
VIEW SCREEN (2, 0)-(429, 319), 0, 0
RANDOMIZE TIMER: DrawDir = INT(RND * 8)
IF Move = False THEN DrawDir = -1
SELECT CASE DrawDir
CASE -1: X = 1: Y = 1
CASE 0: X = 1: Y = TableHeight '上
CASE 1: X = -TableWidth: Y = TableHeight '右上
CASE 2: X = -TableWidth: Y = 1 '右
CASE 3: X = -TableWidth: Y = -TableHeight '右下
CASE 4: X = 1: Y = -TableHeight '下
CASE 5: X = TableWidth: Y = -TableHeight '左下
CASE 6: X = TableWidth: Y = 1 '左
CASE 7: X = TableWidth: Y = TableHeight '左上
END SELECT
DO
IF X <> 1 THEN X = X + DirForm(DrawDir).X
IF Y <> 1 THEN Y = Y + DirForm(DrawDir).Y
IF INKEY$ <> "" THEN
X = 1: Y = 1
LINE (X - 2, Y - 2)-STEP(10, 10), 0, BF
LINE (X + TableWidth - 2, Y - 2)-STEP(10, 10), 0, BF
LINE (X + TableWidth - 2, Y + TableHeight - 2)-STEP(10, 10), 0, BF
END IF
PSET (X + 8, Y - 1), 0: DRAW "R421D311G10L421U312E10"
FOR L = 0 TO 8
LINE (X + 9 - L, Y + L)-STEP(TableWidth - 1, 0), 15
LINE (X + TableWidth + 8 - L, Y + L)-STEP(0, TableHeight), 7
NEXT
LINE (X + 2, Y + 9)-STEP(TableWidth - 2, TableHeight - 1), TableColor, BF
LINE (X + 1, Y + 8)-STEP(TableWidth - 1, TableHeight), 14, B
LOOP UNTIL X = 1 AND Y = 1
FOR L = 0 TO TableSize - 1
LINE (L * FootStep.X + Debug.X, Debug.Y)-STEP(0, LongY), 8, , &H7777
LINE (Debug.X, L * FootStep.Y + Debug.Y)-STEP(LongX, 0), 8, , &H7777
NEXT
LINE (Debug.X - 3, Debug.Y - 2)-STEP(LongX + 6, LongY + 4), 8, B
FOR Y = 1 TO TableSize
FOR X = 1 TO TableSize
TX = Debug.X + (X - 1) * FootStep.X
TY = Debug.Y + (Y - 1) * FootStep.Y
SELECT CASE Table(X, Y)
CASE -1: PutFullCircle TX, TY, Round, -1
CASE 1: PutFullCircle TX, TY, Round, 1
END SELECT
NEXT
NEXT
HandLocation(0).X = TableSize \ 2
HandLocation(0).Y = TableSize \ 2
HandLocation(1).X = HandLocation(0).X
HandLocation(1).Y = HandLocation(0).Y
TX = TzHand.X + (HandLocation(1).X - 1) * FootStep.X
TY = TzHand.Y + (HandLocation(1).Y - 1) * FootStep.Y
PUT (TX, TY), HandFont&, XOR
MoveHand Null
VIEW: TIMER ON
END SUB
DEFSNG A-Z
'
' 显示游戏结束画面
'
SUB GameOver
DIM L%(859)
TIMER OFF
A! = TIMER
RANDOMIZE A!
COLOR INT(RND * 8 + 9)
LOCATE 7, 32: PRINT "┏━━━━┓"
LOCATE 8, 32: PRINT "┃游戏结束┃"
LOCATE 9, 32: PRINT "┗━━━━┛"
LINE (252, 88)-STEP(87, 33), INT(RND * 8), B
GET (252, 88)-STEP(87, 33), L%
GX = 252: GY = 88: T = .08: Inc1 = T: Inc2 = T
WHILE INKEY$ <> "": WEND
WHILE INKEY$ = "" AND (A! + 120 > TIMER)
GX = GX + Inc1: GY = GY + Inc2
IF GX < T THEN Inc1 = T
IF GY < T THEN Inc2 = T
IF GX > 551 THEN Inc1 = -T
IF GY > 315 THEN Inc2 = -T
PUT (GX, GY), L%, PSET
WEND
COLOR 7
SCREEN 0, 0, 0, 0
WIDTH 80
LOCATE 25, 1, 1
END SUB
DEFINT A-Z
'
' 取五个同色的棋子
' StX, StY: 开始取棋子的位置
' InX, InY: 取棋子的 X 方向和 Y 方向
' 返回意义: 如果是黑棋子返回 "XXXXX-1"
' 如果是白棋子返回 "XXXXX 1"
' 如果没有棋子返回 "XXXXX 0"
' XXXXX 为棋子有无标志
' 有: 相应的位置为 "1" 无: 相应的位置为 "0"
'
22 楼
我爱qbasic [专家分:160] 发布于 2009-07-13 19:07:00
接上
FUNCTION GetFont$ (StX, StY, InX, InY)
DIM Pt AS MAP
DIM Font(1 TO 5)
I = 1
Pt.X = StX: Pt.Y = StY
DO
Zhi = Table(Pt.X, Pt.Y)
Font(I) = Zhi
IF Zhi = Null THEN
L$ = L$ + "0"
ELSE
L$ = L$ + "1"
IF Zhi = Black THEN
bk = bk + 1
ELSEIF Zhi = White THEN
wt = wt + 1
END IF
END IF
Pt.X = StX + I * InX
Pt.Y = StY + I * InY
I = I + 1
LOOP WHILE I <= 5 AND Table(Pt.X, Pt.Y) <> 2
same = (bk > 0 AND wt = 0) OR (wt > 0 AND bk = 0) OR (bk = 0 AND wt = 0)
IF LEN(L$) = 5 AND same THEN
IF bk > 0 THEN
L$ = L$ + "-1"
ELSEIF wt > 0 THEN
L$ = L$ + " 1"
ELSE
L$ = L$ + " 0"
END IF
GetFont = L$
END IF
END FUNCTION
'
' 设置游戏参数
' 玩家姓名, 棋盘尺寸, 游戏次数, 手光标颜色
'
FUNCTION GetSomeVar$
DIM Prompt$(4)
Prompt$(0) = "玩家一( ):"
Prompt$(1) = "玩家二( ):"
Prompt$(2) = "尺 寸( ):"
Prompt$(3) = "局 数( ):"
Prompt$(4) = "光标颜色 ( )"
C = 8
VIEW PRINT 14 TO 25
CLS 2
FOR I = 0 TO 9
LINE (470 - I, 203 - I)-STEP(0, 130), 7
LINE (160 - I, 333 - I)-STEP(310, 0), 8
NEXT
LINE (150, 193)-STEP(310, 130), 15, BF
LINE (155, 198)-STEP(300, 120), 0, BF
FOR I = 5 TO 8
LINE (150 + I + 1, 193 + I)-STEP(308 - I * 2, 0), 7
LINE (150 + I, 193 + I + 1)-STEP(0, 128 - I * 2), 7
LINE (150 + I + 1, 323 - I)-STEP(308 - I * 2, 0), 7
LINE (460 - I, 193 + I + 1)-STEP(0, 128 - I * 2), 7
NEXT
LINE (155, 198)-STEP(300, 120), 8, B
LINE (160, 203)-STEP(290, 110), 7, BF
COLOR 11
FOR I = 0 TO 3
LOCATE 16 + I * 2, 22
PRINT Prompt$(I);
NEXT
LOCATE 22, 43: PRINT Prompt$(4)
COLOR 12
LOCATE 16, 29: PRINT "1";
LOCATE 18, 29: PRINT "2";
LOCATE 20, 29: PRINT "S";
LOCATE 22, 29: PRINT "T";
LOCATE 22, 53: PRINT "H";
PutFullCircle 388, 218, 10, Black
PutFullCircle 388, 246, 10, White
LOCATE , , 0
DO
COLOR 11
kbd$ = INKEY$
SELECT CASE UCASE$(kbd$)
CASE "1": LOCATE 16, 29: PRINT "1";
PlayName$(0) = ReadStr(16, 33, 10)
COLOR 12: LOCATE 16, 29: PRINT "1";
CASE "2": LOCATE 18, 29: PRINT "2";
PlayName$(1) = ReadStr(18, 33, 10)
COLOR 12: LOCATE 18, 29: PRINT "2";
CASE "S": LOCATE 20, 29: PRINT "S";
TableSize = VAL(LEFT$(ReadStr(20, 33, 10), 2))
IF TableSize < 5 THEN TableSize = 5
IF TableSize > 20 THEN TableSize = 20
LOCATE 20, 33: PRINT USING " ## X ##"; TableSize; TableSize;
COLOR 12: LOCATE 20, 29: PRINT "S";
CASE "T": LOCATE 22, 29: PRINT "T";
Times = VAL(ReadStr(22, 33, 8))
IF Times = 0 THEN Times = 1
LOCATE 22, 33: PRINT USING "########"; Times;
COLOR 12: LOCATE 22, 29: PRINT "T";
CASE "H": C = (C + 1) MOD 16: DrawHand 372, 264, C
END SELECT
LOOP UNTIL kbd$ = CHR$(0) + ";" OR kbd$ = CHR$(0) + "?" OR kbd$ = CHR$(27)
GetStepSize TableSize
REDIM Table(0 TO TableSize + 1, 0 TO TableSize + 1) AS INTEGER
CLS 2
VIEW PRINT
COLOR 10: LOCATE , , 0, 0, 0: LOCATE 14, 1: PRINT STRING$(80, "_");
GetSomeVar = kbd$
END FUNCTION
'
' 计算手光标移动步长
' X: 棋盘尺寸
'
SUB GetStepSize (X)
FootStep.X = INT(MAXX \ (X - 1))
FootStep.Y = INT(MAXY \ (X - 1))
Round = INT(FootStep.Y \ 2)
END SUB
'
' 电脑提示如何走
23 楼
我爱qbasic [专家分:160] 发布于 2009-07-13 19:07:00
接上
'
SUB HelpForPlay
IF ComputerGo(Player) THEN MoveHand True ELSE SOUND 200, 1
END SUB
'
' 设置默认的参数
'
SUB Initialize
ErrorCode = Null
RESTORE DirData
FOR I = 0 TO 7
READ DirForm(I).X, DirForm(I).Y
NEXT
RESTORE LeanData
FOR I = 0 TO 31
READ PowerTab(I).Power, PowerTab(I).Location
NEXT
PlayName$(0) = ""
PlayName$(1) = ""
TableSize = 9
Before = Forget
Times = 1
GetStepSize TableSize
REDIM Table(0 TO TableSize + 1, 0 TO TableSize + 1) AS INTEGER
END SUB
'
' 居中显示字符串
' T$: 要显示的字符串
' L: 要显示字符串的所在行数
' C: 要显示字符串的颜色
'
SUB MidSet (T$, L, C)
COLOR C
LOCATE L, (80 - LEN(LEFT$(T$, 80))) \ 2 + 1
PRINT LEFT$(T$, 80);
END SUB
'
' 移动手光标
' 将手光标移动到当前位置
' F: 是否有声音
'
SUB MoveHand (F)
FOR I = 0 TO 1
TX = TzHand.X + (HandLocation(I).X - 1) * FootStep.X
TY = TzHand.Y + (HandLocation(I).Y - 1) * FootStep.Y
PUT (TX, TY), HandFont&, XOR
IF F THEN
SOUND 750, 3: T! = TIMER
WHILE TIMER - T! < .4: WEND
END IF
NEXT I
HandLocation(0).X = HandLocation(1).X
HandLocation(0).Y = HandLocation(1).Y
END SUB
'
' 显示信息
' 玩家姓名, 获胜次数, 可悔次数, 剩余局数, 小红旗
'
SUB OutInfo
LINE (639, 320)-STEP(-205, -320), 1, BF
DrawComputer 516, 145, Null
COLOR 14
FOR I = 0 TO 1
PutFullCircle 460, I * 253 + 35, 9, I * 2 - 1
LOCATE I * 18 + 2, 61
IF PlayName$(I) <> "" THEN
PRINT "玩家" + STR$(I + 1) + ":" + SPACE$(10 - LEN(PlayName$(I))) + PlayName$(I);
ELSE
PRINT "玩家" + STR$(I + 1) + ": 计算机";
END IF
LOCATE I * 18 + 4, 61
PRINT USING "获 胜 次 数: ####"; Level(I);
FOR j = 0 TO Level(I) - 1
ex = 460 + (j \ 5) * 10
IF I = 0 THEN
ey = 62 + I * 124 + (j MOD 5) * 16
ELSE
ey = 62 + I * 124 + (I * 4 - j MOD 5) * 16
END IF
PSET (ex, ey), 12: DRAW Win$
NEXT
NEXT
DrawComputer 516, 145, 1
COLOR 12:
LOCATE 11, 56: PRINT USING "可悔##次"; Before
LOCATE 12, 56: PRINT "剩余局数"
LOCATE 13, 56: PRINT USING "########"; Times;
LOCATE 1, 1, 0
END SUB
'
' 暂停游戏
' P$: 按 P$ 解除暂停
'
24 楼
我爱qbasic [专家分:160] 发布于 2009-07-13 19:08:00
接上
SUB Pause (P$)
DIM P%(6027)
GET (440, 100)-STEP(180, 130), P%
FOR I = 0 TO 14
LINE (440 + I, 100 + I)-STEP(180 - I * 2, 130 - I * 2), 15 - I, B
NEXT
LINE STEP(-1, -1)-STEP(I * 2 - 180, I * 2 - 130), 8, BF
DRAW "bf10c11"
FOR I = 25 TO 0 STEP -7
N$ = LTRIM$(STR$(I))
DRAW "R" + N$ + "G" + N$ + "R" + N$ + "BM+6,-4"
NEXT
DrawComputer 550, 162, 7
WHILE I$ <> UCASE$(P$) AND I$ <> LCASE$(P$)
I$ = INKEY$
WEND
PUT (440, 100), P%, PSET
END SUB
'
' 玩家走棋
'
FUNCTION PlayerGo
WHILE INKEY$ <> "": WEND
DO
MoveEsc = False
kd$ = INKEY$
SELECT CASE kd$
CASE CHR$(0) + ";"
IF ComputerGo(Player) THEN HelpForPlay
CASE CHR$(0) + "H"
IF HandLocation(1).Y > 1 THEN HandLocation(1).Y = HandLocation(1).Y - 1
MoveHand Null
CASE CHR$(0) + "P"
IF HandLocation(1).Y < TableSize THEN HandLocation(1).Y = HandLocation(1).Y + 1
MoveHand Null
CASE CHR$(0) + "K"
IF HandLocation(1).X > 1 THEN HandLocation(1).X = HandLocation(1).X - 1
MoveHand Null
CASE CHR$(0) + "M"
IF HandLocation(1).X < TableSize THEN HandLocation(1).X = HandLocation(1).X + 1
MoveHand Null
CASE CHR$(0) + "G"
IF HandLocation(1).X > 1 THEN
HandLocation(1).X = 1
ELSEIF HandLocation(1).Y > 1 THEN
HandLocation(1).Y = 1
END IF
MoveHand Null
CASE CHR$(0) + "O"
IF HandLocation(1).X < TableSize THEN
HandLocation(1).X = TableSize
ELSEIF HandLocation(1).Y < TableSize THEN
HandLocation(1).Y = TableSize
END IF
MoveHand Null
CASE CHR$(27): PlayerGo = False: MoveEsc = True
CASE "P", "p": Pause "P"
CASE CHR$(13)
IF Table(HandLocation(1).X, HandLocation(1).Y) = Null THEN
PlayerGo = True
MoveEsc = True
ELSE
SOUND 200, 4
END IF
CASE CHR$(8), CHR$(0) + "S" '悔棋
IF (Before > 0) AND (GroupPtr > 0) THEN
FOR B = 0 TO 1
HandLocation(1).X = Grop(GroupPtr).X
HandLocation(1).Y = Grop(GroupPtr).Y
Table(HandLocation(1).X, HandLocation(1).Y) = 0
GroupPtr = GroupPtr - 1
IF GroupPtr = Null THEN GroupPtr = Forget * 2
NEXT B
Before = Before - 1
IF HandLocation(1).X = 0 THEN
HandLocation(1).X = TableSize \ 2
HandLocation(1).Y = TableSize \ 2
25 楼
我爱qbasic [专家分:160] 发布于 2009-07-13 19:09:00
接上
END IF
OutInfo
DrawTable False
ELSE
SOUND 200, 4
END IF
END SELECT
LOOP UNTIL MoveEsc
END FUNCTION
'
' 玩游戏
' T%: 游戏局数
'
SUB PlayTimes (T%)
Level(0) = Null
Level(1) = Null
CLS
FOR Times = T% TO 1 STEP -1
FOR I = 0 TO TableSize
FOR j = 1 TO TableSize
Table(I, j) = Null
NEXT j
Table(0, I) = 2: Table(TableSize + 1, I) = 2
Table(I, 0) = 2: Table(I, TableSize + 1) = 2
NEXT I
Table(TableSize + 1, TableSize + 1) = 2
HandLocation(0).X = TableSize \ 2
HandLocation(0).Y = TableSize \ 2
HandLocation(1).X = TableSize \ 2
HandLocation(1).Y = TableSize \ 2
Turn = (Times + 1) MOD 2
GroupPtr = Null
Esc = False
OutInfo
DrawTable True
RANDOMIZE TIMER
DO
SELECT CASE Turn
CASE 0: Player = Black
CASE 1: Player = White
END SELECT
IF PlayName$(Turn) = "" THEN
IF ComputerGo(Player) THEN
GroupPtr = GroupPtr MOD (Forget * 2) + 1
Grop(GroupPtr).X = HandLocation(1).X
Grop(GroupPtr).Y = HandLocation(1).Y
Table(HandLocation(1).X, HandLocation(1).Y) = Player
CPTMoveHand
PutBody HandLocation(1).X, HandLocation(1).Y, Player
SOUND 100, 1
ELSE
Esc = True
END IF
ELSEIF PlayerGo THEN
GroupPtr = GroupPtr MOD (Forget * 2) + 1
Grop(GroupPtr).X = HandLocation(1).X
Grop(GroupPtr).Y = HandLocation(1).Y
Table(HandLocation(1).X, HandLocation(1).Y) = Player
PutBody HandLocation(1).X, HandLocation(1).Y, Player
SOUND 100, 1
ELSE
Esc = True
END IF
Turn = (Turn + 1) MOD 2
DrawComputer 516, 145, INT(RND * 7) + 1
LOOP UNTIL Esc OR Wing
NEXT Times
END SUB
'
26 楼
我爱qbasic [专家分:160] 发布于 2009-07-13 19:10:00
接上
' 放棋子
' X, Y: 棋子位置
' B: 棋子颜色
'
SUB PutBody (X, Y, B)
hx = (X - 1) * FootStep.X + TzHand.X
hy = (Y - 1) * FootStep.Y + TzHand.Y
bx = (X - 1) * FootStep.X + Debug.X
by = (Y - 1) * FootStep.Y + Debug.Y
PUT (hx, hy), HandFont&, XOR
PutFullCircle bx, by, Round, B
PUT (hx, hy), HandFont&, XOR
END SUB
'
' 画棋子
' X, Y: 棋子位置
' R: 棋子半径
' B: 棋子颜色(黑白两种)
'
SUB PutFullCircle (X, Y, R, B)
IF B = Black THEN
C = 0: c1 = 15
ELSEIF B = White THEN
C = 15: c1 = 8
ELSE
C = 13: c1 = 12
END IF
CIRCLE (X, Y), R - 1, C: PAINT (X, Y), C
CIRCLE (X, Y), R, 7
N = R / 4.2
FOR I = 1 TO N
CIRCLE (X, Y), R - N - I, c1, 1.8 + I / 35, 3 - I / 30
NEXT
END SUB
'
' 查看 README 文件
'
SUB Readme
L = Null
VIEW PRINT 15 TO 25
CLS 2
OPEN "readme" FOR INPUT AS #1
IF ErrorCode = 53 THEN EXIT SUB
COLOR 14
DO WHILE NOT EOF(1)
LINE INPUT #1, A$
LOCATE L + 15, 1
PRINT LEFT$(A$, 80);
L = (L + 1) MOD 11
IF L = 10 THEN
L = Null: COLOR 11: LOCATE 25, 2, 0
PRINT "按任意键继续 ......";
A$ = INPUT$(1): CLS 2
COLOR 14
IF A$ = CHR$(27) THEN EXIT DO
END IF
LOOP
CLOSE
CLS 2
VIEW PRINT
END SUB
'
' 从键盘读一个字符串
' X, Y: 显示字符串的位置
' Lng: 读入字符串的最大长度
'
FUNCTION ReadStr$ (X, Y, Lng)
PL$ = ""
A$ = "\" + SPACE$(Lng - 2) + "\"
LOCATE X, Y: PRINT USING A$; PL$;
DO
LOCATE X, Y
kd$ = INKEY$
27 楼
我爱qbasic [专家分:160] 发布于 2009-07-13 19:10:00
SELECT CASE kd$
CASE CHR$(32) TO CHR$(254)
QuitSUB = False
IF L < Lng THEN
L = L + 1
PL$ = PL$ + kd$
SOUND ((ASC(kd$) - 32) * 80) MOD 1500 + 80, 1
ELSE
SOUND 800, 1
END IF
PRINT PL$
CASE CHR$(27)
IF PL$ <> "" THEN
QuitSUB = False
L = Null: PL$ = ""
PRINT USING A$; PL$
ELSE
QuitSUB = True
END IF
CASE CHR$(13): QuitSUB = True
CASE CHR$(8), CHR$(0) + "S"
IF L < 1 THEN
SOUND 800, 1
ELSE
L = L - 1
PL$ = LEFT$(PL$, L)
PRINT PL$; " "
END IF
END SELECT
LOOP UNTIL QuitSUB
ReadStr$ = PL$
END FUNCTION
' 扫描棋盘的一行或一列
' S(): 棋盘数组
' SX, SY: 开始扫描的位置
' IX, IY: 扫描的 X 方向和 Y 方向
FUNCTION ScanLine (S(), SX, SY, IX, IY)
DIM P1, P2 AS MAP
Zhi = Null
Length = 0
LineFull = True
unEmpty = False '如果此行为空, 则 unempty 为假
ScanLine = False '如果此行能放棋子, 则函数返回假
DO
P1.X = SX + Length * IX
P1.Y = SY + Length * IY
Zhi = Table(P1.X, P1.Y)
unEmpty = unEmpty OR Zhi
LineFull = LineFull * Zhi
IF Zhi <> 2 THEN Length = Length + 1
LOOP UNTIL Zhi = 2
IF LineFull THEN
ScanLine = True
ELSEIF unEmpty THEN
FOR I = 0 TO Length - 5
P1.X = SX + I * IX
P1.Y = SY + I * IY
FT$ = GetFont$(P1.X, P1.Y, IX, IY)
F = BinToDec(FT$, Null)
BorW = SGN(BinToDec(FT$, 1) + 1)
T = LEN(RTRIM$(PowerTab(F).Location))
28 楼
我爱qbasic [专家分:160] 发布于 2009-07-13 19:11:00
FOR A = 1 TO T
LX = P1.X + VAL(MID$(PowerTab(F).Location, A, 1)) * IX
LY = P1.Y + VAL(MID$(PowerTab(F).Location, A, 1)) * IY
S(BorW, LX, LY) = S(BorW, LX, LY) + PowerTab(F).Power
NEXT A
NEXT I
END IF
END FUNCTION
'
' 扫描棋盘
' BW:
'
FUNCTION ScanTable (BW)
DIM Team(0 TO TableSize * 4) AS MAP
DIM ScanPower(0 TO 1, 1 TO TableSize, 1 TO TableSize)
ScanPower(0, TableSize / 2 + .5, TableSize / 2 + .5) = 1
ScanPower(1, TableSize / 2 + .5, TableSize / 2 + .5) = 1
'第一遍扫描
FOR Dir = 1 TO 2
Full = 0
FOR Scan = 1 TO TableSize
SELECT CASE Dir
CASE 1: StartX = 1: StartY = Scan: IncX = 1: IncY = 0
CASE 2: StartX = Scan: StartY = 1: IncX = 0: IncY = 1
END SELECT
IF ScanLine(ScanPower(), StartX, StartY, IncX, IncY) THEN
Full = Full + 1
END IF
IF Full >= TableSize OR (INKEY$ <> "" AND PlayName$(0) = "" AND PlayName$(1) = "") THEN
ScanTable = True
EXIT FUNCTION
END IF
NEXT Scan
NEXT Dir
' 第二遍扫描
FOR Dir = 1 TO 2
Full = 0: Record = TableSize * 2 - 10
FOR Scan = 0 TO Record
SELECT CASE Dir
CASE 1: IncX = 1: IncY = 1
IF Scan * 2 <= Record THEN
StartX = Scan + 1: StartY = 1
ELSE
StartX = 1: StartY = TableSize - 4 - Scan MOD (Record / 2 + 1)
END IF
CASE 2: IncX = 1: IncY = -1
IF Scan * 2 <= Record THEN
StartX = 1: StartY = Scan + 5
ELSE
StartX = TableSize - 4 - Scan MOD (Record / 2 + 1): StartY = TableSize
END IF
END SELECT
IF ScanLine(ScanPower(), StartX, StartY, IncX, IncY) THEN
Full = Full + 1
END IF
IF Full > TableSize * 2 - 10 OR (INKEY$ <> "" AND PlayName$(0) = "" AND PlayName$(1) = "") THEN
ScanTable = True
EXIT FUNCTION
END IF
NEXT Scan
NEXT Dir
29 楼
我爱qbasic [专家分:160] 发布于 2009-07-13 19:12:00
' 第三遍扫描
FOR I = 1 TO TableSize
FOR j = 1 TO TableSize
ScanPower(SGN(BW + 1), j, I) = ScanPower(SGN(BW + 1), j, I) * 1.5
NEXT
NEXT
' 第四遍扫描
Ptr = -1
MaxPower = 0
Bow = BW
FOR Body = 0 TO 1
FOR Y = 1 TO TableSize
FOR X = 1 TO TableSize
IF Table(X, Y) = 0 AND ScanPower(Body, X, Y) > 0 THEN
SELECT CASE ScanPower(Body, X, Y)
CASE MaxPower
IF Body = Bow THEN
Ptr = Ptr + 1
Team(Ptr).X = X
Team(Ptr).Y = Y
END IF
CASE IS > MaxPower
MaxPower = ScanPower(Body, X, Y)
Bow = Body: Ptr = 0
Team(Ptr).X = X
Team(Ptr).Y = Y
END SELECT
END IF
NEXT X
NEXT Y
NEXT Body
' 最后一遍扫描
Pointer = 0
IF Ptr >= Null THEN
IF Bow * 2 - 1 = Black THEN P = 1 ELSE P = 0
FOR A = 0 TO Ptr - 1
FOR B = A + 1 TO Ptr
IF ScanPower(P, Team(A).X, Team(A).Y) < ScanPower(P, Team(B).X, Team(B).Y) THEN SWAP Team(A), Team(B)
NEXT B
NEXT A
DO WHILE A > B AND Pointer < Ptr AND Ptr > 0
A = ScanPower(P, Team(Pointer).X, Team(Pointer).Y)
B = ScanPower(P, Team(Pointer + 1).X, Team(Pointer + 1).Y)
Pointer = Pointer + 1
LOOP
END IF
TP = INT(RND * (Pointer + 1))
HandLocation(1).X = Team(TP).X
HandLocation(1).Y = Team(TP).Y
END FUNCTION
'
30 楼
我爱qbasic [专家分:160] 发布于 2009-07-13 19:12:00
' 游戏开始序幕
'
FUNCTION Welcome
DIM W$(11)
W$(0) = SPACE$(80)
W$(1) = SPACE$(20) + "☆☆☆ 欢 迎 来 到 五 子 棋 游 戏 ☆☆☆" + SPACE$(20)
W$(2) = SPACE$(80)
W$(3) = SPACE$(8) + "●●● ○ ● ● ○○○ ●●● ○ ○ ●●● ○○○ ●●● " + SPACE$(7)
W$(4) = SPACE$(8) + "● ○ ● ● ○ ● ● ○ ○ ● ○ ● " + SPACE$(7)
W$(5) = SPACE$(8) + "●●● ○ ● ● ○○ ● ○○○ ●● ○○○ ●●● " + SPACE$(7)
W$(6) = SPACE$(8) + "● ○ ●● ○ ● ● ○ ○ ● ○ ●" + SPACE$(7)
W$(7) = SPACE$(8) + "● ○ ● ○○○ ●●● ○ ○ ●●● ○○○ ●●● " + SPACE$(7)
W$(8) = SPACE$(80)
W$(9) = SPACE$(18) + "按 <F1> 键 查看游戏说明" + SPACE$(37)
W$(10) = SPACE$(18) + "按 <F5> 键 开 始" + SPACE$(37)
W$(11) = SPACE$(18) + "按 <F10> 键 设置游戏参数" + SPACE$(37)
SCREEN 9: COLOR 10
LOCATE , , 0, 0, 0: CLS
LOCATE 14, 1: PRINT STRING$(80, "_");
FOR I = 13 TO 79
IF INKEY$ <> "" THEN I = 79
FOR j = 0 TO 10 STEP 2
LOCATE j + 2, 80 - I: PRINT LEFT$(W$(j), I);
LOCATE j + 3, 1: PRINT RIGHT$(W$(j + 1), I);
NEXT
NEXT
DrawComputer 400, 145, 1
DrawHand 500, 150, 10
SLEEP 2
QuitSUB = False
DO
DrawComputer 400, 145, INT(RND * 7) + 1
PALETTE 10, INT(RND * 6) + 58
kd$ = INKEY$
SELECT CASE kd$
CASE CHR$(0) + ";" '<F1> key
Readme
CASE CHR$(0) + "D" '<F10> key
kd$ = GetSomeVar
IF kd$ = CHR$(0) + "?" THEN
QuitSUB = True
ELSEIF kd$ = CHR$(0) + ";" THEN
Readme
END IF
CASE CHR$(0) + "?" '<F5> key
QuitSUB = True
我来回复