三子棋游戏
程序实现步骤
1.首先利用二维数组打印一个棋盘并且对表示的棋盘进行初始化
2.打印一个3*3棋盘(利用二维数组进行实现)
3.玩家根据棋盘大小有效的进行落子
4.判定游戏是否结束
5.电脑进行随机落子
6.检查游戏是否结束
7.假如游戏没有结束又重新回到步骤2继续执行
以下对各个步骤进行程序编写
对玩家进行信息提示
int Menu(){
printf("=================================\n");
printf("**欢迎来到三子棋游戏** \n");
printf("1.表示开始游戏\n");
printf("0.表示结束游戏\n");
printf("X 表示玩家落的子;O 表示电脑落的子\n");
printf("==================================\n");
printf("请输入您的选择:\n");
int choice = 0;
scanf("%d", &choice);
return choice;
}
步骤1.初始化棋盘
void Init(char chessBoard[Max_Row][Max_col]) {
// for (int row = 0; row < Max_Row; row++){
// for (int col = 0; col < Max_col; col++)
// chessBoard[row][col] = ' ';
// }
//}
//设置棋盘全部要是空棋盘
srand((unsigned int)time(0));//随机种子在程序启动之后一放就可以了
memset(chessBoard, ' ', Max_Row*Max_col);//以字节字节为单位设置的
}
这块利用二维数组循环进行初始化或者memset函数都可以
步骤2.打印一个棋盘
void Print(char chessBoard[Max_Row][Max_col]){
for (int row = 0; row < Max_Row; row++){
printf("+---+---+---+\n");
printf("| %c | %c | %c |\n", chessBoard[row][0],chessBoard[row][1], chessBoard[row][2]);
//printf("\n");
}
printf("+---+---+---+\n");
}
3*3的棋盘里面都是空的
步骤3.玩家落子
void PlayerMove(char chessBoard[Max_Row][Max_col]){
printf("轮到玩家落子!\n");
while (1){
printf("请输入您要落子的位置(Row col): ");
int row = 0;
int col = 0;
scanf("%d %d", &row, &col);
//尽可能对用户输入数据进行校验,如果输入数据非法,就要进行处理
//2个if是对用户输入的数据进行校验
//合法性校验
if (row < 0 || row >= Max_Row || col < 0 || col >= Max_col){
printf("您的输入有误!请重新输入 \n");
continue;//调到while/意思就是重新调到while语句的位置重新执行
}
if (chessBoard[row][col] != ' '){
//当前位置有子了,不能再重复落子
printf("该位置已经有子了 \n");
continue;
}
chessBoard[row][col] = 'X';
break; //结束循环
}
}
以上所有的情况都要考虑到
步骤4.和步骤6.:检查游戏是否结束
步骤4.查看游戏是否结束 步骤6.查看游戏是否结束
/*返回值表述当前游戏状况;
1.返回X表示玩家获胜
2.返回O表示电脑获胜
3.返回' '表示还未分出胜负
4.返回Q表示和棋*/
char Check(char chessBoard[Max_Row][Max_col]){
//1.检查所有的行,看是否有连
for (int row = 0; row < Max_Row; row++){
if (chessBoard[row][0] != ' '&& chessBoard[row][0] == chessBoard[row][1] &&
chessBoard[row][0] == chessBoard[row][2]){
return chessBoard[row][0];
}
}
//2.检查所有的列
for (int col = 0; col < Max_col; col++){
if (chessBoard[0][col] != ' '&& chessBoard[0][col] == chessBoard[1][col] &&
chessBoard[0][col] == chessBoard[2][col]){
return chessBoard[0][col];
}
}
//3.检查所有对角线,
if (chessBoard[0][0] != ' '&&chessBoard[0][0] == chessBoard[1][1] &&
chessBoard[2][2] == chessBoard[0][0]){
return chessBoard[0][0];
}
if (chessBoard[0][2] != ' '&&chessBoard[0][2] == chessBoard[1][1] &&
chessBoard[0][2] == chessBoard[2][0]){
return chessBoard[0][2];
}
//4.判定是否是和棋,如果满了就是和棋
int IsFull(chessBoard);
if ( IsFull(chessBoard)){
return 'Q';
}
return ' ';
}
//判定棋盘是否满了,满了返回1,否则返回0
//查看棋盘是否有空位置
int IsFull(char chessBoard[Max_Row][Max_col]){
//查找棋盘上是否有空位,
for (int row = 0; row < Max_Row; row++){
for (int col = 0; col < Max_col; col++){
if (chessBoard[row][col] == ' ') {
//找到空位棋盘没满,
//判定棋盘是否满了,满了返回1,否则返回0
return 0;
}
}
}
//所有的位置都找完,也没找到空格,最终返回1.
return 1;
}
步骤5.电脑落子
void ComputerMove(char chessBoard[Max_Row][Max_col]){
printf("轮到电脑落子!\n");
while (1){
int row = rand() % Max_Row;//Max_Row代表就是棋盘行的范围
int col = rand() % Max_col;//Max_col代表就是棋盘列的范围
if (chessBoard[row][col] != ' '){
continue;
}
chessBoard[row][col] = 'O';
break;
}
}
游戏核心步骤:
void Game(){
//1,创建并初始化一个棋盘(字符类型的二维数组)
//尽量避免使用 magic number 魔幻数字
//最好给这个数字起一个合适的名字
char chessBoard[Max_Row][Max_col] = { 0 };
//1.初始化棋盘
Init(chessBoard);
char winner = ' ';
while (1){
//2.打印棋盘
Print(chessBoard);
//3.提示玩家落子(输入坐标)
PlayerMove(chessBoard);
//4.检查游戏是否结束
winner = Check(chessBoard);
if (winner != ' '){
break;
}
//5.电脑落子
ComputerMove(chessBoard);
//6.检查游戏是否结束
winner = Check(chessBoard);
if (winner != ' '){
break;
}
}
Print(chessBoard);
if (winner == 'X'){
printf("恭喜你,你赢了\n");
}
else if (winner == 'O') {
printf("你真菜,连电脑都下不过\n");
}
else{
printf("你真菜,和电脑五五开\n");
}
}
主函数程序
int main(){
while (1){
int choice = Menu();//循环调用菜单函数(Menu())
if (choice == 1){
Game();
}
else if(choice == 0) {
printf("goodbye\n");
break;
} else {
printf("您的输入信息有误\n");
}
}
system("pause");
return 0;
}
整体程序:
//三子棋游戏
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int Menu(){
printf("=================================\n");
printf("**欢迎来到三子棋游戏** \n");
printf("1.表示开始游戏\n");
printf("0.表示结束游戏\n");
printf("X 表示玩家落的子;O 表示电脑落的子\n");
printf("==================================\n");
printf("请输入您的选择:\n");
int choice = 0;
scanf("%d", &choice);
return choice;
}
//上面部分均属于用户的提示信息
//初始化棋盘
#define Max_Row 3
#define Max_col 3
//步骤1.初始化棋盘
void Init(char chessBoard[Max_Row][Max_col]) {
// for (int row = 0; row < Max_Row; row++){
// for (int col = 0; col < Max_col; col++)
// chessBoard[row][col] = ' ';
// }
//}
//设置棋盘全部要是空棋盘
srand((unsigned int)time(0));//随机种子在程序启动之后一放就可以了
memset(chessBoard, ' ', Max_Row*Max_col);//以字节字节为单位设置的
}
//步骤2.打印棋盘
void Print(char chessBoard[Max_Row][Max_col]){
把棋盘的内容打印下来几行几列
// for (int row = 0; row < Max_Row; row++){
// for (int col = 0; col < Max_col; col++){
// //%c表示打印一个字符(后面传的是一个char变量) %s表示打印一个字符串(后面传的参数是一个字符数组)
// printf("%c", chessBoard[Max_Row][Max_col]);
// }
// printf("\n");
// }
for (int row = 0; row < Max_Row; row++){
printf("+---+---+---+\n");
printf("| %c | %c | %c |\n", chessBoard[row][0],chessBoard[row][1], chessBoard[row][2]);
//printf("\n");
}
printf("+---+---+---+\n");
}
//步骤3.玩家落子程序
void PlayerMove(char chessBoard[Max_Row][Max_col]){
printf("轮到玩家落子!\n");
while (1){
printf("请输入您要落子的位置(Row col): ");
int row = 0;
int col = 0;
scanf("%d %d", &row, &col);
//尽可能对用户输入数据进行校验,如果输入数据非法,就要进行处理
//2个if是对用户输入的数据进行校验
//合法性校验
if (row < 0 || row >= Max_Row || col < 0 || col >= Max_col){
printf("您的输入有误!请重新输入 \n");
continue;//调到while/意思就是重新调到while语句的位置重新执行
}
if (chessBoard[row][col] != ' '){
//当前位置有子了,不能再重复落子
printf("该位置已经有子了 \n");
continue;
}
chessBoard[row][col] = 'X';
break; //结束循环
}
}
//步骤4.查看游戏是否结束 步骤6.查看游戏是否结束
/*返回值表述当前游戏状况;
1.返回X表示玩家获胜
2.返回O表示电脑获胜
3.返回' '表示还未分出胜负
4.返回Q表示和棋*/
char Check(char chessBoard[Max_Row][Max_col]){
//1.检查所有的行,看是否有连
for (int row = 0; row < Max_Row; row++){
if (chessBoard[row][0] != ' '&& chessBoard[row][0] == chessBoard[row][1] &&
chessBoard[row][0] == chessBoard[row][2]){
return chessBoard[row][0];
}
}
//2.检查所有的列
for (int col = 0; col < Max_col; col++){
if (chessBoard[0][col] != ' '&& chessBoard[0][col] == chessBoard[1][col] &&
chessBoard[0][col] == chessBoard[2][col]){
return chessBoard[0][col];
}
}
//3.检查所有对角线,
if (chessBoard[0][0] != ' '&&chessBoard[0][0] == chessBoard[1][1] &&
chessBoard[2][2] == chessBoard[0][0]){
return chessBoard[0][0];
}
if (chessBoard[0][2] != ' '&&chessBoard[0][2] == chessBoard[1][1] &&
chessBoard[0][2] == chessBoard[2][0]){
return chessBoard[0][2];
}
//4.判定是否是和棋,如果满了就是和棋
int IsFull(chessBoard);
if ( IsFull(chessBoard)){
return 'Q';
}
return ' ';
}
//步骤5.电脑落子程序
void ComputerMove(char chessBoard[Max_Row][Max_col]){
printf("轮到电脑落子!\n");
while (1){
int row = rand() % Max_Row;//Max_Row代表就是棋盘行的范围
int col = rand() % Max_col;//Max_col代表就是棋盘列的范围
if (chessBoard[row][col] != ' '){
continue;
}
chessBoard[row][col] = 'O';
break;
}
}
//判定棋盘是否满了,满了返回1,否则返回0
//查看棋盘是否有空位置
int IsFull(char chessBoard[Max_Row][Max_col]){
//查找棋盘上是否有空位,
for (int row = 0; row < Max_Row; row++){
for (int col = 0; col < Max_col; col++){
if (chessBoard[row][col] == ' ') {
//找到空位棋盘没满,
//判定棋盘是否满了,满了返回1,否则返回0
return 0;
}
}
}
//所有的位置都找完,也没找到空格,最终返回1.
return 1;
}
//核心函数
void Game(){
//一局游戏的核心函数
//1,创建并初始化一个棋盘(字符类型的二维数组)
//尽量避免使用 magic number 魔幻数字
//最好给这个数字起一个合适的名字
char chessBoard[Max_Row][Max_col] = { 0 };
//1.初始化棋盘
Init(chessBoard);
char winner = ' ';
while (1){
//2.打印棋盘
Print(chessBoard);
//3.提示玩家落子(输入坐标)
PlayerMove(chessBoard);
//4.检查游戏是否结束
winner = Check(chessBoard);
if (winner != ' '){
break;
}
//5.电脑落子
ComputerMove(chessBoard);
//6.检查游戏是否结束
winner = Check(chessBoard);
if (winner != ' '){
break;
}
}
Print(chessBoard);
if (winner == 'X'){
printf("恭喜你,你赢了\n");
}
else if (winner == 'O') {
printf("你真菜,连电脑都下不过\n");
}
else{
printf("你真菜,和电脑五五开\n");
}
}
//主函数程序
int main(){
while (1){
int choice = Menu();//循环调用菜单函数(Menu())
if (choice == 1){
Game();
}
else if(choice == 0) {
printf("goodbye\n");
break;
} else {
printf("您的输入信息有误\n");
}
}
system("pause");
return 0;
}
运行结果: