c++编写三子棋游戏程序(修改宏定义N,可变成四子棋、五子棋、六子棋....),代码如下:
//c++小练习——编写三子棋游戏程序
#include<iostream>
#include<cstdlib>
#include<time.h>
using namespace std;
#define N 3//棋盘大小定义
void game();
void menu();
void initialize_board(char board[][N]);
void print_board(char board[][N]);
void player_play(char board[][N]);
void computer_play(char board[][N]);
int board_full(char board[][N]);
char game_state(char board[][N]);
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do//菜单选择
{
menu();
cout << "请选择(1/0): ";
cin >> input;
switch (input)
{
case 1:
cout << "开始游戏" << endl;
game();
break;
case 0:
cout << "退出游戏" << endl;
break;
default:
cout << "选择错误,请重新选择" << endl;
}
} while (input);
return 0;
}
void game()//游戏程序
{
char board[N][N];
initialize_board(board);
print_board(board);
while (1)
{
player_play(board);
print_board(board);
if(game_state(board) != 'N')//判断游戏是否继续
break;
computer_play(board);
print_board(board);
if(game_state(board) != 'N')
break;
}
switch (game_state(board))//判断游戏结果
{
case 'X':
cout << "玩家获胜" << endl;
print_board(board);
break;
case 'O':
cout << "电脑获胜" << endl;
print_board(board);
break;
case 'M':
cout << "双方平局" << endl;
print_board(board);
break;
}
}
void menu()//菜单
{
cout << "************************" << endl;
cout << "******** 三子棋 ********" << endl;
cout << "******** 1.play ********" << endl;
cout << "******** 0.exit ********" << endl;
cout << "************************" << endl;
}
void initialize_board(char board[][N])//初始化棋盘
{
int i = 0, j = 0;
for (i = 0;i < N;i++)
for (j = 0;j < N;j++)
board[i][j] = ' ';
}
void print_board(char board[][N])//打印棋盘
{
int i = 0, j = 0;
for (i = 0; i < N; i++)
{
for (j = 0;j < N;j++)
if (j < N - 1)
cout <<" "<< board[i][j] << " |";
else
cout << board[i][j] << endl;
if (i < N - 1)
{
for (j = 0;j < N;j++)
if (j < N - 1)
cout << "----";
else
cout << "---";
cout << endl;
}
}
}
void player_play(char board[][N])//玩家方下棋
{
int x = 0, y = 0;
cout << "轮到玩家方" << endl;
while (1)
{
cout << "请玩家方输入下棋坐标(x y): ";
cin >> x >> y;
if ((x >= 1 && x <= N) && (y >= 1 && y <= N))
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = 'X';
break;
}
else
cout << "输入坐标已被占用,请重新输入" << endl;
}
else
cout << "坐标输入错误,请重新输入" << endl;
}
}
void computer_play(char board[][N])//电脑方下棋
{
cout << "轮到电脑方" << endl;
cout << "电脑方正在下棋....." << endl;
while (1)
{
int x = rand()%N;
int y = rand()%N;
if (board[x][y] == ' ')
{
board[x][y] = 'O';
break;
}
}
}
int board_full(char board[][N])//判断棋盘满与否
{
int i = 0;
int j = 0;
for (i = 0; i < N; i++)
for (j = 0;j < N;j++)
if (board[i][j] == ' ')
return 1;//棋盘没满
return 0;//棋盘满了
}
char game_state(char board[][N])//游戏状态判断(玩家赢了/电脑赢了/平局/游戏继续)
{
int i = 0, j = 0, count = 0;
//判断获胜条件:行相等
for (i = 0; i < N; i++)
{
count = 0;
for (j = 0;j < N;j++)
{
if ((board[i][0] == board[i][j]) && (board[i][0] != ' '))
count++;
}
if (count == N)
return board[i][0];
}
//判断获胜条件:列相等
for (i = 0; i < N; i++)
{
count = 0;
for (j = 0;j < N;j++)
{
if ((board[0][i] == board[j][i]) && (board[0][i] != ' '))
count++;
}
if (count == N)
return board[0][i];
}
//判断获胜条件:左对角斜相等
count = 0;
for (i = 0;i < N;i++)
{
if ((board[0][0] == board[i][i])&&(board[0][0]!=' '))
count++;
}
if (count == N)
return board[0][0];
//判断获胜条件:右对角斜相等
count = 0;
for (i = 0;i < N;i++)
{
if ((board[0][N - 1] == board[i][N - i - 1])&&(board[0][N-1] != ' '))
count++;
}
if (count == N)
return board[0][N-1];
if (board_full(board))
return 'N';
else
return 'M';
}//玩家赢了返回X;电脑赢了返回O;平局返回M;游戏继续返回N
程序执行结果: