1. 创建棋盘
首先在游戏主程序 game( ) 中创建棋盘并初始化:
char chessBoard[ROW][COL] = { 0 };
初始化棋盘:
void init(char str[ROW][COL])
{
//这里用库函数更方便
//for (int i = 0; i < ROW; i++)
//{
// for (int j = 0; j < COL; j++)
// {
// str[i][j] = ' ';
// }
//}
memset(str,' ',ROW*COL);
}
2. 打印棋盘
打印棋盘:
void print(char str[ROW][COL])
{
printf("+---+---+---+\n");
for (int i = 0; i < ROW; i++)
{
printf("| %c | %c | %c |\n", str[i][0],
str[i][1], str[i][2]);
printf("+---+---+---+\n");
}
}
3. 玩家走棋
玩家先下子:
void playerMove(char str[ROW][COL])
{
//玩家输入下子位置
while (1)
{
printf("请下子(范围为0~2):\n");
int row, col;
scanf("%d %d", &row, &col);
//如果输入坐标超出范围,则提示并重新进入循环
if (row<0 || row>ROW - 1 || col<0 || col>COL - 1)
{
printf("超出棋盘范围,请重新输入合适位置:\n");
continue;
}
//如果输入坐标处已有子,则提示并重新进入循环
if (str[row][col] != ' ')
{
printf("该位置已有棋子,请重新输入:\n");
continue;
}
str[row][col] = 'x';
break;
}
}
5. 电脑走棋
电脑下子:
void RobotMove(char str[ROW][COL])
{
while (1)
{
int row, col;
//行列取不大于3的随机值
row = rand() % ROW;
col = rand() % COL;
//如果坐标处已有子,则重新进入循环
if (str[row][col] != ' ')
{
continue;
}
str[row][col] = 'o';
break;
}
}
6. 判定胜负
判断胜负关系:
char isWin(char str[ROW][COL])
{
//判断一行元素是否相等,若相等则返回它们的共同值
for (int i = 0; i < ROW; i++)
{
if (str[i][0] != ' '&&str[i][0] == str[i][1] && str[i][0] == str[i][2])
{
return str[i][0];
}
}
//判断一列元素是否相等,若相等则返回它们的共同值
for (int j = 0; j < ROW; j++)
{
if (str[0][j] == str[1][j] && str[0][j] == str[2][j])
{
return str[0][j];
}
}
//判断两个对角线上的元素是否相等,若相等则返回它们的共同值
if (str[0][0] != ' '&&str[0][0] == str[1][1] && str[0][0] == str[2][2])
{
return str[0][0];
}
if (str[0][2] != ' '&&str[0][2] == str[0][1] && str[0][2] == str[2][0])
{
return str[0][2];
}
//判断棋盘是否还有空位,如果有,返回空格,游戏继续;如果没有,返回一个任意字母,游戏以和局结束
int flag = isFull(str);
if (flag == 1)
return 'l';
else if (flag == 0)
return ' ';
}
判断棋盘是否还有空位:
//若还有空位返回一个0
int isFull(char str[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (str[i][j] == ' ')
return 0;
}
}
return 1;
}
游戏演示
程序文件:
main.c
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
// 游戏流程
// 1. 创建棋盘并初始化
// 2. 打印棋盘
// 3. 玩家落子
// 4. 判定胜负
// 5. 电脑落子
// 6. 判定胜负
// continue 2
void game()
{
char chessBoard[ROW][COL] = { 0 };//创建棋盘
init(chessBoard);//初始化棋盘
//判断胜负关系标志位
char flag = ' ';
while (1)
{
//打印棋盘
print(chessBoard);
//玩家落子
playerMove(chessBoard);
//判断胜负
flag = isWin(chessBoard);
if (flag != ' ')
break;
//人机落子
RobotMove(chessBoard);
//判断胜负
if (flag != ' ')
break;
}
if (flag == 'x')
printf("恭喜你获得了胜利!\n");
else if (flag == 'o')
printf("很遗憾,你输了。\n");
else
printf("和局!\n");
}
int main()
{
//随机数种子
srand(time(0));
while (1)
{
int choice = menu();
if (choice == 1)
game();
else if (choice == 2)
{
printf("再见不送\n");
break;
}
else
{
printf("请输入正确选项!\n");
continue;
}
}
return 0;
system("pause");
} {
printf("再见不送\n");
break;
}
else
{
printf("请输入正确选项!\n");
continue;
}
}
return 0;
system("pause");
}
game.c
#define _CRT_SECURE_NO_WARNINGS
include"game.h"
#define ROW 3
#define COL 3
int menu()
{
printf("**********************************\n");
printf("***** 欢迎来到三子棋小游戏 *****\n");
printf("***** 1.开始游戏 *****\n");
printf("***** 2.退出游戏 *****\n");
printf("**********************************\n");
printf("请选择:");
int x = 0;
scanf("%d", &x);
return x;
}
//初始化棋盘
void init(char str[ROW][COL])
{
//for (int i = 0; i < ROW; i++)
//{
// for (int j = 0; j < COL; j++)
// {
// str[i][j] = ' ';
// }
//}
memset(str, ' ', ROW*COL);
}
//打印棋盘
void print(char str[ROW][COL])
{
printf("+---+---+---+\n");
for (int i = 0; i < ROW; i++) {
printf("| %c | %c | %c |\n", str[i][0],
str[i][1], str[i][2]);
printf("+---+---+---+\n");
}
}
//玩家落子
void playerMove(char str[ROW][COL])
{
//玩家输入下子位置
while (1)
{
printf("请下子(范围为0~2):\n");
int row, col;
scanf("%d %d", &row, &col);
//如果输入坐标超出范围,则提示并重新进入循环
if (row<0 || row>ROW - 1 || col<0 || col>COL - 1)
{
printf("超出棋盘范围,请重新输入合适位置:\n");
continue;
}
//如果输入坐标处已有子,则提示并重新进入循环
if (str[row][col] != ' ')
{
printf("该位置已有棋子,请重新输入:\n");
continue;
}
str[row][col] = 'x';
break;
}
}
//人机落子
void RobotMove(char str[ROW][COL])
{
while (1)
{
int row, col;
//行列取不大于3的随机值
row = rand() % ROW;
col = rand() % COL;
//如果坐标处已有子,则重新进入循环
if (str[row][col] != ' ')
{
continue;
}
str[row][col] = 'o';
break;
}
}
//判断胜负
char isWin(char str[ROW][COL])
{
//判断一行元素是否相等,若相等则返回它们的共同值
for (int i = 0; i < ROW; i++)
{
if (str[i][0] != ' '&&str[i][0] == str[i][1] && str[i][0] == str[i][2])
{
return str[i][0];
}
}
//判断一列元素是否相等,若相等则返回它们的共同值
for (int j = 0; j < ROW; j++)
{
if (str[0][j] == str[1][j] && str[0][j] == str[2][j])
{
return str[0][j];
}
}
//判断两个对角线上的元素是否相等,若相等则返回它们的共同值
if (str[0][0] != ' '&&str[0][0] == str[1][1] && str[0][0] == str[2][2])
{
return str[0][0];
}
if (str[0][2] != ' '&&str[0][2] == str[0][1] && str[0][2] == str[2][0])
{
return str[0][2];
}
//判断棋盘是否还有空位,如果有,返回空格,游戏继续;如果没有,返回一个任意字母,游戏以和局结束
int flag = isFull(str);
if (flag == 1)
return 'l';
else if (flag == 0)
return ' ';
}
//判断棋盘是否还有空位
int isFull(char str[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (str[i][j] == ' ')
return 0;
}
}
return 1;
}
game.h
#pragma once
#include<stdio.h>
#include<string.h>
#define ROW 3
#define COL 3
int menu();
void init(char str[ROW][COL]);
void print(char str[ROW][COL]);
void playerMove(char str[ROW][COL]);
void RobotMove(char str[ROW][COL]);
char isWin(char str[ROW][COL]);
int isFull(char str[ROW][COL]);