#include <string>
using namespace std
class CGobang //棋子类
{
private:
char chSort //棋子的类别
int nWin//赢棋的次数
int nLose //输棋的次数
static int nDraw//平局次数
static char achBoard[3][3] //棋盘
static int nSize//棋盘的尺寸 nSize X nSize
public:
CGobang(char chsort) //构造函数,决定一方棋子的类别
{
chSort=chsort
nWin=nLose=nDraw=0
}
void PlayTurn(void) //走1步棋
int Judge() //判断是否连成一线,是则返回1,否则返回0
void Win(void) //赢棋
void Lose(void) //输棋
static void Draw(void) //平局
void PrintInfo(void)//输出总体情况
static void PrintBoard(void)//输出棋盘
static int GetFull(void)//判断棋盘是否已布满棋子
static void InitialBoard(void) //初始化棋盘
}
char CGobang::achBoard[3][3]
int CGobang::nSize = 3
int CGobang::nDraw = 0
void CGobang::Draw()
{
cout <<"\n\n\t\t平局!\n\n"
nDraw++
}
void CGobang::InitialBoard() //初始化棋盘
{
for(int i=0i<nSizei++)
for(int j=0j<nSizej++)
achBoard[i][j]=' '
}
void CGobang::PrintBoard()//输出棋盘
{
cout <<endl
cout <<" 1 2 3 " <<endl
cout <<"1 " <<achBoard[0][0] <<" | " <<achBoard[0][1] <<" | " <<achBoard[0][2] <<endl
cout <<" ---|---|---" <<endl
cout <<"2 " <<achBoard[1][0] <<" | " <<achBoard[1][1] <<" | " <<achBoard[1][2] <<endl
cout <<" ---|---|---" <<endl
cout <<"3 " <<achBoard[2][0] <<" | " <<achBoard[2][1] <<" | " <<achBoard[2][2] <<endl
cout <<endl
cout <<endl
}
int CGobang::GetFull()//判断棋盘是否布满棋子,若是返回1
{
for(int i=0i<nSizei++)
for(int j=0j<nSizej++)
if(achBoard[i][j]!=' ')
return 0
return 1
}
void CGobang::Win() //赢棋
{
cout <<"\n\n\t\t"<<chSort<<"方获胜!\n\n"
nWin++
}
void CGobang::Lose() //输棋
{
nLose++
}
void CGobang::PlayTurn(void) //走1步棋
{
int nRow,nCol
cout <<"现在该 "<<chSort<<" 方下棋,请输入棋盘坐标(x,y):"
do
{
cin >>nRow >>nCol //输入坐标
if(nRow>nSize || nCol>nSize) //判断坐标越界
cout <<"输入的坐标越界,x与y的范围应小于等于"<<nSize<<",请重新输入\n"
else if(achBoard[nRow-1][nCol-1]!=' ') //判断坐标合理
cout <<"棋盘("<<nRow <<" ,"<<nCol <<")处已有棋子,请重新输入\n"
else
{
achBoard[nRow-1][nCol-1]=chSort //在坐标处放上棋子
break //退出循环
}
}while(1)
}
int CGobang::Judge() //判断是否棋子连成一线,若是返回1
{//以下是各种可能连成一线的情况
if(achBoard[0][0]==chSort &&achBoard[1][1]==chSort &&achBoard[2][2]==chSort)
return 1
else if(achBoard[2][0]==chSort &&achBoard[1][1]==chSort &&achBoard[0][2]==chSort)
return 1
else if(achBoard[0][0]==chSort &&achBoard[1][0]==chSort &&achBoard[2][0]==chSort)
return 1
else if(achBoard[0][1]==chSort &&achBoard[1][1]==chSort &&achBoard[2][1]==chSort)
return 1
else if(achBoard[0][2]==chSort &&achBoard[1][2]==chSort &&achBoard[2][2]==chSort)
return 1
else if(achBoard[0][0]==chSort &&achBoard[0][1]==chSort &&achBoard[0][2]==chSort)
return 1
else if(achBoard[1][0]==chSort &&achBoard[1][1]==chSort &&achBoard[1][2]==chSort)
return 1
else if(achBoard[2][0]==chSort &&achBoard[2][1]==chSort &&achBoard[2][2]==chSort)
return 1
else
return 0//没有连成一线则返回0
}
void CGobang::PrintInfo(void) //打印总体情况
{
cout <<"Side "<<chSort<<"方共计赢 "<<nWin<<" 局,输 "<<nLose<<" 局,平 "<<nDraw<<" 局。"<<endl
}
void PrintRule(void) //打印规则
{
cout <<"\t\t欢迎使用三子连珠游戏!" <<endl <<endl
cout <<"\t游戏规则:" <<endl
cout <<"\t1.每1步输入要下棋的格子的x,y坐标,按Enter键\n"
cout <<"\t2.有1方首先3个棋子连成一线即判获胜\n"
cout <<"\t3.当棋子布满棋盘但仍无获胜方即为平局\n"
cout <<"\t4.X方先行\n"
cout <<"\n\n\t\t请按任意键开始下棋!\n\n"
}
int JudgePlay(CGobang &SideX,CGobang &SideO) //每下1步要进行输赢的判断,有结果则返回1
{
if(SideX.Judge()) //X方获胜
{
SideX.Win()
SideO.Lose()
return 1
}
else if(SideO.Judge())//O方获胜
{
SideO.Win()
SideX.Lose()
return 1
}
else
return 0
}
void Play(CGobang &SideX,CGobang &SideO) //开始一局游戏
{
while(1)
{
CGobang::PrintBoard() //输出棋盘
SideX.PlayTurn()//X方下棋
if(JudgePlay(SideX,SideO))//判断输赢
break
if(CGobang::GetFull())//判断是否平局
{
CGobang::Draw()
break
}
CGobang::PrintBoard() //输出棋盘
SideO.PlayTurn()//O方下棋
if(JudgePlay(SideX,SideO))//判断输赢
break
if(CGobang::GetFull())//判断是否平局
{
CGobang::Draw()
break
}
}
}
int main(void)
{
CGobang SideX('X'),SideO('O') //定义两个棋子类对象,分别代表X方与O方
PrintRule()
cin.get()
string strChoice
do
{
CGobang::InitialBoard() //初始化棋盘
Play(SideX,SideO) //开始下一局
cout <<"是否继续(Y/N)?"
cin >>strChoice
}while(strChoice == "Y" || strChoice == "y")
SideX.PrintInfo()
SideO.PrintInfo()
cout <<"\n\n\t欢迎再次使用三子连珠游戏!" <<endl <<endl
return 0
}
接上面中国象棋代码:
if( check_turn == 12) //相的走法规范
{ if((x == check_x &&y == check_y))
{temp = turn temp1 = turn1 turn = 'O' turn1 = 'N' num--
printf("三思而后行\n")printf("还是你的回合")Sleep(500)
}
else if( x >= 15 &&(abs(y - check_y) == 8 &&abs(x - check_x) == 4))
{if((x == 22 &&(y == 11 || y == 27))||(x == 18 &&
( y == 3 || y == 19 || y == 35)) ||(x == 14 &&(y == 11|| y ==27)))
{ if( map[(x+check_x)/2][(y+check_y)/2] == '+') check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else {printf("棋子卡住,不可执行")Sleep(500)} }
else {printf("不合法的下法\n")Sleep(500)}
}
else {printf("不合法的下法\n")Sleep(500)}
}
if( check_turn == 13) //士的走法规范
{ if((x == check_x &&y == check_y))
{temp = turn temp1 = turn1 turn = 'O' turn1 = 'N' num--
printf("三思而后行\n")printf("还是你的回合")Sleep(500) }
else if( abs(x - check_x)== 2 &&abs( y - check_y) == 4 &&((x==22 &&(y == 15
|| y == 23)) || ( x == 20 &&y == 19) || ( x == 18 &&( y == 15 || y == 23)))) {check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map)}
else { printf("不合法的下法\n")Sleep(500)} }
if( check_turn == 14) //将的走法规范
{ if((x == check_x &&y == check_y))
{ temp = turn temp1 = turn1 turn = 'O' turn1 = 'N' num--
printf("三思而后行\n")printf("还是你的回合")Sleep(500) }
else if( ((abs(x - check_x)== 2 &&abs( y - check_y) == 0 )|| (abs(x - check_x)== 0
&&abs( y - check_y) == 4)) &&x >= 18 &&x <= 22 &&y >= 15 &&y <= 23 )
{ check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map)}
else { printf("不合法的下法\n")Sleep(500)} }
if( check_turn == 15) //炮的走法规范
{ if((x == check_x &&y == check_y))
{ temp = turn temp1 = turn1 turn = 'O' turn1 = 'N' num--
printf("三思而后行\n")printf("还是你的回合")Sleep(500) }
else if( y == check_y )
{ int check_pao = 0
if( x >check_x)
{ for(j = check_x + 2j<= x j = j+ 2)
{ if(map[j][y] == '+' ) else check_pao++}
if(check_pao == 1&&temp == '+') // 直线行走但不可吃棋子 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else if( check_pao == 2 &&temp != '+') //跳跃吃棋 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else { printf("不合法的下法\n")Sleep(500)} }
else { for(j = check_x - 2j>= xj = j - 2)
{ if(map[j][y] == '+' ) else { check_pao++} }
if(check_pao == 1&&temp == '+') //直线行走但不可吃棋子 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else if( check_pao == 2 &&temp != '+') //跳跃吃棋 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else { printf("不合法的下法\n")Sleep(500)} }
}
else if( x == check_x )
{ int check_pao = 0
if( y >check_y)
{ for(j = check_y + 4j<= y j = j+4)
{ if(map[x][j] == '+' ) else check_pao++}
if(check_pao == 1&&temp == '+') //直线行走但不可吃棋子 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else if( check_pao == 2 &&temp != '+') //跳跃吃棋 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else { printf("不合法的下法\n")Sleep(500)} }
else {for(j = check_y - 4j>= yj = j - 4)
{if(map[x][j] == '+' ) else check_pao++}
if(check_pao == 1&&temp == '+') //直线行走但不可吃棋子 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else if( check_pao == 2 &&temp != '+') //跳跃吃棋 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else { printf("不合法的下法\n")Sleep(500)} }
}
else { printf("不合法的下法\n")Sleep(500)}
}
if( check_turn == 16) //卒的走法规范
{ if ( x >= 14)
{ if((x == check_x &&y == check_y))
{ temp = turn temp1 = turn1 turn = 'O' turn1 = 'N' num--
printf("三思而后行\n")printf("还是你的回合") Sleep(500) }
else if( x == check_x - 2 &&y == check_y) check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else { printf("不合法的下法\n")Sleep(500)}
}
else{ if((x == check_x &&y == check_y))
{ temp = turn temp1 = turn1 turn = 'O' turn1 = 'N' num--
printf("三思而后行\n")printf("还是你的回合")Sleep(500) }
else if((x - check_x == 0 &&abs(y-check_y) ==4) ||( x - check_x == -2
&&abs(y-check_y) == 0)) check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else { printf("不合法的下法\n")Sleep(500)} }
}
}
else { if( check_turn == 20) //车的走法规范 (帅方)
{ if((x == check_x &&y == check_y))
{ temp = turn temp1 = turn1turn = 'O'turn1 = 'N' num--
printf("三思而后行\n")printf("还是你的回合")Sleep(500) }
else if( y == check_y )
{ if( x >check_x)
{ for(j = check_x + 2j <xj = j + 2)
{ if(map[j][y] == '+')else {printf("不合法的下法\n")Sleep(500)break} }
if( j >= x) check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
}
if( x <check_x)
{ for(j = check_x - 2j >xj = j - 2)
{ if(map[j][y] == '+')else { printf("不合法的下法\n")Sleep(500)break} }
if( j <= x) check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
}
}
else if( x == check_x )
{ if( y >check_y)
{ for(j = check_y + 4j <yj = j + 4)
{ if(map[x][j] == '+')else { printf("不合法的下法\n")Sleep(500)break} }
if( j >= y) check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
}
if( y <check_y)
{ for(j = check_y - 4j >yj = j - 4)
{ if(map[x][j] == '+')else { printf("不合法的下法\n")Sleep(500)break} }
if( j <= y) check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
}
}
else { printf("不合法的下法\n")Sleep(500)}
}
if( check_turn == 21) //马的走法规范
{ if((x == check_x &&y == check_y))
{ temp = turntemp1 = turn1turn = 'O'turn1 = 'N'num--
printf("三思而后行\n")printf("还是你的回合")Sleep(500)}
else if( (abs( x - check_x) == 2&&abs( y - check_y) == 8)&&
map[check_x][(y+check_y)/2] =='+')
{ check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)}
else if( (abs( x - check_x) == 4&&abs( y - check_y) == 4)&&
map[(x + check_x)/2][check_y] == '+' )
{ check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)}
else { printf("不合法的下法\n")Sleep(500)} }
if( check_turn == 22) //相的走法规范
{ if((x == check_x &&y == check_y))
{ temp = turntemp1 = turn1turn = 'O'turn1 = 'N'num--
printf("三思而后行\n")printf("还是你的回合")Sleep(500)}
else if( x <= 12 &&(abs(y - check_y) == 8 &&abs(x - check_x) == 4))
{ if((x == 4 &&(y == 11 || y == 27))||(x == 8 &&( y == 3 || y == 19 || y == 35))
||(x == 12 &&(y == 11|| y ==27)))
{ if( map[(x+check_x)/2][(y+check_y)/2] == '+') check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else { printf("棋子卡住,不可执行")Sleep(500)} }
else {printf("不合法的下法\n")Sleep(500)}
}
else { printf("不合法的下法\n")Sleep(500)} }
if( check_turn == 23) //士的走法规范
{ if((x == check_x &&y == check_y))
{ temp = turntemp1 = turn1turn = 'O'turn1 = 'N'num--
printf("三思而后行\n")printf("还是你的回合")Sleep(500) }
else if( abs(x - check_x)== 2 &&abs( y - check_y) == 4 &&((x==4 &&
(y == 15 || y == 23)) || ( x == 6 &&y == 19) || ( x == 8 &&( y == 15 || y == 23))))
{ check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)}
else { printf("不合法的下法\n")Sleep(500)} }
if( check_turn == 24) //将的走法规范
{ if((x == check_x &&y == check_y))
{ temp = turntemp1 = turn1turn = 'O'turn1 = 'N'num--
printf("三思而后行\n")printf("还是你的回合")Sleep(500) }
else if( ((abs(x - check_x)== 2 &&abs( y - check_y) == 0 )|| (abs(x - check_x)== 0 &&abs( y - check_y) == 4)) &&x >= 4 &&x <= 8 &&y >= 15 &&y <= 23 )
{ check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)}
else {printf("不合法的下法\n")Sleep(500)} }
if( check_turn == 25) //炮的走法规范
{ if((x == check_x &&y == check_y))
{ temp = turn temp1 = turn1turn = 'O'turn1 = 'N'num--
printf("三思而后行\n")printf("还是你的回合")Sleep(500) }
else if( y == check_y )
{ int check_pao = 0
if( x >check_x)
{ for(j = check_x + 2j<= x j = j+ 2)
{ if(map[j][y] == '+' ) else check_pao++}
if(check_pao == 1&&temp == '+') //直线行走但不可吃棋子 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else if( check_pao == 2 &&temp != '+') //跳跃吃棋 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else { printf("不合法的下法\n")Sleep(500)} }
else { for(j = check_x - 2j>= xj = j - 2)
{ if(map[j][y] == '+' ) else { check_pao++} }
if(check_pao == 1&&temp== '+') //直线行走但不可吃棋子 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else if( check_pao == 2 &&temp != '+') //跳跃吃棋 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else { printf("不合法的下法\n")Sleep(500)} }
}
else if( x == check_x )
{ int check_pao = 0
if( y >check_y)
{ for(j = check_y + 4j<= y j = j+4)
{ if(map[x][j] == '+' ) else check_pao++}
if(check_pao == 1&&temp == '+') //直线行走但不可吃棋 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else if( check_pao == 2 &&temp != '+') //跳跃吃棋 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else { printf("不合法的下法\n")Sleep(500)} }
else { for(j = check_y - 4 j>= yj = j - 4)
{ if(map[x][j] == '+' ) else check_pao++}
if(check_pao ==1&&temp == '+') //直线行走但不可吃棋子 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else if( check_pao == 2&&temp != '+') //跳跃吃棋 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else { printf("不合法的下法\n")Sleep(500)} }
}
else { printf("不合法的下法\n")Sleep(500)}
}
if( check_turn == 26) //卒的走法规范
{ if( x <= 12)
{ if((x == check_x &&y == check_y))
{ temp = turntemp1 = turn1turn = 'O'turn1 = 'N'num--
printf("三思而后行\n")printf("还是你的回合")Sleep(500)}
else if( x == check_x + 2 &&y == check_y) check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else { printf("不合法的下法\n")Sleep(500)} }
else{ if((x == check_x &&y == check_y))
{ temp = turntemp1 = turn1turn = 'O'turn1 = 'N'num--
printf("三思而后行\n")printf("还是你的回合")Sleep(500) }
else if((x - check_x == 0 &&abs(y-check_y) ==4) ||( x - check_x == 2
&&abs(y-check_y) == 0)) check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map)
else { printf("不合法的下法\n")Sleep(500)} }
}
}
}
}
system("cls")
if( if_return) return
for(i = 0i <27i++)puts(map[i])
}
Sleep(5000)
}
int main( )
{ while(1)
{ xiangqi( )
printf("\n 重来,请按键.\n")
getch( )
}
return 0
}
http://tieba.baidu.com/f?ct=335675392&tn=baiduPostBrowser&sc=4335990148&z=430611008&pn=0&rn=30&lm=0&word=c%2B%2B#4335990148百度贴吧里面的,我试过可以运行,有人机对战功能~
#include <iostream.h>
#include <process.h>
#include <conio.h>
class five
{
int x
int y
int m
int n
int num_xy
int num_mn
char qipan[20][20]
public:
five(int X = 0,int Y =0,int M = 0,int N = 0,int Num_xy = 0,int Num_mn = 0)
{
x = X
y = Y
m = M
n = N
num_xy = Num_xy
num_mn = Num_mn
for(int i = 0 i <20 i ++)
{
for(int j = 0 j <20 j ++)
qipan[i][j] = '.'
}
}
int getm()
{
return m
}
int getn()
{
return n
}
void getpointxy()
void getpointmn()
void machinemn()
void showqipan()
void print()
bool IsxyWin()
bool IsmnWin()
int dangerlevel(int a,int b)
void attack()
}
void five::getpointxy()
{
cout<<"请分别输入第"<<num_xy+1<<"步白棋('o')的横坐标和纵坐标:"
cin >>x >>y
if(x <= 0 || y <= 0 || x >20 || y >20 )
{
cout <<"出界,请重新输入:"<<endl
getpointxy()
}
else if(qipan[y-1][x-1] != '.' )
{
cout <<"请所下的位置已经有棋子,请重新输入:" <<endl
getpointxy()
}
else if(num_xy+num_mn >= 400)
{
cout <<"棋盘已满,平局!" <<endl
exit(0)
}
else
{
qipan[y-1][x-1] = 'o'
num_xy++
}
}
void five::getpointmn()
{
cout<<"请分别输入第"<<num_mn+1<<"步黑棋('x')的横坐标和纵坐标:"
cin >>m >>n
if(m <= 0 || n <= 0 || m >20 || n >20 )
{
cout <<"出界,请重新输入:"<<endl
getpointmn()
}
else if(qipan[n-1][m-1]!='.')
{
cout <<"请所下的位置已经有棋子,请重新输入:" <<endl
getpointmn()
}
else if(num_xy+num_mn >= 400)
{
cout <<"棋盘已满,平局!" <<endl
exit(0)
}
else
{
qipan[n-1][m-1] = 'x'
num_mn++
}
}
int five::dangerlevel(int a, int b)
{
int level = 0
for(int i = 1 a+i<=19i ++)
{
if(qipan[a+i][b] == '.' &&a + i <= 19)
{
i = i+1
break
}
if(qipan[a +i][b] == 'x' &&a + i <= 19)
break
}
level += (i-1)
for(i = 1 a-i>=0i ++)
{
if(qipan[a-i][b] == '.' &&(a-i) >= 0)
{
i = i+1
break
}
if(qipan[a-i][b] == 'x' &&(a-i) >= 0)
break
}
level += (i-1)
for(i = 1 b+i<=19 i ++)
{
if(qipan[a][b + i] == '.' &&b + i <= 19)
{
i = i+1
break
}
if(qipan[a][b + i] == 'x' &&b + i <= 19)
break
}
level += (i-1)
for( i = 1 b-i>=0 i ++)
{
if(qipan[a][b - i] == '.' &&(b-i) >= 0)
{
i = i+1
break
}
if(qipan[a][b - i] == 'x' &&(b-i) >= 0)
break
}
for( i = 1 a+i<=19&&b+i<=19i ++)
{
if(qipan[a + i][b + i] == '.' &&b+i <= 19 &&a+i <= 19)
{
i = i+1
break
}
if(qipan[a + i][b + i] == 'x' &&b+i <= 19 &&a+i <= 19)
break
}
level += (i-1)
for( i = 1 a-i>= 0 &&b-i >= 0i ++)
{
if(qipan[a - i][b - i] == '.' &&a-i>= 0 &&b-i >= 0)
{
i = i+1
break
}
if(qipan[a - i][b - i] == 'x' &&a-i>= 0 &&b-i >= 0)
break
}
level += (i-1)
for( i = 1 a-i>= 0 &&b+i <= 19 i ++)
{
if(qipan[a - i][b + i] == '.' &&a-i>= 0 && b+i <= 19)
{
i = i+1
break
}
if(qipan[a - i][b + i] == 'x' &&a-i>= 0 && b+i <= 19)
break
}
level += (i-1)
for( i = 1 a + i<= 19 &&b-i >= 0 i ++)
{
if(qipan[a + i][b - i] == '.' &&a + i<= 19 && b-i >= 0)
{
i = i+1
break
}
if(qipan[a + i][b - i] == 'x' &&a + i<= 19 && b-i >= 0)
break
}
level += (i-1)
return level
}
void five::attack()
{
int num1=1,num2=1,num3=1,num4=1
int A = 20 , B = 20 ,max = 0
for(int a = 0 a <19 a ++)
{
for(int b = 0 b <19 b ++)
{
if(qipan[a][b] == '.')
{
int level = 0
for(int i = 1 a+i<=19i ++)
{
if(qipan[a+i][b] == '.' &&a + i <= 19)
{
i = i+1
break
}
if(qipan[a +i][b] == 'o' &&a + i <= 19)
break
}
level += (i-1)
for(i = 1 a-i>=0i ++)
{
if(qipan[a-i][b] == '.' &&(a-i) >= 0)
{
i = i+1
break
}
if(qipan[a-i][b] == 'o' &&(a-i) >= 0)
break
}
level += (i-1)
for(i = 1 b+i<=19 i ++)
{
if(qipan[a][b + i] == '.' &&b + i <= 19)
{
i = i+1
break
}
if(qipan[a][b + i] == 'o' &&b + i <= 19)
break
}
level += (i-1)
for( i = 1 b-i>=0 i ++)
{
if(qipan[a][b - i] == '.' &&(b-i) >= 0)
{
i = i+1
break
}
if(qipan[a][b - i] == 'o' &&(b-i) >= 0)
break
}
for( i = 1 a+i<=19&&b+i<=19i ++)
{
if(qipan[a + i][b + i] == '.' &&b+i <= 19 &&a+i <= 19)
{
i = i+1
break
}
if(qipan[a + i][b + i] == 'o' &&b+i <= 19 &&a+i <= 19)
break
}
level += (i-1)
for( i = 1 a-i>= 0 &&b-i >= 0i ++)
{
if(qipan[a - i][b - i] == '.' &&a-i>= 0 &&b-i >= 0)
{
i = i+1
break
}
if(qipan[a - i][b - i] == 'o' &&a-i>= 0 &&b-i >= 0)
break
}
level += (i-1)
for( i = 1 a-i>= 0 &&b+i <= 19 i ++)
{
if(qipan[a - i][b + i] == '.' &&a-i>= 0 && b+i <= 19)
{
i = i+1
break
}
if(qipan[a - i][b + i] == 'o' &&a-i>= 0 && b+i <= 19)
break
}
level += (i-1)
for( i = 1 a + i<= 19 &&b-i >= 0 i ++)
{
if(qipan[a + i][b - i] == '.' &&a + i<= 19 && b-i >= 0)
{
i = i+1
break
}
if(qipan[a + i][b - i] == 'o' &&a + i<= 19 && b-i >= 0)
break
}
level += (i-1)
if(level >= max)
{
n = a + 1
m = b + 1
max = level
}
}
else
continue
}
}
qipan[n-1][m-1] = 'x'
}
void five::machinemn()
{
int Num1=1,Num2=1,Num3=1,Num4=1,A11 = 21,A12 = 21,A21 = 21,A22 = 21,A31 = 21,A32 = 21,A41 = 21,A42 = 21
for(int i = x i <x+5&&x+5<20 i ++)
{
if(qipan[y-1][i] == '.')
{
A11=i
break
}
if(qipan[y-1][i] == 'x')
break
if(qipan[y-1][i] == 'o')
Num1++
}
for(i = x-2i >= 0 i --)
{
if(qipan[y-1][i] == '.')
{
A12 = i
break
}
if(qipan[y-1][i] == 'x')
{
break
}
if(qipan[y-1][i] == 'o')
Num1++
}
////
for( i = y i <y+5 &&y+5 <20 i ++)
{
if(qipan[i][x-1] == '.')
{
A21 = i
break
}
if(qipan[i][x-1] == 'x')
{
break
}
if(qipan[i][x-1] == 'o')
Num2++
}
for(i = y-2i >= 0 i --)
{
if(qipan[i][x-1] == '.')
{
A22 = i
break
}
if(qipan[i][x-1] == 'x')
{
break
}
if(qipan[i][x-1] == 'o')
Num2++
}
////
for(i = 0 i <5 &&x+i<20 &&y+i<20i++ )
{
if(qipan[y+i][x+i] == '.')
{
A31 = i
break
}
if(qipan[y+i][x+i] == 'x')
{
break
}
if(qipan[y+i][x+i] =='o')
Num3++
}
for(i = 0 x - i -2>=0 &&y-i-2>=0 &&i <5i++ )
{
if(qipan[y-i-2][x-i-2] == '.')
{
A32 = i
break
}
if(qipan[y-i-2][x-i-2] == 'x')
break
if(qipan[y-i-2][x-i-2] == 'o')
Num3++
}
////
for(i = 0 x + i <20 &&y - i - 2 >= 0 &&i <5i ++)
{
if(qipan[y-i-2][x+i] == '.')
{
A41 = i
break
}
if(qipan[y-i-2][x+i] == 'x')
{
break
}
if(qipan[y-i-2][x+i] == 'o')
Num4++
}
for(i = 0 y + i <20 &&x - i - 2 >= 0 &&i <5i ++)
{
if(qipan[y+i][x-i-2] == '.')
{
A42 = i
break
}
if(qipan[y+i][x-i-2] == 'x')
{
break
}
if(qipan[y+i][x-i-2] == 'o')
Num4++
}
////
if(num_xy == 0 &&num_xy == 0)
{
m = n = 10
qipan[m-1][n-1] = 'x'
}
else if(num_xy == 1)
attack()
else if(num_xy == 1)
{
m = x+1
n = x+1
qipan[m-1][n-1] = 'x'
}
else if(Num1 == 4 &&A11 == 21 &&A12 != 21) //一排四个右边一头堵住
{
n =1 + y-1
m = 1 + A12
qipan[y-1][A12] = 'x'
}
else if(Num1 == 4 &&A12 == 21 &&A11 != 21) //一排四个左边边一头堵住
{
n =1 + y-1
m = 1 + A11
qipan[y-1][A11] = 'x'
}
else if(Num2 == 4 &&A21 == 21 &&A22 != 21) //一列四个下边一头堵住
{
n =1 + A22
m = 1 + x-1
qipan[A22][x-1] = 'x'
}
else if(Num2 == 4 &&A22 == 21 &&A21 != 21) //一列四个上边一头堵住
{
n =1 + A21
m = 1 + x-1
qipan[A21][x-1] = 'x'
}
else if(Num3 == 4 &&A31 == 21 &&A32 != 21) //一左上右下斜列四个右边一头堵住
{
n =1 + y - A32 - 2
m = 1 + x - A32 - 2
qipan[y-A32-2][x-A32-2] = 'x'
}
else if(Num3 == 4 &&A32 == 21 &&A31 != 21) //一左上右下斜列四个左边一头堵住
{
n =1 + y + A31
m = 1 + x + A31
qipan[y+A31][x+A31] = 'x'
}
else if(Num4 == 4 &&A41 == 21 &&A42 != 21) //一左下右上斜列四个右边一头堵住
{
n =1 + y + A42
m = 1 + x - A42 - 2
qipan[y+A42][x-A42-2] = 'x'
}
else if(Num4 == 4 &&A42 == 21 &&A41 != 21) //一左下右上斜列四个左边一头堵住
{
n =1 + y - A41 - 2
m = 1 + x + A41
qipan[y-A41-2][x+A41] = 'x'
}
else if(Num1==3 &&A11 != 21 &&A12 != 21) //一排3 个两头没堵
{
n =1 + y-1
m = 1 + A11
if(dangerlevel(y-1,A11) >= dangerlevel(y-1,A12))
qipan[y-1][A11] = 'x'
else
qipan[y-1][A12] = 'x'
}
else if(Num2==3&&A21 != 21 &&A22 != 21) //一列 3 个两头没堵
{
n =1 + A21
m = 1 + x-1
if(dangerlevel(A21,x-1) >= dangerlevel(A22,x-1))
qipan[A21][x-1] = 'x'
else
qipan[A22][x-1] = 'x'
}
else if(Num3 == 3&&A31 != 21 &&A32 != 21) //一左上右下斜列3 个两头没堵
{
n =1 + y + A31
m = 1 + x + A31
if(dangerlevel(y+A31,x+A31) >= dangerlevel(y-A32 - 2,y - A32 -2))
qipan[y+A31][x+A31] = 'x'
else
qipan[y-A32-2][x-A32 -2] = 'x'
}
else if(Num4==3 &&A41 != 21 &&A42 != 21) //一左下右上斜列3 个两头没堵
{
n =1 + y - A41 - 2
m = 1 + x + A41
if(dangerlevel(y-A41-2,x+A41) >= dangerlevel(y-A42-2,x+A42))
qipan[y-A41-2][x+A41] = 'x'
else
qipan[y-A42-2][x+A42] = 'x'
}
else if(Num1 == 2&&A11 != 21 &&A12 != 21) //一排2个两头没堵
{
n =1 + y-1
m = 1 + A11
qipan[y-1][A11] = 'x'
}
else if( Num2 == 2&&A21 != 21 &&A22 != 21) //一列2个两头没堵
{
n =1 + A21
m = 1 + x-1
qipan[A21][x-1] = 'x'
}
else if(Num3 == 2&&A31 != 21 &&A32 != 21) //一左上右下斜列2 个两头没堵
{
n =1 + y + A31
m = 1 + x + A31
qipan[y+A31][x+A31] = 'x'
}
else if(Num4==2 &&A41 != 21 &&A42 != 21) //一左下右上斜列2个两头没堵
{
n =1 + y - A41 - 2
m = 1 + x + A41
qipan[y-A41-2][x+A41] = 'x'
}
else
attack()
}
void five::showqipan()
{
int p=0,q=0
for(int i = 0 i <= 20 i++)
{
if(p<10)
{
cout <<p <<' '
}
else
cout <<p
p++
}
cout <<endl
for(i = 0 i <20 i++)
{
if(i>=0)
{
q++
if(q<10)
cout <<q <<' '
else
cout <<q
}
for(int j = 0 j <20 j ++)
cout <<qipan[i][j]<<' '
cout <<endl
}
}
void five::print()
{
int p=0,q=0
for(int i = 0 i <= 20 i++)
{
if(p<10)
{
cout <<p <<' '
}
else
cout <<p
p++
}
cout <<endl
for(i = 0 i <20 i++)
{
if(i>=0)
{
q++
if(q<10)
cout <<q <<' '
else
cout <<q
}
for(int j = 0 j <20 j ++)
{
cout <<qipan[i][j]<<' '
}
cout <<endl
}
}
bool five::IsxyWin()
{
int num1=1,num2=1,num3=1,num4=1
for(int i = x i <x+5&&x+5<20 i ++)
{
if(qipan[y-1][i] != 'o')
break
if(qipan[y-1][i] == 'o')
num1++
}
for(i = x-2i >= 0 i --)
{
if(qipan[y-1][i] != 'o')
break
if(qipan[y-1][i] == 'o')
num1++
}
for( i = y i <y+5 i ++)
{
if(qipan[i][x-1] != 'o')
break
if(qipan[i][x-1] == 'o')
num2++
}
for(i = y-2i >= 0 i --)
{
if(qipan[i][x-1] != 'o')
break
if(qipan[i][x-1] == 'o')
num2++
}
for(i = 0 i <5 &&x+i<20 &&y+i<20i++ )
{
if(qipan[y+i][x+i] != 'o')
break
if(qipan[y+i][x+i] =='o')
num3++
}
for(i = 0 x - i -2>=0 &&y-i-2>=0 &&i <5i++ )
{
if(qipan[y-i-2][x-i-2] != 'o')
break
if(qipan[y-i-2][x-i-2] == 'o')
num3++
}
for(i = 0 x + i <20 &&y - i - 2 >= 0 &&i <5i ++)
{
if(qipan[y-i-2][x+i] != 'o')
break
if(qipan[y-i-2][x+i] == 'o')
num4++
}
for(i = 0 y + i <20 &&x - i - 2 >= 0 &&i <5i ++)
{
if(qipan[y+i][x-i-2] != 'o')
break
if(qipan[y+i][x-i-2] == 'o')
num4++
}
if(num1>=5||num2>=5||num3>=5||num4>=5)
return 1
else
return 0
}
bool five::IsmnWin()
{
int num1=1,num2=1,num3=1,num4=1
for(int i = m i <m+5&&m+5<20 i ++)
{
if(qipan[n-1][i] != 'x')
break
if(qipan[n-1][i] == 'x')
num1++
}
for(i = m-2i >= 0 i --)
{
if(qipan[n-1][i] != 'x')
break
if(qipan[n-1][i] == 'x')
num1++
}
for( i = n i <n+5 i ++)
{
if(qipan[i][m-1] != 'x')
break
if(qipan[i][m-1] == 'x')
num2++
}
for(i = n-2i >= 0 i --)
{
if(qipan[i][m-1] != 'x')
break
if(qipan[i][m-1] == 'x')
num2++
}
for(i = 0 i <5 &&m+i<20 &&n+i<20i++ )
{
if(qipan[n+i][m+i] != 'x')
break
if(qipan[n+i][m+i] =='x')
num3++
}
for(i = 0 m - i -2>=0 &&n-i-2>=0 &&i <5i++ )
{
if(qipan[n-i-2][m-i-2] != 'x')
break
if(qipan[n-i-2][m-i-2] == 'x')
num3++
}
for(i = 0 m + i <20 &&n - i - 2 >= 0 &&i <5i ++)
{
if(qipan[n-i-2][m+i] != 'x')
break
if(qipan[n-i-2][m+i] == 'x')
num4++
}
for(i = 0 n + i <20 &&m - i - 2 >= 0 &&i <5i ++)
{
if(qipan[n+i][m-i-2] != 'x')
break
if(qipan[n+i][m-i-2] == 'x')
num4++
}
if(num1>=5||num2>=5||num3>=5||num4>=5)
return 1
else
return 0
}
void main()
{
five a
int temp
cout <<"欢迎体验本游戏!这是本游戏的棋盘:" <<endl
a.showqipan()
cout <<"双人游戏请按1,人机游戏请按2,退出请按3:"
cin >>temp
if(temp == 3)
exit(1)
if(temp == 1)
{
cout <<"您选择了双人游戏,下面游戏开始:" <<endl
for(int i = 0 i ++)
{
a.getpointxy()
a.print()
if(a.IsxyWin())
{
cout <<"白棋胜!" <<endl
break
}
a.getpointmn()
a.print()
if(a.IsmnWin())
{
cout <<"黑棋胜!" <<endl
break
}
}
}
if(temp == 2)
{
int temp1=0
cout <<"您选择了人机游戏,您是白棋('o'),电脑是黑棋('x'),下面游戏开始:" <<endl
cout <<"您先下请按1,电脑先下请按2:"
cin >>temp1
if(temp1 == 1)
{
for(int i = 0 i ++)
{
a.getpointxy()
a.print()
if(a.IsxyWin())
{
cout <<"你赢了!恭喜!" <<endl
break
}
a.machinemn()
a.print()
cout <<"电脑走(" <<a.getm() <<',' <<a.getn() <<')' <<endl
if(a.IsmnWin())
{
cout <<"哈哈,你输了!" <<endl
break
}
}
}
if(temp1 == 2)
{
for(int i = 0 i ++)
{
a.machinemn()
a.print()
if(a.IsmnWin())
{
cout <<"哈哈,你输了!" <<endl
break
}
a.getpointxy()
a.print()
if(a.IsxyWin())
{
cout <<"你赢了!恭喜!" <<endl
break
}
}
}
}
cout <<"Press any key to EXIT\n"
getch()
}