《三子棋》是一款古老的民间传统游戏,又被称为黑白棋、圈圈叉叉棋、井字棋、一条龙、九宫棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子连成一条线的一方则视为胜利者。
int main()
{
test();
return 0;
}
从主函数中的test();进入游戏内部
#pragma once
#define ROW 3
#define COL 3
#include
#include
#include
#include
void menu();
void print_diff();
void init_Board(char Board[ROW][COL], int row, int col);
void Print_Board(char Board[ROW][COL], int row, int col);
void player_move(char Board[ROW][COL], int row, int col);
void computer_move(char Board[ROW][COL], int row, int col);
char Is_win(char Board[ROW][COL], int row, int col);
进入游戏内部后打印出菜单,需要给玩家提供两种选择 play和exit
并为了保证玩家在输入错误后,可以重新选择,以及游戏结束后,可以选择再来一局,因此,我们这里应该把整个test函数设计成一个循环。
void menu()
{
printf("*****************\n");
printf("*****1.play******\n");
printf("*****0.exit******\n");
printf("*****************\n");
}
void test()
{
srand(time(NULL));
int input;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始游戏\n");
play();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
}
void play()
{
char ret, Board[ROW][COL];//创建棋盘
init_Board(Board, ROW, COL);//初始化棋盘
Print_Board(Board, ROW, COL);//打印棋盘
while (1)
{
player_move(Board, ROW, COL);//玩家落子
system("cls");
Print_Board(Board, ROW, COL);//打印棋盘
ret = Is_win(Board, ROW, COL);//判断输赢
if (ret != 'C')
break;
computer_move(Board, ROW, COL);//电脑落子
system("cls");
Print_Board(Board, ROW, COL);//打印棋盘
ret = Is_win(Board, ROW, COL);//判断输赢
if (ret != 'C')
break;
}
if (ret == '*')
printf("玩家胜利\n");
else if (ret == '$')
printf("电脑胜利\n");
else
printf("平局\n");
}
三子棋的棋盘本质上可以看作一个多行多列的二维数组
将二维数组全部初始化为空格‘ ’
void init_Board(char Board[ROW][COL], int row, int col)
{
int i;
for (i = 0; i < row; i++)
{
int j;
for (j = 0; j < col; j++)
Board[i][j] = ' ';
}
}
void Print_Board(char Board[ROW][COL], int row, int col)
{
int i;
for (i = 0; i < row; i++)
{
int j;
for (j = 0; j < col; j++)
{
printf(" %c ", Board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
棋盘设置完成后,就该正式进入游戏了,玩三子棋最重要的就是下棋了。
想要实现下棋,需要先找到相应的坐标,找到坐标后,将其所在位置的元素改为‘*’,表示玩家落子,其中我们需要做到以下几点(1)判断坐标的合法性
(2)判断目标元素是否被占用
void player_move(char Board[ROW][COL], int row, int col)
{
printf("玩家下棋\n");
printf("请输入合法坐标\n");
int x, y;
while (1)
{
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
//判断是否合法
{
if (Board[x - 1][y - 1] == ' ')
//判断是否被占用
{
Board[x - 1][y - 1] = '*';
break;
}
else
printf("坐标被占用,请重新输入\n");
}
else
printf("坐标不合法,请重新输入\n");
}
}
符号 | result |
---|---|
* | 玩家胜利 |
# | 电脑胜利 |
Q | 平局 |
C | 游戏继续 |
int Is_full(char Board[ROW][COL], int row, int col)//判断棋盘是否被占满
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (Board[i][j] == ' ')
return 0;
}
}
return 1;
}
char Is_win(char Board[ROW][COL], int row, int col)//判断游戏进度
{
for (int i = 1; i < row; i++)
{
for (int j = 1; j < col; j++)
{
if (j < col - 1)
{
if (Board[i][j - 1] == Board[i][j] && Board[i][j] == Board[i][j + 1] && Board[i][j] != ' ')
return Board[i][j];
}
if (i < row - 1)
{
if (Board[i - 1][j] == Board[i][j] && Board[i][j] == Board[i + 1][j] && Board[i][j] != ' ')
return Board[i][j];
}
if (i < row - 1 && j < col - 1)
{
if (Board[i - 1][j - 1] == Board[i][j] && Board[i][j] == Board[i + 1][j + 1] && Board[i][j] != ' ')
return Board[i][j];
}
if (i < row - 1 && j < col - 1)
{
if (Board[i - 1][j + 1] == Board[i][j] && Board[i][j] == Board[i + 1][j - 1] && Board[i][j] != ' ')
return Board[i][j];
}
}
}
if (Is_full(Board, row, col) == 1)
return 'Q';
else
return 'C';
}
电脑下棋的时候,坐标是通过生成随机值产生的,将生成的随机值转化为合法的坐标,因此,我们只判断目标元素是否被占用即可
void computer_move(char Board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
Sleep(2000);
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (Board[x][y] == ' ')
{
Board[x][y] = '$';
break;
}
}
}
以上就是三子棋游戏的具体实现,还有许多地方可以进行优化,甚至可以将三子棋改为五子棋,将棋盘改成十行十列等等,如果大家对游戏的优化有更多有趣的想法,欢迎来找我交流,大家一起进步呀