三子棋介绍:《三子棋》又被称为黑白棋、井字棋、九宫棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子连成一条线的一方则视为胜利者。
目录
首先作为一个游戏我们创建菜单,并根据玩家输入选择开始游戏或者退出游戏
框架:
1.首先游戏需要创建3*3的棋盘
2.玩家下棋
3.电脑下棋
3.当一方棋子率先连成一线,或者棋盘满了没有胜利者则为平局
void game(void)
{
char board[ROW][COL] = { 0 }; //创建二维数组作为即将使用的棋盘
char ch = 0; //ch判断游戏结果
Reset(board,ROW,COL); //重置棋盘,并打印棋盘
while (1)
{
Player(board, ROW, COL); //玩家下棋
Print(board, ROW, COL); //打印棋盘
ch = Judge(board, ROW, COL); //判断输赢
Cp(board, ROW, COL); //电脑下棋
Print(board, ROW, COL); //打印棋盘
ch = Judge(board, ROW, COL); //判断输赢
}
}
现在我们开始使用C语言实现三子棋代码:
首先作为一个游戏我们创建菜单,并根据玩家输入选择开始游戏或者退出游戏
void menu(void)
{
printf("***********************************************\n");
printf("* 1>开始游戏 *\n");
printf("* 0>结束游戏 *\n");
printf("***********************************************\n");
}
void test(void)
{
int input = 0;
do
{
menu(); //菜单,选择相应数字开始游戏或者结束游戏
scanf("%d", &input);
switch (input)
{
case 1:
game(); //游戏部分
break;
case 0:
break;
default:
printf("请重新输入:\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
接下来是实现游戏部分:
游戏部分的实现根据不同的功能使用不同的函数来实现
1,棋盘:数组内容统一为空白符,并打印制表符形成棋盘的样子
void Reset(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
for (i = 0; i < row; i++)
{
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("----");
}
}
printf("\n");
}
}
2,玩家下棋:玩家通过坐标下棋
void Player(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋,请输入坐标:>");
scanf("%d %d", &x, &y);
if (board[x - 1][y - 1] == ' ') //判断玩家下棋位置是否合理
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标非法,重新输入:>\n");
}
}
}
3,电脑下棋:rand()产生随机数,电脑随机在空白处下棋
void Cp(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋:>\n");
while (1)
{
x = rand() % 3;
y = rand() % 3;
if (board[x][y] == ' ') //确保电脑在空白处下棋
{
board[x][y] = '#';
break;
}
}
}
4,任意一方下棋后显示实时棋盘:任意一方下棋后打印实时棋盘
void Print(char board[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
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("----");
}
}
printf("\n");
}
}
5,判断输赢:玩家赢该函数返回星号(*),电脑赢返回井号(#),平局返回(Q),游戏继续返回(C)
注意:当判断行或列时,哪一方赢了则返回其使用的棋子星号(*)或者井号(#),即数组元素内容
char Judge(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
int count = 0;
for (i = 0; i < row; i++) //判断每一行
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
for (j = 0; j < col; j++) //判断每一列
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
{
return board[0][j];
}
}
//判断对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
{
return board[0][0];
}
for (i = 0; i < row; i++) //判断棋盘是否满了
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
count++;
}
}
}
if (count != 0) //没满继续
{
return 'C';
}
else
{
return 'Q'; //满了平局
}
}
完整代码如下(三部分):
一,使用部分
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void game(void)
{
char board[ROW][COL] = { 0 };
char ch = 0;
Reset(board,ROW,COL);
while (1)
{
Player(board, ROW, COL);
Print(board, ROW, COL);
ch = Judge(board, ROW, COL);
if (ch == '*')
{
printf("YOU WIN\n");
break;
}
if (ch == '#')
{
printf("YOU LOSE\n");
break;
}
if (ch == 'C')
;
if (ch == 'Q')
{
printf("DRAW\n");
}
Cp(board, ROW, COL);
Print(board, ROW, COL);
ch = Judge(board, ROW, COL);
if (ch == '*')
{
printf("YOU WIN\n");
break;
}
if (ch == '#')
{
printf("YOU LOSE\n");
break;
}
if (ch == 'C')
;
if (ch == 'Q')
{
printf("DRAW\n");
}
}
}
void menu(void)
{
printf("***********************************************\n");
printf("* 1>开始游戏 *\n");
printf("* 0>结束游戏 *\n");
printf("***********************************************\n");
}
void test(void)
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu(); //菜单,选择相应数字开始游戏或者结束游戏
scanf("%d", &input);
switch (input)
{
case 1:
game(); //游戏部分
break;
case 0:
break;
default:
printf("请重新输入:\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
二,各个函数声明部分(名为game.h的头文件)
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//初始化棋盘
void Reset(char board[ROW][COL],int row,int col);
//玩家下棋
void Player(char board[ROW][COL],int row,int col);
//电脑下棋
void Cp(char board[ROW][COL], int row, int col);
//玩家或者电脑下棋后打印棋盘
void Print(char board[ROW][COL], int row, int col);
//判断输赢
char Judge(char board[ROW][COL], int row, int col);
三,函数实现部分
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void Reset(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
for (i = 0; i < row; i++)
{
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("----");
}
}
printf("\n");
}
}
void Player(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋,请输入坐标:>");
scanf("%d %d", &x, &y);
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标非法,重新输入:>\n");
}
}
}
void Cp(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("电脑下棋:>\n");
x = rand() % 3;
y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
void Print(char board[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
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("----");
}
}
printf("\n");
}
}
char Judge(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
int count = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
{
return board[0][j];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
{
return board[0][0];
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
count++;
}
}
}
if (count != 0)
{
return 'C';
}
else
{
return 'Q';
}
}