c++ 菜鸟级 运行错误 段错误 Segmentation fault

c++ 菜鸟级 运行错误 段错误 Segmentation fault,第1张

Board的成员变量需要初始化, 再就是CheckerPiece的构造函数在Board类进行构造的时候好像是涉及到嵌套类的构造问题吧, 把CheckerPiece建立一个无参构造函数和一个初始化函数, 这样可以进行初始化

还有就是内笑旦部的一些矩阵元素赋值的时候

#include <iostream>

#include <cstdlib>

#include <cctype>

#include <cmath>

using namespace std

// 定义了枣野类Checkerpiece(用来检查块, 相当于裁判?)

class Checkerpiece

{

char color // to distinct different players

int x

int y   //:  the coordinate of the piece .

bool selected // : whether the piece is selected to be moved

bool isKing //whether the piece reach the end of the board

//bool hasEnemy // : whether the piece has a enemy piece around it

public:

//Board 碰岩扰livespace

Checkerpiece(){}

Checkerpiece(char color,int x,int y)   // Constructor

void InitCheckerpiece(char color,int x,int y)

int getX()

int getY()

char getColor()

bool ishimking()

void select()

void unselect()

bool crown()

//bool movable()

//bool move(int nextX,int nextY,Board& checkerboard)

//bool simplymove(int nextX,int nextY,Board& checkerboard)

//bool jump(int nextX,int nextY,Board& checkerboard)

//bool isenemy(Checkerpiece cp)

}

// CheckerPiece类的成员函数的实现

Checkerpiece::Checkerpiece(char color0,int x0,int y0)

{

color = color0

x = x0

y = y0

}

void Checkerpiece::InitCheckerpiece(char color0,int x0,int y0)

{

color = color0

x = x0

y = y0

}

int Checkerpiece::getX()

{

return x

}

int Checkerpiece::getY()

{

return y

}

char Checkerpiece::getColor()

{

return color

}

bool Checkerpiece::ishimking()

{

return isKing

}

void Checkerpiece::select()

{

selected = true

}

void Checkerpiece::unselect()

{

selected = false

}

bool Checkerpiece::crown()

{

return isKing = true

}

// 定义类Player(玩家信息)

class Player

{

//bool red_turn

char color

int noOfPieces

int noOf_movable

//Checkerpiece *pieces[12]

public:

Player(char color)

bool lose()

char playercolor()

}

// 成员函数的实现

Player::Player(char color0)

{

color = color0

noOfPieces = 12

noOf_movable = 12

}

bool Player::lose()

{

return noOfPieces*noOf_movable ==0 // 没有棋子或所有棋子不可动则表示输了

}

char Player::playercolor()

{

return color

}

// 定义了Board类(棋盘)

class Board

{

Checkerpiece  matrix[8][8]

public:

Board()

void disPlayMatrix()

char getmatrix(int x,int y)

bool getKingship(int x,int y)

bool setKingship(int x,int y)

void setPosition(int crrentX,int crrentY,int nextX,int nextY)

void capture(int x,int y)

bool move(Player p)

int  readX()

int  readY()

bool simplymove(int currentX,int currentY,int nextX,int nextY)

bool jump(int currentX,int currentY,int nextX,int nextY)

}

// 初始化Board的成员

Board::Board()

{

for(int i =0i<8i++)

for(int j =0j<8j++)

matrix [i][j].InitCheckerpiece(' ',i,j)

for(int k =0k<8k+=2)

{

matrix [0][k]=Checkerpiece('r',0,k)

matrix [1][k+1]=Checkerpiece('r',1,k)

matrix [2][k]=Checkerpiece('r',2,k)

matrix [5][k+1]=Checkerpiece('b',5,k)

matrix [6][k]=Checkerpiece('b',6,k)

matrix [7][k+1]=Checkerpiece('b',7,k)

}

}

void Board::disPlayMatrix()

{

//Checkerpiece *matrix4print [8][8]

cout<<"  a b c d e f g h"<<endl

for(int i =0i<8i++)

{

cout<<i+1<<'|'

for(int j =0j<8j++)

{

//*matrix4print [i][j]=*matrix[i][j]

//cout<< *matrix4print[i][j].getColor()<<'|'

Checkerpiece cp =matrix [i][j]

cout<< cp.getColor()<<'|'

}

cout<<endl

}

}

char Board::getmatrix(int x,int y)

{

Checkerpiece cp = matrix [x][y]

return cp.getColor()

}

bool Board::getKingship(int x,int y)

{

Checkerpiece cp = matrix [x][y]

return cp.ishimking()

}

bool Board::setKingship(int x,int y)

{

Checkerpiece cp = matrix [x][y]

return cp.crown()

}

void Board::setPosition(int currentX,int currentY,int nextX,int nextY)

{

//Checkerpiece oldP =

char color = getmatrix(currentX,currentY)

matrix[currentX][currentY].InitCheckerpiece(' ',currentX,currentY )

matrix[nextX][nextY].InitCheckerpiece(color,currentX,currentY )

}

void Board::capture(int x,int y)

{

matrix[x][y].InitCheckerpiece(' ',x,y)

}

bool Board::simplymove(int currentX,int currentY,int nextX,int nextY)

{

bool Kingship = getKingship(currentX,currentY)

char pcolor = getmatrix(currentX,currentY)

if((Kingship==false)&&((nextX<currentX&&pcolor == 'r')||(nextX>currentY&&pcolor =='b')))

cout<<"Not king! You are not allowed to move backfarward!"<<endl

else

{

setPosition(currentX,currentY,nextX,nextY)

if((nextX ==0&&pcolor =='b')||(nextX ==7&&pcolor=='r'))

setKingship(nextX,nextY)

}

return(getmatrix(currentX,currentY)!=pcolor)

}

bool Board::jump(int currentX,int currentY,int nextX,int nextY)

{

bool Kingship = getKingship(currentX,currentY)

char pcolor = getmatrix(currentX,currentY)

int midX = (currentX+nextY)/2

int midY = (currentY+nextY)/2

if((Kingship==false)&&((nextX<currentX&&pcolor == 'r')||(nextX>currentY&&pcolor =='b')))

cout<<"Not king! You are not allowed to move backfarward!"<<endl

else

{

setPosition(currentX,currentY,nextX,nextY)

capture(midX,midY)

if((nextX ==0&&pcolor =='b')||(nextX ==7&&pcolor=='r'))

setKingship(nextX,nextY)

}

return(getmatrix(currentX,currentY)!=pcolor)

}

int Board::readX()

{

int row

cout<<"Enter a number from 1-8 to choose row  :"

cin>>row

return row-1

}

int Board::readY()

{

char letter

int column

cout<<"Enter a letter from a-h to choose column: "

cin>>letter

switch (letter)

{

case 'a':   column = 0

break

case 'b':   column = 1

break

case 'c':   column = 2

break

case 'd':   column = 3

break

case 'e':   column = 4

break

case 'f':   column = 5

break

case 'g':   column = 6

break

case 'h':   column = 7

break

default :   column = 8

}

return column

}

bool Board::move(Player p)

{

disPlayMatrix()

char playerid = p.playercolor()

cout<<playerid<<" piece's turn,Slect the piece you'd like to move:"<<endl

int currentX = readX()

int currentY = readY()

if(getmatrix(currentX,currentY)!=playerid)

cout<<"No expected piece at the position you entered!"<<endl

else

{

cout<<"Enter the position you'd like to move to: "<<endl

int nextX =readX()

int nextY =readY()

if(nextY==8||nextX<0||nextX>7)

{

cout<<"Don't be daughty, you can't move out of the board,dead or alive."<<endl

}

else if(getmatrix(nextX,nextY) !=' ')

cout<<"The position is occupid!"<<endl

else

{

if(abs(currentX-nextX)==1&&abs(currentY-nextY)==1)

{

return simplymove(currentX,currentY,nextX,nextY)

}

else if(abs(currentX-nextX)==2&&abs(currentY-nextY)==2)

{

return jump(currentX,currentY,nextX,nextY)

}

else

{

cout<<"Not a valid move!"<<endl

}

}

}

return false

}

int main()

{

Board checkergame

Player red('r')

Player black('b')

checkergame.move(red)

bool red_turn = true

bool turntaking

while(!red.lose()&&!black.lose())

{

if(red_turn==true)

{

turntaking = checkergame.move(red)

red_turn = red_turn&&turntaking

}

else

{

turntaking = checkergame.move(black)

red_turn = turntaking

}

}

return 0

}

VB跳棋代码:

窗体代码:

Dim ChessBoard(-2 To 10, -2 To 10) As Byte ''雀岩棋盘(8竖*8棋)

Dim x(10) As Integer, y(10) As Integer ''搜索的每种走念滚法

Dim x1(10) As Integer, y1(10) As Integer''搜索的每种走法的可吃子坐标

Dim BestLocate As CHESSER

Dim CurrentPlayer As Byte ''当前玩家

Dim CurrentStep As Integer ''当前步

Dim 人机模式 As Boolean

Dim cSel As Byte ''玩家选择了哪个棋子

Dim tTemp As Boolean

Const MAXDOWNPOINT = 7

Rem 如果Cer为1(黑方),则返回2(红方),否则返加1(黑方)

Public Function NextCer(ByVal Cer As Byte) As Byte

NextCer = 1

If Cer = 1 Then NextCer = 2

End Function

Rem 棋盘

Private Sub Initial()

Dim i As Integer, j As Integer

For i = 1 To 8: For j = 1 To 8: ChessBoard(i, j) = 0: Next j: Next i

ChessBoard(1, 2) = 201

ChessBoard(1, 4) = 201

ChessBoard(1, 6) = 201

ChessBoard(1, 8) = 201

ChessBoard(2, 1) = 201

ChessBoard(2, 3) = 201

ChessBoard(2, 5) = 201

ChessBoard(2, 7) = 201

ChessBoard(3, 2) = 201

ChessBoard(3, 4) = 201

ChessBoard(3, 6) = 201

ChessBoard(3, 8) = 201

ChessBoard(6, 1) = 101

ChessBoard(6, 3) = 101

ChessBoard(6, 5) = 101

ChessBoard(6, 7) = 101

ChessBoard(7, 2) = 101

ChessBoard(7, 4) = 101

ChessBoard(7, 6) = 101

ChessBoard(7, 8) = 101

ChessBoard(8, 1) = 101

ChessBoard(8, 3) = 101

ChessBoard(8, 5) = 101

ChessBoard(8, 7) = 101

End Sub

Rem 反显示(将屏幕显示的内容存入ChessBoard数组)

Private Sub ReDisplay()

Dim i As Integer, j As Integer, k As Integer

k = 0

For i = 1 To 8

For j = 1 To 8

If cbText(k).Text = "" Then ChessBoard(i, j) = 0

If cbText(k).Text = "101" Then ChessBoard(i, j) = 101

If cbText(k).Text = "201" Then ChessBoard(i, j) = 201

If cbText(k).Text = "102" Then ChessBoard(i, j) = 102

If cbText(k).Text = "202" Then ChessBoard(i, j) = 202

k = k + 1

Next j

Next i

End Sub

Rem 显示(顷高御将ChessBoard数组的内容显示到屏幕后)

Private Sub Display()

Dim i As Integer, j As Integer, k As Integer

k = 0

For i = 1 To 8

For j = 1 To 8

If ChessBoard(i, j) = 0 Then

cbText(k).Text = ""

Else

cbText(k).Text = ChessBoard(i, j)

End If

k = k + 1

Next j

Next i

Call 胜负判断

End Sub

Rem 胜负判断

Private Sub 胜负判断()

Dim i As Integer, j As Integer

Dim a As Integer, b As Integer

a = 0: b = 0

For i = 1 To 8

For j = 1 To 8

If Int(ChessBoard(i, j) / 100) = 1 Then a = a + 1 ''计算玩家的棋子数

If Int(ChessBoard(i, j) / 100) = 2 Then b = b + 1 ''计算电脑的棋子数

Next j

Next i

If a = 0 Then Call MsgBox("我赢了!", vbOKOnly + 32, "提示:"): Exit Sub

If b = 0 Then Call MsgBox("我认输了!", vbOKOnly + 32, "提示:"): Exit Sub

End Sub

Rem 返回估值

Private Function CurrentValue(Cer As Byte) As Integer

Dim i As Integer, j As Integer

CurrentValue = 0

For i = 1 To 8

For j = 1 To 8

If Int(ChessBoard(i, j) / 100) = Cer Then _

CurrentValue = CurrentValue + ChessBoard(i, j) Mod 100 * 100 + 100 ''是我方的棋子,棋子为1加100分,棋子为2加200分

If Int(ChessBoard(i, j) / 100) = NextCer(Cer) Then _

CurrentValue = CurrentValue - (ChessBoard(i, j) Mod 100 * 100 + 100) ''对方的棋子,棋子为1减100分,棋子为2减200分

Next j

Next i

End Function

Rem 如果Cer方i,j的棋子还可以吃子则返回True

Private Function IsLine(Cer As Byte, i As Byte, j As Byte) As Boolean

Dim x As Byte, y As Byte, x1 As Byte, y1 As Byte

IsLine = False

''开始搜索棋盘

''如果是Cer方的棋子

If Int(ChessBoard(i, j) / 100) = Cer Then

''吃子式走法1:即如果基本走法的位置有对方的棋子则可以跳吃(走法限制:Cer为1或棋子为加强棋才可走)

If Int(ChessBoard(i - 1, j - 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then

x = (i - 1) - 1 ''目标坐标

y = (j - 1) - 1

x1 = i - 1 ''吃子坐标

y1 = j - 1

If x >0 And y >0 And x <9 And y <9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True

End If

''吃子式走法2

If Int(ChessBoard(i - 1, j + 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then

x = (i - 1) - 1

y = (j + 1) + 1

x1 = i - 1

y1 = j + 1

If x >0 And y >0 And x <9 And y <9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True

End If

''吃子式走法3

If Int(ChessBoard(i + 1, j - 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then

x = (i + 1) + 1

y = (j - 1) - 1

x1 = i + 1

y1 = j - 1

If x >0 And y >0 And x <9 And y <9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True

End If

''吃子式走法4

If Int(ChessBoard(i + 1, j + 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then

x = (i + 1) + 1

y = (j + 1) + 1

x1 = i + 1

y1 = j + 1

If x >0 And y >0 And x <9 And y <9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True

End If

End If

End Function

Rem 如果Cer方的棋子还可以吃子则返回True

Private Function IsLine2(Cer As Byte) As Boolean

Dim x As Byte, y As Byte, x1 As Byte, y1 As Byte

Dim i As Integer, j As Integer

IsLine2 = False

''开始搜索棋盘

For i = 1 To 8

For j = 1 To 8

''如果是Cer方的棋子

If Int(ChessBoard(i, j) / 100) = Cer Then

''吃子式走法1:即如果基本走法的位置有对方的棋子则可以跳吃(走法限制:Cer为1或棋子为加强棋才可走)

If Int(ChessBoard(i - 1, j - 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then

x = (i - 1) - 1 ''目标坐标

y = (j - 1) - 1

x1 = i - 1 ''吃子坐标

y1 = j - 1

If x >0 And y >0 And x <9 And y <9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True

End If

''吃子式走法2

If Int(ChessBoard(i - 1, j + 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then

x = (i - 1) - 1

y = (j + 1) + 1

x1 = i - 1

y1 = j + 1

If x >0 And y >0 And x <9 And y <9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True

End If

''吃子式走法3

If Int(ChessBoard(i + 1, j - 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then

x = (i + 1) + 1

y = (j - 1) - 1

x1 = i + 1

y1 = j - 1

If x >0 And y >0 And x <9 And y <9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True

End If

''吃子式走法4

If Int(ChessBoard(i + 1, j + 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then

x = (i + 1) + 1

y = (j + 1) + 1

x1 = i + 1

y1 = j + 1

If x >0 And y >0 And x <9 And y <9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True

End If

End If

Next j

Next i

End Function

Rem 搜索程序

Private Function Search(Cer As Byte, Steps As Integer, IsTop As Boolean, UpMax As Integer)

Dim a As Integer, b As Integer, b1 As Integer, b2 As Integer, i As Integer, j As Integer, k As Integer, l As Integer, v As Integer

Dim MaxValue As Integer

Dim Sc(40) As CHESSER

Dim IsEat(7) As Boolean''搜索到的7种走法有没有吃子

Dim EAT As Boolean ''有没有吃子

If IsTop Then

List1.Clear

For i = 0 To 40: Sc(i).Allow = False: Next i '默认情况下所有走法皆不允许,如果所有值均为False则皆允许

End If

EAT = False

For i = 0 To 7: IsEat(7) = False: Next i''默认情况所有搜索到的走法都没有吃子

Steps = Steps - 1

If Steps <1 And IsLine2(Cer) = False Then

''如果我方无子可吃时才返回估值

Search = -CurrentValue(Cer) ''返回估值

Exit Function

End If

k = 0

''开始搜索棋盘

For i = 1 To 8

For j = 1 To 8

''如果是Cer方的棋子

If Int(ChessBoard(i, j) / 100) = Cer Then

For i1 = 1 To MAXDOWNPOINT: x(i1) = 0: x1(i1) = 0: Next ''x记载所有走法,清空x

''列出所有走法

''基本走法:上左、上右、下左、下右

x(0) = i - 1: y(0) = j - 1

x(1) = i - 1: y(1) = j + 1

x(2) = i + 1: y(2) = j - 1

x(3) = i + 1: y(3) = j + 1

''棋子表示方法:白棋 101(普通)、102 (过底的威力棋)

'' 红棋 201(普通)、202 (过底的威力棋)

''下一句解释:如果是白棋(101、102),不允许后退(删除x(2)、x(3))

If Cer = 1 And ChessBoard(i, j) Mod 100 <>2 Then x(2) = -2: x(3) = -2

''下一句解释:如果是红棋(201、202),不允许后退(删除x(0)、x(1))

If Cer = 2 And ChessBoard(i, j) Mod 100 <>2 Then x(0) = -2: x(1) = -2

''吃子式走法1:即如果基本走法的位置有对方的棋子则可以跳吃(走法限制:Cer为1或棋子为加强棋才可走)

If Int(ChessBoard(i - 1, j - 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then

x(4) = (i - 1) - 1 ''目标坐标

y(4) = (j - 1) - 1

x1(4) = i - 1 ''吃子坐标

y1(4) = j - 1

If x(4) >0 And y(4) >0 And x(4) <9 And y(4) <9 And ChessBoard(x(4), y(4)) = 0 Then _

EAT = True: IsEat(4) = True ''有可吃子,必需走此步,其余走法无效

End If

''吃子式走法2

If Int(ChessBoard(i - 1, j + 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then

x(5) = (i - 1) - 1

y(5) = (j + 1) + 1

x1(5) = i - 1

y1(5) = j + 1

If x(5) >0 And y(5) >0 And x(5) <9 And y(5) <9 And ChessBoard(x(5), y(5)) = 0 Then _

EAT = True: IsEat(5) = True ''有可吃子,必需走此步,其余走法无效

End If

''吃子式走法3

If Int(ChessBoard(i + 1, j - 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then

x(6) = (i + 1) + 1

y(6) = (j - 1) - 1

x1(6) = i + 1

y1(6) = j - 1

If x(6) >0 And y(6) >0 And x(6) <9 And y(6) <9 And ChessBoard(x(6), y(6)) = 0 Then _

EAT = True: IsEat(6) = True ''有可吃子,必需走此步,其余走法无效

End If

''吃子式走法4

If Int(ChessBoard(i + 1, j + 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then

x(7) = (i + 1) + 1

y(7) = (j + 1) + 1

x1(7) = i + 1

y1(7) = j + 1

If x(7) >0 And y(7) >0 And x(7) <9 And y(7) <9 And ChessBoard(x(7), y(7)) = 0 Then _

EAT = True: IsEat(7) = True ''有可吃子,必需走此步,其余走法无效

End If

''如果有吃子走法,删除没有吃子的其它走法

If EAT = True Then

For a = 0 To 7

If IsEat(a) = False Then x(a) = -1

Next a

End If

''存入Sc(走法表)中

For a = 0 To 7

'If x(a) = 5 And y(a) = 2 Then Stop

''如果超过棋盘将不能走

If x(a) >0 And y(a) >0 And x(a) <9 And y(a) <9 Then

''如果目标有棋子则不能走,为0才存入

If ChessBoard(x(a), y(a)) = 0 Then

''将走法存入“走法表”

Sc(k).Initx = i

Sc(k).Inity = j

Sc(k).ObjX = x(a)

Sc(k).ObjY = y(a)

Sc(k).x1 = x1(a)''被吃子位置

Sc(k).y1 = y1(a)

If IsEat(a) = True Then Sc(k).Allow = True ''如果有吃子,则允许此着走法

k = k + 1

End If

End If

Next a

'If EAT = True Then i = 100: j = 100 ''如果有吃子则不必再搜索

End If

Next j

Next i

MaxValue = -30000 ''当前分数

tTemp = False

''搜索是否有允许走法,如果没有则所有走法皆允许

For i = 0 To k - 1

If Sc(i).Allow = True Then tTemp = True

Next i

''如果有允许走法,则除允许走法外,其余走法皆不允许走

If tTemp = False Then

For i = 0 To k - 1: Sc(i).Allow = True: Next i

End If

''试走每种走法

For i = 0 To k - 1

If Sc(i).Allow = True Then

b1 = ChessBoard(Sc(i).Initx, Sc(i).Inity) ''记录起点棋子和终点棋子

b2 = ChessBoard(Sc(i).ObjX, Sc(i).ObjY)

b = ChessBoard(Sc(i).x1, Sc(i).y1) ''记录被吃子位置的棋子

ChessBoard(Sc(i).Initx, Sc(i).Inity) = 0 ''清除起点的棋子

ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = b1 ''试下棋

ChessBoard(Sc(i).x1, Sc(i).y1) = 0 ''清除被吃子位置的棋子

''如果到边界则威力加强

''下句:如果是黑方(101、102)

If Cer = 1 Then

''下句:如果走到第一行则棋子变成102,威力加强

If Sc(i).ObjX = 1 Then ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = 102

End If

''下句:如果是红方(201、202)

If Cer = 2 Then

''下句:如果走到第八行则棋子变成202,威力加强

If Sc(i).ObjX = 8 Then ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = 202

End If

If b >0 And IsLine(Cer, Sc(i).ObjX, Sc(i).ObjY) = True And EAT = True Then

''如果可连续吃子

v = CurrentValue(Cer) + 300 ''V为当前局面价值加300分

Else

v = Search(NextCer(Cer), Steps - 1, False, -UpMax) ''没有连续可吃子,继续搜索

End If

''恢复棋盘

ChessBoard(Sc(i).x1, Sc(i).y1) = b ''恢复被吃子

ChessBoard(Sc(i).Initx, Sc(i).Inity) = b1 ''记录起点棋子和终点棋子

ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = b2

'' 显示每种走法的得分

If IsTop Then

List1.AddItem "从" &Str(Sc(i).Initx) &"," &Str(Sc(i).Inity) &_

"到" &Str(Sc(i).ObjX) &"," &Str(Sc(i).ObjY) &"得分:" &Str(v)

End If

'如果这种走法分数高,记录

If IsTop And (v >MaxValue Or MaxValue = -30000) Then

BestLocate.Initx = Sc(i).Initx

BestLocate.Inity = Sc(i).Inity

BestLocate.ObjX = Sc(i).ObjX

BestLocate.ObjY = Sc(i).ObjY

BestLocate.x1 = Sc(i).x1

BestLocate.y1 = Sc(i).y1

MaxValue = v

End If

If v >MaxValue Then MaxValue = v

'下句: 如果 MaxValue >= -UpMax //α-β剪枝, 符合剪枝条件的就Cut掉。UpMax为上层的MaxValue

If IsTop = False And MaxValue >= -UpMax Then i = 100 ''剪枝程序

End If

Next i

If IsTop = False Then Search = -MaxValue Else Search = MaxValue

End Function

Private Sub cbText_Click(Index As Integer)

Dim i As Integer, j As Integer, C As Integer''C记载吃子

Dim Temp As String, Temp2 As String, Temp3 As String

Dim x As Byte, y As Byte, x2 As Byte, y2 As Byte

If cbText(Index).BackColor <>&HC0E0FF Then Call MsgBox("落棋无效!", vbOKOnly + 32, "提示:"): Exit Sub

If cSel = 0 And Trim(cbText(Index).Text) >"" Then cSel = Index: cbText(cSel).ForeColor = QBColor(12): Exit Sub ''如果玩家一个也没先且当前棋盘位置有棋子,则标示玩家选择此棋子

If cSel <>0 And Val(cbText(Index).Text) = Val(cbText(cSel).Text) Then cbText(cSel).ForeColor = H80000008&: cSel = 0: Exit Sub ''如果玩家两次选择相同的棋子则取消选择

If cSel <>0 Then

''下棋

cbText(Index).Text = cbText(cSel).Text

''判断是否可变成加强棋

k = Val(cbText(Index).Text)

If Int(k / 100) = 1 And Index <8 Then cbText(Index).Text = "102" ''如果1方走到顶端就变成加强棋

If Int(k / 100) = 2 And Index >55 Then cbText(Index).Text = "202" ''如果2方走到顶端就变成加强棋

cbText(cSel).Text = ""

cbText(cSel).ForeColor = H80000008&

''判断有没有吃子

''向上左斜

If Index - cSel = -18 Then

cbText(Index + 9).Text = "":''被吃子

C = Index + 9

End If

''向上右斜

If Index - cSel = -14 Then

cbText(Index + 7).Text = "":''被吃子

C = Index + 7

End If

''向下左斜

If Index - cSel = 14 Then

cbText(Index - 7).Text = "":''被吃子

C = Index - 7

End If

''向下右斜

If Index - cSel = 18 Then

cbText(Index - 9).Text = "":''被吃子

C = Index - 9

End If

''存储走法

k = 0: Temp = "": Temp2 = "": Temp = ""

For i = 1 To 8

For j = 1 To 8

If k = cSel Then Temp = "从" &Str(i) + "," + Str(j)

If k = Index Then Temp2 = " 到" + Str(i) + "," + Str(j): x = i: y = j

If k = C Then Temp3 = "吃子 " &Str(i) &"," &Str(j): x2 = i: y2 = j

k = k + 1

Next j

Next i

List2.AddItem "第" &Str(CurrentStep) &"手 " &Str(CurrentPlayer) + "方" + Temp + Temp2 + Temp3

CurrentStep = CurrentStep + 1

Text3.Text = Temp + Temp2

cSel = 0

Call ReDisplay

''下句:如果是人机模式并且玩家还没有可吃子

If 人机模式 = True And (IsLine(CurrentPlayer, x, y) = True And x2 >1 And y2 >2) = False Then

'If 人机模式 = True Then

''看玩家走了哪方的棋子,就运算另一方的棋子

CurrentPlayer = NextCer(Int(Val(cbText(Index).Text) / 100))

Call Command2_Click ''如果是人机模式则让电脑运长

End If

End If

End Sub

Private Sub Command1_Click()

List2.Clear ''清除棋谱

CurrentStep = 1

Call Initial

Call Display

End Sub

Private Sub Command2_Click()

Dim t As Boolean

Command2.Enabled = False

t:

Text1.Text = Str(Search(CurrentPlayer, Val(Text2.Text), True, 0))

Command2.Enabled = True

With BestLocate

t = DownChess(.Initx, .Inity, .ObjX, .ObjY, .x1, .y1)

Call Display

If t = True And IsLine(CurrentPlayer, .ObjX, .ObjY) Then Call MsgBox("我还想再吃一个"): GoTo t ''如果所下之棋还能吃子(连续吃)则再运算

End With

CurrentPlayer = NextCer(CurrentPlayer)

End Sub

Rem 移棋

Rem Sx,Sy:起点棋子 Ex,Ey:终点棋子 Ax,Ay:被吃子

Rem 如果有吃子则返回True

Private Function DownChess(Sx As Byte, Sy As Byte, ex As Byte, ey As Byte, Ax As Byte, Ay As Byte) As Boolean

ChessBoard(ex, ey) = ChessBoard(Sx, Sy)

ChessBoard(Sx, Sy) = 0

ChessBoard(Ax, Ay) = 0 ''清除被吃子

If Ax <>0 And Ay <>0 Then DownChess = True Else DownChess = False

Text3.Text = "第" &Str(CurrentStep) &"手 " &Str(CurrentPlayer) + "方从" &Str(Sx) + "," + Str(Sy) + "到" + Str(ex) + "," + Str(ey) &_

"吃子 " &Str(Ax) &"," &Str(Ay)

CurrentStep = CurrentStep + 1

List2.AddItem Text3.Text

''下句:如果是黑方(101、102)

If Int(ChessBoard(ex, ey) / 100) = 1 Then

''下句:如果走到第一行则棋子变成102,威力加强

If ex = 1 Then ChessBoard(ex, ey) = 102

End If

''下句:如果是红方(201、202)

If Int(ChessBoard(ex, ey) / 100) = 2 Then

''下句:如果走到第八行则棋子变成202,威力加强

If ex = 8 Then ChessBoard(ex, ey) = 202

End If

End Function

Rem 运算一

Private Sub Command3_Click()

CurrentPlayer = 1

Call Command2_Click

End Sub

Rem 运算二

Private Sub Command4_Click()

CurrentPlayer = 2

Call Command2_Click

End Sub

Private Sub Command5_Click()

Call ReDisplay

End Sub

Private Sub Command6_Click()

If 人机模式 = False Then 人机模式 = True Else 人机模式 = False

If 人机模式 = False Then Command6.Caption = " 人机模式": Command6.ToolTipText = "当前模式:人人对战" Else Command6.Caption = " 休息模式": Command6.ToolTipText = "当前模式:人机对战"

End Sub

Private Sub Command7_Click()

End

End Sub

Rem 存谱

Private Sub Command8_Click()

On Error GoTo e

Dim i As Integer

Open InputBox("请输入文件名:") For Output As #1

For i = 0 To List2.ListCount - 1

Print #1, List2.List(i)

Next i

Close #1

Exit Sub

e:

Call MsgBox("存储错误!", vbOKOnly + 32, "提示:")

Err.Clear

Exit Sub

End Sub

Private Sub Form_Load()

人机模式 = False

cSel = 0

CurrentPlayer = 1

Call Command1_Click

End Sub

模块代码:

Type CHESSER

Chess As Byte ''为何棋,在BestLocate则标明为何数组

Initx As Byte ''起初棋的位置

Inity As Byte

ObjX As Byte''经运算后的落棋点

ObjY As Byte

x1 As Byte

y1 As Byte

Allow As Boolean''是否允许

End Type


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12461527.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存