用C语言设计一个“三子棋”的游戏,要求用上下左右光标控制。要程序源代码!

Python015

用C语言设计一个“三子棋”的游戏,要求用上下左右光标控制。要程序源代码!,第1张

#include <iostream>

#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()

}