国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++實(shí)現(xiàn)五子棋游戲

2020-05-23 13:31:14
字體:
供稿:網(wǎng)友

三子棋、五子棋之類的游戲,非常簡單,對于初學(xué)者來說是一個(gè)不錯(cuò)的練手的小項(xiàng)目,以前用C語言寫過三子棋游戲。最近在看C++,所以就想到在三子棋的基礎(chǔ)上利用C++語言實(shí)現(xiàn)五子棋游戲。

主要功能:

有3個(gè)模式:0表示退出、1表示電腦vs玩家、2表示玩家vs玩家。

C++,五子棋

C++,五子棋

當(dāng)一局完成之后選擇'y'則又會進(jìn)入選擇模式。

C++,五子棋

源代碼(VS2013編譯器下寫的):

#include<iostream>#include<stdio.h>#include<stdlib.h>#include <time.h>using namespace std;const int N=15; //15*15的棋盤const char ChessBoardflag = ' '; //棋盤標(biāo)志const char flag1='o'; //玩家1或電腦的棋子標(biāo)志const char flag2='X'; //玩家2的棋子標(biāo)志typedef struct Coordinate //坐標(biāo)類{    int x; //代表行  int y; //代表列}Coordinate;class GoBang //五子棋類{ public:  GoBang() //初始化  {    InitChessBoard();  }  void Play() //下棋  {    Coordinate Pos1; // 玩家1或電腦    Coordinate Pos2; //玩家2    int n = 0;    while (1)    {      int mode = ChoiceMode();      while (1)      {        if (mode == 1) //電腦vs玩家        {          ComputerChess(Pos1,flag1); // 電腦下棋          if (GetVictory(Pos1, 0, flag1) == 1) //0表示電腦,真表示獲勝            break;          PlayChess(Pos2, 2, flag2); //玩家2下棋          if (GetVictory(Pos2, 2, flag2)) //2表示玩家2            break;        }        else      //玩家1vs玩家2        {          PlayChess(Pos1, 1, flag1); // 玩家1下棋          if (GetVictory(Pos1, 1, flag1)) //1表示玩家1            break;          PlayChess(Pos2, 2, flag2); //玩家2下棋          if (GetVictory(Pos2, 2, flag2)) //2表示玩家2            break;        }      }      cout << "***再來一局***" << endl;      cout << "y or n :";      char c = 'y';      cin >> c;      if (c == 'n')        break;    }      }protected:  int ChoiceMode() //選擇模式  {    int i = 0;    system("cls"); //系統(tǒng)調(diào)用,清屏    InitChessBoard(); //重新初始化棋盤    cout << "***0、退出 1、電腦vs玩家 2、玩家vs玩家***" << endl;    while (1)    {      cout << "請選擇:";      cin >> i;      if (i == 0) //選擇0退出        exit(1);      if (i == 1 || i == 2)        return i;      cout << "輸入不合法" << endl;    }  }  void InitChessBoard() //初始化棋盤  {    for (int i = 0; i < N + 1; ++i)       {      for (int j = 0; j < N + 1; ++j)      {        _ChessBoard[i][j] = ChessBoardflag;      }    }  }  void PrintChessBoard() //打印棋盤,這個(gè)函數(shù)可以自己調(diào)整  {    system("cls"); //系統(tǒng)調(diào)用,清空屏幕    for (int i = 0; i < N+1; ++i)    {      for (int j = 0; j < N+1; ++j)      {        if (i == 0) //打印列數(shù)字        {          if (j!=0)            printf("%d ", j);          else            printf("  ");        }        else if (j == 0) //打印行數(shù)字          printf("%2d ", i);        else        {          if (i < N+1)          {            printf("%c |",_ChessBoard[i][j]);          }        }      }      cout << endl;      cout << "  ";      for (int m = 0; m < N; m++)      {        printf("--|");      }      cout << endl;    }  }  void PlayChess(Coordinate& pos, int player, int flag) //玩家下棋  {    PrintChessBoard(); //打印棋盤    while (1)    {      printf("玩家%d輸入坐標(biāo):", player);      cin >> pos.x >> pos.y;      if (JudgeValue(pos) == 1) //坐標(biāo)合法        break;      cout << "坐標(biāo)不合法,重新輸入" << endl;    }    _ChessBoard[pos.x][pos.y] = flag;  }  void ComputerChess(Coordinate& pos, char flag) //電腦下棋  {    PrintChessBoard(); //打印棋盤    int x = 0;    int y = 0;    while (1)    {      x = (rand() % N) + 1; //產(chǎn)生1~N的隨機(jī)數(shù)      srand((unsigned int) time(NULL));      y = (rand() % N) + 1; //產(chǎn)生1~N的隨機(jī)數(shù)      srand((unsigned int) time(NULL));      if (_ChessBoard[x][y] == ChessBoardflag) //如果這個(gè)位置是空的,也就是沒有棋子        break;    }    pos.x = x;    pos.y = y;    _ChessBoard[pos.x][pos.y] = flag;  }  int JudgeValue(const Coordinate& pos) //判斷輸入坐標(biāo)是不是合法  {    if (pos.x > 0 && pos.x <= N&&pos.y > 0 && pos.y <= N)    {      if (_ChessBoard[pos.x][pos.y] == ChessBoardflag)      {        return 1; //合法      }    }    return 0; //非法  }  int JudgeVictory(Coordinate pos, char flag) //判斷有沒有人勝負(fù)(底層判斷)  {    int begin = 0;    int end = 0;    int begin1 = 0;    int end1 = 0;    //判斷行是否滿足條件    (pos.y - 4) > 0 ? begin = (pos.y - 4) : begin = 1;    (pos.y + 4) >N ? end = N : end = (pos.y + 4);    for (int i = pos.x, j = begin; j + 4 <= end; j++)    {      if (_ChessBoard[i][j] == flag&&_ChessBoard[i][j + 1] == flag&&        _ChessBoard[i][j + 2] == flag&&_ChessBoard[i][j + 3] == flag&&        _ChessBoard[i][j + 4] == flag)        return 1;    }    //判斷列是否滿足條件    (pos.x - 4) > 0 ? begin = (pos.x - 4) : begin = 1;    (pos.x + 4) > N ? end = N : end = (pos.x + 4);    for (int j = pos.y, i = begin; i + 4 <= end; i++)    {      if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j] == flag&&        _ChessBoard[i + 2][j] == flag&&_ChessBoard[i + 3][j] == flag&&        _ChessBoard[i + 4][j] == flag)        return 1;    }    int len = 0;    //判斷主對角線是否滿足條件    pos.x > pos.y ? len = pos.y - 1 : len = pos.x - 1;    if (len > 4)      len = 4;    begin = pos.x - len; //橫坐標(biāo)的起始位置    begin1 = pos.y - len; //縱坐標(biāo)的起始位置    pos.x > pos.y ? len = (N - pos.x) : len = (N - pos.y);    if (len>4)      len = 4;    end = pos.x + len; //橫坐標(biāo)的結(jié)束位置    end1 = pos.y + len; //縱坐標(biāo)的結(jié)束位置    for (int i = begin, j = begin1; (i + 4 <= end) && (j + 4 <= end1); ++i, ++j)    {      if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j + 1] == flag&&        _ChessBoard[i + 2][j + 2] == flag&&_ChessBoard[i + 3][j + 3] == flag&&        _ChessBoard[i + 4][j + 4] == flag)        return 1;    }    //判斷副對角線是否滿足條件    (pos.x - 1) >(N - pos.y) ? len = (N - pos.y) : len = pos.x - 1;    if (len > 4)      len = 4;    begin = pos.x - len; //橫坐標(biāo)的起始位置    begin1 = pos.y + len; //縱坐標(biāo)的起始位置    (N - pos.x) > (pos.y - 1) ? len = (pos.y - 1) : len = (N - pos.x);    if (len>4)      len = 4;    end = pos.x + len; //橫坐標(biāo)的結(jié)束位置    end1 = pos.y - len; //縱坐標(biāo)的結(jié)束位置    for (int i = begin, j = begin1; (i + 4 <= end) && (j - 4 >= end1); ++i, --j)    {      if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j - 1] == flag&&        _ChessBoard[i + 2][j - 2] == flag&&_ChessBoard[i + 3][j - 3] == flag&&        _ChessBoard[i + 4][j - 4] == flag)        return 1;    }    for (int i = 1; i < N + 1; ++i) //棋盤有沒有下滿    {      for (int j =1; j < N + 1; ++j)      {        if (_ChessBoard[i][j] == ChessBoardflag)         return 0; //0表示棋盤沒滿      }     }    return -1; //和棋  }  bool GetVictory(Coordinate& pos, int player, int flag) //對JudgeVictory的一層封裝,得到具體那個(gè)玩家獲勝  {    int n = JudgeVictory(pos, flag); //判斷有沒有人獲勝    if (n != 0)  //有人獲勝,0表示沒有人獲勝    {      PrintChessBoard();      if (n == 1) //有玩家贏棋      {        if (player == 0) //0表示電腦獲勝,1表示玩家1,2表示玩家2          printf("***電腦獲勝***/n");        else          printf("***恭喜玩家%d獲勝***/n", player);      }      else        printf("***雙方和棋***/n");      return true; //已經(jīng)有人獲勝    }    return false; //沒有人獲勝  }private:  char _ChessBoard[N+1][N+1];   };

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 平武县| 兴义市| 山西省| 五家渠市| 依安县| 绿春县| 顺平县| 察隅县| 顺昌县| 格尔木市| 鲁山县| 通山县| 中山市| 菏泽市| 上杭县| 南通市| 喀什市| 周至县| 台江县| 南陵县| 宁安市| 玛曲县| 紫阳县| 灵璧县| 凭祥市| 巴南区| 定结县| 阿拉善盟| 遂溪县| 永丰县| 永修县| 茶陵县| 莱西市| 固阳县| 长宁县| 福清市| 信阳市| 北辰区| 靖江市| 贵溪市| 岢岚县|