用C++写的五子棋 [转]

这是一个使用C++编写的五子棋游戏程序,包括棋盘显示、玩家输入、胜负判断等功能。玩家通过键盘控制棋子位置,当一方的棋子连成五子线时,游戏结束并显示胜者。程序提供了游戏说明和重置棋盘的选项。

用C++写的五子棋 [转]

 

#include <stdio.h>
#include<stdlib.h>
#include<conio.h>
#define N 21
void chessboard(int name[N][N],int *,int *,int *);//棋盘,和下子
int win(int name[N][N],int *,int *);//判断胜负
int output(int count[8],int win);//输入胜负
void explain();//游戏说明
void reset(int name[N][N],int *,int *,int *);//重置棋盘

void main()
{
int name[N][N]={0},a=N/2,b=N/2,player,t,j;
do
{
  printf("1.开始游戏-------------------------2.游戏说明-------------------------0.结束游戏");
  scanf("%d",&t);
  switch(t)
  {
  case 1:
   system("cls");
   printf("********************************************************************************");
   printf("1.先手白棋/n2.先手黑棋/n");
   scanf("%d",&player);
   do
   {
   system("cls");
   chessboard(name,&a,&b,&player);
   }while(win(name,&a,&b));
   reset(name,&a,&b,&player);
   break;
  case 2:
   explain();
   break;
  case 0:
   printf("谢谢使用,欢迎下次光临");
   fflush(stdin);
         j=getch();
   break;
  }
system("cls");
}while(t);
}
void chessboard(int name[N][N],int *a,int *b,int *player)
{
int i,j;
for (i=0;i<N;i++)
{
  for(j=0;j<N;j++)
  {
   if(*a==i && *b==j)
    {
     printf("□");
    }
    else if(name[i][j]==0)
    {
        printf("╋");
    }
    else if(name[i][j]==1)
    {
     printf("●");
    }
    else
    {
     printf("○");
    }
  }
  printf("/n");
}
fflush(stdin);
    int input=getch();
    switch(input)
{
case 'w':
  if(*a>0)
  {
  (*a)--;
  }
  break;
case 's':
  if(*a<N-1)
  {
  (*a)++;
  }
  break;
  
case 'a':
  if(*b>0)
  {
         (*b)--;
  }
  break;
  
case 'd':
  if(*b<N-1)
  {
  (*b)++;
  }
  break;
case ' ':
     if(name[*a][*b]==0)
  {
   *player=*player==1?2:1;
   name[*a][*b]=*player;  
  }else
  {
   printf("此处有子!/n");
   printf("按任意键继续");
      fflush(stdin);
      j=getch();
  }
  break;
}
}
//判断胜负
int win(int name[N][N],int *a,int *b)
{
int i,j,count[8]={0},k,win;
//判断行是否5个
for(j=0;j<N;j++)
{
       for(i=0;i<N;i++)
    {
         for(k=0;k<5;k++)
   {
            if(name[i][j+k]==1)
   {
            count[0]++;
   }
            if(name[i][j+k]==2)
   {
            count[1]++;
   }
   }
   win=output(count,win);
    }
}
//判断列是否5个
for(j=0;j<N;j++)
{
       for(i=0;i<N;i++)
    {
         for(k=0;k<5;k++)
   {
            if(name[i+k][j]==1)
   {
            count[2]++;
   }
            if(name[i+k][j]==2)
   {
            count[3]++;
   }
   }
   win=output(count,win);
    }
}
//判断左到右斜方向是否有5个
for(j=0;j<N;j++)
{
       for(i=0;i<N;i++)
    {
         for(k=0;k<5;k++)
   {
            if(name[i+k][j+k]==1)
   {
            count[4]++;
   }
            if(name[i+k][j+k]==2)
   {
            count[5]++;
   }
   }
   win=output(count,win);
    }
}
//判断右到左斜方向是否有5个
for(j=1;j<N;j++)
{
       for(i=0;i<N;i++)
    {
         for(k=0;k<5;k++)
   {
            if(name[i+k][j-k]==1)
   {
            count[6]++;
   }
            if(name[i+k][j-k]==2)
   {
            count[7]++;
   }
   }
   win=output(count,win);
    }
}
return win;
}
//输出胜负
int output(int count[8],int win)
{
int i,j;
  if(count[0]==5 || count[2]==5 || count[4]==5 || count[6]==5)
{
   win=0;
   printf("白纸赢了/n");
   printf("按任意键回到主菜单");
   fflush(stdin);
   j=getch();
}
    if(count[1]==5 || count[3]==5 || count[5]==5 || count[7]==5)
{
     printf("黑子赢了/n");
        win=0;
   printf("按任意键回到主菜单");
   fflush(stdin);
   j=getch();
}
for(i=0;i<8;i++)
{
       count[i]=0;
}
return win;
}
//游戏说明
void explain()
{
int j;
printf("************************************游戏说明************************************");
printf("/n1.按w向上移动光标/n2.按s向下移动光标/n3.按a向左移动光标/n4.按d向右移动光标/n5.按空格放子/n/n/n/n");  
    printf("胜负条件:只要一方横竖斜连续达到5个,方可获胜!/n/n/n");
printf("按任意键回到主菜单/n/n/n");
fflush(stdin);
j=getch();
}
//重置棋盘
void reset(int name[N][N],int *a,int *b,int *player)
{
int i,j;
for (i=0;i<N;i++)
{
  for(j=0;j<N;j++)
  {
         name[i][j]=0;
  }
}
*a=N/2;
*b=N/2;
*player=1;
}

 

 

 

 

 

c++五子棋游戏 // Five.cpp: implementation of the CFive class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "gobang.h" #include "Five.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif BOOL debugqian = false; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CFive::CFive() { } CFive::~CFive() { } BOOL CFive::has_five(int color) { //color = 1表示黑子,color = 2表示白子 //判断是否出现了5个子想连的情况 int m,n,i,j; for(m=1;m<16;m++) for(n=1;n<16;n++) { if(points[m][n]==color) { int p=1,s=1,zx=1,yx=1; for( i=1;i<5;i++) {if(n-i>=0&&points[m][n-i]==color) p++; else break; } for( i=1;i<5;i++) { if(n+i<16&&points[m][n+i]==color) p++; else break; } for( i=1;i<5;i++) { if(m-i>=0&&points[m-i][n]==color) s++; else break; } for( i=1;i<5;i++) { if(m+i<16&&points[m+i][n]==color) s++; else break; } for( i=1;i<5;i++) { if(m-i>=0&&n+i<16&&points[m-i][n+i]==color) zx++; else break; } for( i=1;i<5;i++) { if(n-i>=0&&m+i<16&&points[m+i][n-i]==color) zx++; else break; } for( i=1;i<5;i++) { if(m-i>=0&&n-i>=0&&points[m-i][n-i]==color) yx++; else break; } for( i=1;i<5;i++) { if(m+i<16&&n+i<16&&points[m+i][n+i]==color) yx++; else break; } if(p>=5||s>=5||zx>=5||yx>=5) return true; } } return false; } void CFive::Clear() { int i,j; for(i=1;i<=15;i++) for(j=1;j<=15;j++) { points[i][j] = 0;//先清空 } }
### C++ 实现五子棋代码示例 以下是一个简单的五子棋游戏实现示例,基于控制台界面。该示例涵盖了基本的游戏逻辑和用户交互功能[^1]。 ```cpp #include <iostream> #include <vector> using namespace std; const int SIZE = 15; // 棋盘大小 15x15 // 初始化棋盘 void initBoard(vector<vector<int>> &board) { for (int i = 0; i < SIZE; ++i) { vector<int> row(SIZE, 0); board.push_back(row); } } // 打印棋盘 void printBoard(const vector<vector<int>> &board) { for (int i = 0; i < SIZE; ++i) { for (int j = 0; j < SIZE; ++j) { if (board[i][j] == 1) cout << "● "; // 黑子 else if (board[i][j] == -1) cout << "○ "; // 白子 else cout << "+ "; // 空位 } cout << endl; } } // 检查是否胜利 bool checkWin(const vector<vector<int>> &board, int x, int y, int player) { int directions[4][2] = {{0, 1}, {1, 0}, {1, 1}, {1, -1}}; // 四个方向 for (int k = 0; k < 4; ++k) { int count = 1; for (int d = -1; d <= 1; d += 2) { // 正反两个方向 int dx = x + d * directions[k][0]; int dy = y + d * directions[k][1]; while (dx >= 0 && dx < SIZE && dy >= 0 && dy < SIZE && board[dx][dy] == player) { count++; dx += d * directions[k][0]; dy += d * directions[k][1]; } } if (count >= 5) return true; } return false; } int main() { vector<vector<int>> board; initBoard(board); int currentPlayer = 1; // 当前玩家,1 表示黑子,-1 表示白子 while (true) { printBoard(board); cout << "Player " << (currentPlayer == 1 ? "Black" : "White") << "'s turn. Enter your move (row col): "; int x, y; cin >> x >> y; if (x < 0 || x >= SIZE || y < 0 || y >= SIZE || board[x][y] != 0) { cout << "Invalid move! Try again." << endl; continue; } board[x][y] = currentPlayer; if (checkWin(board, x, y, currentPlayer)) { printBoard(board); cout << "Player " << (currentPlayer == 1 ? "Black" : "White") << " wins!" << endl; break; } currentPlayer = -currentPlayer; // 切换玩家 } return 0; } ``` ### 关键点解析 1. **棋盘初始化**:通过 `initBoard` 函数创建一个大小为 15x15 的二维数组,初始值为 0,表示空位[^1]。 2. **打印棋盘**:使用 `printBoard` 函数将当前棋盘状态输出到控制台[^1]。 3. **胜负判断**:通过 `checkWin` 函数检查最近落子的玩家是否在任意方向上形成了连续的五个棋子[^2]。 4. **玩家切换**:每次落子后,通过改变 `currentPlayer` 的值来切换当前玩家。 ### 使用图形界面库(如 Qt 或 SFML) 如果需要更复杂的图形用户界面,可以参考以下伪代码实现: ```cpp #include <QApplication> #include <QMainWindow> #include <QPainter> class GobangWindow : public QMainWindow { public: GobangWindow() { resize(600, 600); // 设置窗口大小 } protected: void paintEvent(QPaintEvent *) override { QPainter painter(this); painter.setPen(Qt::black); // 绘制棋盘 for (int i = 0; i < SIZE; ++i) { painter.drawLine(50, 50 + i * 40, 50 + 14 * 40, 50 + i * 40); painter.drawLine(50 + i * 40, 50, 50 + i * 40, 50 + 14 * 40); } // 绘制棋子 for (int i = 0; i < SIZE; ++i) { for (int j = 0; j < SIZE; ++j) { if (board[i][j] == 1) { painter.setBrush(Qt::black); painter.drawEllipse(50 + j * 40 - 10, 50 + i * 40 - 10, 20, 20); } else if (board[i][j] == -1) { painter.setBrush(Qt::white); painter.drawEllipse(50 + j * 40 - 10, 50 + i * 40 - 10, 20, 20); } } } } private: const int SIZE = 15; vector<vector<int>> board; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); GobangWindow window; window.show(); return app.exec(); } ``` 此代码展示了如何使用 Qt 库绘制五子棋棋盘和棋子[^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值