三子棋——C语言实现
实现效果如图:
完整代码如下:
源文件text.c(1/2)——菜单与系统
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void mune()
{
printf("*********************************\n");
printf("**********三子棋游戏菜单*********\n");
printf("**********1.开始游戏*****************\n");
printf("**********0.退出游戏*****************\n");
printf("*********************************\n");
printf("请选择:\n");
}
void game()
{
char board[ROW][COL]; //定义棋盘参数
char ret = 0; //判断输赢的标志.通过不同的返回值来宣布胜利者
init_board(board, ROW, COL); //初始化棋盘
print_board(board, ROW, COL); //打印棋盘
//棋盘打印完成,玩家和电脑开始游戏
while (1)
{
player_move(board, ROW, COL); //玩家下棋
if (ret == 'q') //平局
continue;
if (ret == '*')
{
printf("玩家获胜!");
break;
}
if (ret == '#')
{
printf("电脑获胜!");
break;
}
ret = is_win(board, ROW, COL); //判断是否胜利
computer_move(board, ROW, COL); //电脑下棋
ret = is_win(board, ROW, COL); //判断是否胜利
if (ret == 'q') //平局
continue;
if (ret == '*')
{
printf("玩家获胜!");
break;
}
if (ret == '#')
{
printf("电脑获胜!");
break;
}
}
}
void text()
{
mune();
int input = 0;
scanf("%d",&input); //选择游戏选项
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("选择错误");
break;
}
}
int main()
{
text();
return 0;
}
源文件game.c(2/2)——具体函数设计
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化棋盘元素为空
void init_board(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
board[i][j] = ' ';
}
//打印棋盘
void print_board(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++) //打印每列棋盘元素间隔符“|”
{
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1) //打印每行棋盘元素间隔行“---|---|---”
{
for (int j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
//玩家下棋
//我们通过把玩家选择的位置改为*,来表示玩家下棋。
void player_move(char board[ROW][COL],int row,int col)
{
//判断下棋位置是否处于棋盘有效范围
while (1)
{
printf("请玩家选择下棋位置:\n");
int i = 0, j = 0;
//玩家选择下棋位置
scanf("%d %d", &i, &j);
if ((i < row + 1 && i>0) && (j < col + 1 && j>0))
{
//判断备选位置是否为空
if (board[i-1][j-1] == ' ')
{
//将玩家选择的位置元素改为*
board[i - 1][j - 1] = '*'; //记得横纵坐标减一来与1棋盘坐标对应
print_board(board, ROW, COL); //打印棋盘
break;
}
else
{
printf("该坐标被占用。");
continue;
}
}
else
{
printf("位置非法!\n");
continue; //确保只有玩家下了有效的棋子之后电脑才会下子
}
}
}
//电脑下棋
void computer_move(char board[ROW][COL], int row, int col)
{
//电脑下棋
printf("电脑下棋:\n");
while (1)
{
int x = rand() % row; //确保电脑把棋子下在棋盘内
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#'; //电脑下子“#”
break;
}
}
print_board(board, ROW, COL); //打印棋盘
}
//判断平局
static 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; //棋盘还有空位,返回0,继续游戏
}
return 1; //返回1,平局
}
//判断是否有玩家胜利
char is_win(char board[ROW][COL], int row, int col)
{
//判断三行是否有胜利条件达成
for (int i = 0; i < row; i++)
{
int x = 0;
//如果一行填满相同元素则说明有一方获胜
for (int j = 0; j < col; j++)
{
if (board[i][j] != ' '&& board[i][j]== board[i][j+1])
x++;
if(x==row-1)
return board[i][j];
}
}
//判断三列是否有胜利条件达成
for (int j = 0; j < col; j++)
{
int y = 0;
//如果一列填满相同元素则说明有一方获胜
for (int i = 0; i < row; i++)
{
if (board[i][j] != ' ' && board[i][j] == board[i+1][j])
y++;
if (y == col - 1)
return board[i][j];
}
}
int z = 0;
//判断对角线上是否有胜利条件达成
for (int j = 0, i = 0; i<row,j < row;i++, j++)
{
//如果一对角线填满且元素相同则说明有一方获胜
if (board[i][j] != ' ' && board[i][j] == board[i + 1][j+1])
z++;
if (z == col - 1)
return board[i][j];
}
//平局
if (is_full(board, row, col) == 1)
return 'Q';
//没有获胜方,继续
return 'C';
}
头文件game.h(1/1)——总览各个函数
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<stdio.h>
//初始化棋盘
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 rwo,int col);
整体思路
一、思路
关键在于实现棋盘与棋子
棋盘可以视为一个数组,棋子可视为数组中的元素
- 三子棋的棋盘可以通过3*3的数组模拟实现
- 棋子可以通过往数组中添加元素模拟实现
- 三子连线的胜利条件通过循环判断实现
- 每下一子棋盘的变化可以通过循环打印棋盘实现
二、制作步骤
1.菜单界面打印与菜单选择系统
当玩家开启程序时程序直接进入text() 函数,打印菜单,让玩家开始选择。
菜单有以下选项:
1.当玩家选择 “1.开始游戏” ,则启动函数game()。
2.当玩家选择 “0.退出程序” ,则退出text() 函数,退出后程序结束。
3.当玩家没有选择设定范围内的数字则重新询问,直到选对为止。
void text()
{
mune();
int input = 0;
scanf("%d",&input); //选择游戏选项
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("选择错误");
break;
}
}
int main()
{
text();
return 0;
}
打印菜单
void mune()
{
printf("*********************************\n");
printf("**********三子棋游戏菜单*********\n");
printf("**********1.开始游戏*****************\n");
printf("**********0.退出游戏*****************\n");
printf("*********************************\n");
printf("请选择:\n");
}
2.函数
代码如下(示例):
//判断胜负
void game()
{
char board[ROW][COL]; //定义棋盘参数
char ret = 0; //判断输赢的标志.通过不同的返回值来宣布胜利者
init_board(board, ROW, COL); //初始化棋盘
print_board(board, ROW, COL); //打印棋盘
//棋盘打印完成,玩家和电脑开始游戏
while (1)
{
player_move(board, ROW, COL); //玩家下棋
if (ret == 'q') //平局
continue;
if (ret == '*')
{
printf("玩家获胜!");
break;
}
if (ret == '#')
{
printf("电脑获胜!");
break;
}
ret = is_win(board, ROW, COL); //判断是否胜利
computer_move(board, ROW, COL); //电脑下棋
ret = is_win(board, ROW, COL); //判断是否胜利
if (ret == 'q') //平局
continue;
if (ret == '*')
{
printf("玩家获胜!");
break;
}
if (ret == '#')
{
printf("电脑获胜!");
break;
}
}
}
3.游戏各个函数
//初始化棋盘元素为空
//初始化棋盘元素为空
void init_board(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
board[i][j] = ' ';
}
//打印棋盘
//打印棋盘
void print_board(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++) //打印每列棋盘元素间隔符“|”
{
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1) //打印每行棋盘元素间隔行“---|---|---”
{
for (int j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
//下棋——选择下棋位置并检查下棋位置是否被占用
//玩家下棋
//我们通过把玩家选择的位置改为*,来表示玩家下棋。
void player_move(char board[ROW][COL],int row,int col)
{
//判断下棋位置是否处于棋盘有效范围
while (1)
{
printf("请玩家选择下棋位置:\n");
int i = 0, j = 0;
//玩家选择下棋位置
scanf("%d %d", &i, &j);
if ((i < row + 1 && i>0) && (j < col + 1 && j>0))
{
//判断备选位置是否为空
if (board[i-1][j-1] == ' ')
{
//将玩家选择的位置元素改为*
board[i - 1][j - 1] = '*'; //记得横纵坐标减一来与1棋盘坐标对应
print_board(board, ROW, COL); //打印棋盘
break;
}
else
{
printf("该坐标被占用。");
continue;
}
}
else
{
printf("位置非法!\n");
continue; //确保只有玩家下了有效的棋子之后电脑才会下子
}
}
}
//电脑下棋
//电脑下棋
void computer_move(char board[ROW][COL], int row, int col)
{
//电脑下棋
printf("电脑下棋:\n");
while (1)
{
int x = rand() % row; //确保电脑把棋子下在棋盘内
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#'; //电脑下子“#”
break;
}
}
print_board(board, ROW, COL); //打印棋盘
}
//判断平局
//判断平局
static 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; //棋盘还有空位,返回0,继续游戏
}
return 1; //返回1,平局
}
//判断是否有玩家胜利——有横排、竖排和对角线三种胜利方式
//判断是否有玩家胜利
char is_win(char board[ROW][COL], int row, int col)
{
//判断三行是否有胜利条件达成
for (int i = 0; i < row; i++)
{
int x = 0;
//如果一行填满相同元素则说明有一方获胜
for (int j = 0; j < col; j++)
{
if (board[i][j] != ' '&& board[i][j]== board[i][j+1])
x++;
if(x==row-1)
return board[i][j];
}
}
//判断三列是否有胜利条件达成
for (int j = 0; j < col; j++)
{
int y = 0;
//如果一列填满相同元素则说明有一方获胜
for (int i = 0; i < row; i++)
{
if (board[i][j] != ' ' && board[i][j] == board[i+1][j])
y++;
if (y == col - 1)
return board[i][j];
}
}
int z = 0;
//判断对角线上是否有胜利条件达成
for (int j = 0, i = 0; i<row,j < row;i++, j++)
{
//如果一对角线填满且元素相同则说明有一方获胜
if (board[i][j] != ' ' && board[i][j] == board[i + 1][j+1])
z++;
if (z == col - 1)
return board[i][j];
}
//平局
if (is_full(board, row, col) == 1)
return 'Q';
//没有获胜方,继续
return 'C';
}
总结
以上就是用C语言制作三子棋的思路与代码,三子棋是一个简单的程序,通过编码该程序编程新手可以有效提升代码能力。