21xrx.com
2024-11-05 19:33:30 Tuesday
登录
文章检索 我的文章 写文章
C++完整版五子棋代码。
2023-07-05 09:54:49 深夜i     --     --
C++ 五子棋 完整版 代码

在计算机编程中,五子棋是一种常见的游戏。它简单易学,但也需要一定的智慧和策略。本文将提供完整版的C++五子棋代码。

本游戏需要用到C++的图形用户界面(GUI)开发,我们将使用MFC(Microsoft Foundation Class)框架。首先,我们需要创建一个MFC应用程序,并添加以下头文件:afxwin.h、afxext.h、afx.h、afxtempl.h。

接下来,我们需要定义一些常量,如棋盘的大小、每个棋子的宽度、棋子的颜色等等。

#define GRID_SIZE 15   // 棋盘大小

#define GRID_WIDTH 30  // 每个棋子的宽度

#define BOARD_LEFT 50  // 棋盘左边距

#define BOARD_TOP 50   // 棋盘上边距

#define BOARD_RIGHT (BOARD_LEFT + GRID_SIZE * GRID_WIDTH) // 棋盘右边距

#define BOARD_BOTTOM (BOARD_TOP + GRID_SIZE * GRID_WIDTH)  // 棋盘下边距

#define CHESS_RADIUS 10 // 棋子半径

#define CHESS_BLACK RGB(0, 0, 0)  // 黑棋颜色

#define CHESS_WHITE RGB(255, 255, 255) // 白棋颜色

接下来,我们需要定义一些变量来存储游戏状态,如当前轮到哪个玩家、每个位置上的棋子等等。

int g_map[GRID_SIZE][GRID_SIZE];  // 存储棋盘

BOOL g_bBlack = TRUE;       // 是否是黑方下棋

BOOL g_bPlaying = FALSE;      // 是否正在游戏中

之后,我们需要在应用程序类中添加一些处理函数,如绘制棋盘、下棋子等等。

void CMyApp::OnDraw(CDC* pDC) { // 绘制棋盘

 CBrush brushBg(RGB(207, 159, 95));

 RECT rectBg = {0, 0, BOARD_RIGHT + 200, BOARD_BOTTOM + 100};

 pDC->FillRect(&rectBg, &brushBg);

 CBrush brushBoard(RGB(171, 121, 55));

 RECT rectBoard = BOARD_RIGHT;

 pDC->FillRect(&rectBoard, &brushBoard);

 for (int i = 0; i < GRID_SIZE; i++) {

  pDC->MoveTo(BOARD_LEFT, BOARD_TOP + i * GRID_WIDTH);

  pDC->LineTo(BOARD_RIGHT, BOARD_TOP + i * GRID_WIDTH);

  pDC->MoveTo(BOARD_LEFT + i * GRID_WIDTH, BOARD_TOP);

  pDC->LineTo(BOARD_LEFT + i * GRID_WIDTH, BOARD_BOTTOM);

 }

 for (int i = 0; i < GRID_SIZE; i++) {

  for (int j = 0; j < GRID_SIZE; j++) {

   if (g_map[i][j] != 0) {

    CBrush brushChess(g_map[i][j] == 1 ? CHESS_BLACK : CHESS_WHITE);

    pDC->SelectObject(&brushChess);

    pDC->Ellipse(CHESS_RADIUS + BOARD_LEFT + j * GRID_WIDTH - GRID_WIDTH / 2,

           CHESS_RADIUS + BOARD_TOP + i * GRID_WIDTH - GRID_WIDTH / 2,

           CHESS_RADIUS + BOARD_LEFT + j * GRID_WIDTH + GRID_WIDTH / 2,

           CHESS_RADIUS + BOARD_TOP + i * GRID_WIDTH + GRID_WIDTH / 2);

   }

  }

 }

}

void CMyApp::OnLButtonDown(UINT nFlags, CPoint point) { // 下棋子

 if (g_bPlaying == FALSE)

  return;

 int x = (point.x - BOARD_LEFT + GRID_WIDTH / 2) / GRID_WIDTH;

 int y = (point.y - BOARD_TOP + GRID_WIDTH / 2) / GRID_WIDTH;

 if (x < 0 || x >= GRID_SIZE || y < 0 || y >= GRID_SIZE)

  return;

 if (g_map[y][x] != 0)

  return;

 g_map[y][x] = g_bBlack ? 1 : 2;

 g_bBlack = !g_bBlack;

 Invalidate();

 UpdateWindow();

 if (IsGameOver()) {

  CString message;

  message += g_bBlack ? _T("白方胜利!") : _T("黑方胜利!");

  MessageBox(message, _T("游戏结束"));

  g_bPlaying = FALSE;

  memset(g_map, 0, sizeof(g_map));

  Invalidate();

  UpdateWindow();

 }

}

下面,我们需要实现一个函数来判断游戏是否结束。这个函数需要遍历整个棋盘,判断是否有五个相邻的棋子颜色相同。如果有,就返回真,否则返回假。

BOOL CMyApp::IsGameOver() {

 for (int i = 0; i < GRID_SIZE; i++) {

  for (int j = 0; j < GRID_SIZE; j++) {

   if (g_map[i][j] == 0)

    continue;

   if (j + 4 < GRID_SIZE &&

     g_map[i][j] == g_map[i][j + 1] &&

     g_map[i][j] == g_map[i][j + 2] &&

     g_map[i][j] == g_map[i][j + 3] &&

     g_map[i][j] == g_map[i][j + 4])

    return TRUE;

   if (i + 4 < GRID_SIZE &&

     g_map[i][j] == g_map[i + 1][j] &&

     g_map[i][j] == g_map[i + 2][j] &&

     g_map[i][j] == g_map[i + 3][j] &&

     g_map[i][j] == g_map[i + 4][j])

    return TRUE;

   if (i + 4 < GRID_SIZE && j + 4 < GRID_SIZE &&

     g_map[i][j] == g_map[i + 1][j + 1] &&

     g_map[i][j] == g_map[i + 2][j + 2] &&

     g_map[i][j] == g_map[i + 3][j + 3] &&

     g_map[i][j] == g_map[i + 4][j + 4])

    return TRUE;

   if (i - 4 >= 0 && j + 4 < GRID_SIZE &&

     g_map[i][j] == g_map[i - 1][j + 1] &&

     g_map[i][j] == g_map[i - 2][j + 2] &&

     g_map[i][j] == g_map[i - 3][j + 3] &&

     g_map[i][j] == g_map[i - 4][j + 4])

    return TRUE;

  }

 }

 return FALSE;

}

最后,我们需要在应用程序类中添加处理函数,以响应游戏开始和结束的事件。

void CMyApp::OnStart() { // 开始游戏

 g_bPlaying = TRUE;

 memset(g_map, 0, sizeof(g_map));

 Invalidate();

 UpdateWindow();

}

void CMyApp::OnEnd() { // 结束游戏

 g_bPlaying = FALSE;

 memset(g_map, 0, sizeof(g_map));

 Invalidate();

 UpdateWindow();

}

好了,我们已经完成了一个基本的五子棋游戏。这个游戏虽然简单,但也涵盖了C++图形用户界面开发、游戏逻辑和算法等方面的知识。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复