今天我们将用C语言实现九宫格三子棋游戏,本篇博客将对此进行详解,文章最后有完整代码。
首先我们打印一个游戏菜单函数,用数字1代表进入三子棋游戏,数字0退出游戏
void menu()
{
printf("*********************\n");
printf("*****1.进入游戏******\n");
printf("*****2.退出游戏******\n");
printf("*********************\n");
}
我们接下来可以进行游戏的构思,先不用管游戏如何实现 我们用input申请一个空间,作为进入游戏和退出游戏的指令操作 这里我们可以用do while循环,无论条件是否满足,首先打印游戏的菜单
int main()
{
int input = 0;
do
{
menu();
printf("请输入数字->:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("进入游戏\n");
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
break;
}
} while (input);
return 0;
}
代码就可以展示出以下的效果
接下来我们就用game函数来实现三子棋游戏 这里我们在头文件game.h里用define定义两个常量ROW 、COL为3
首先我们初始化棋盘的各个棋盘格,定义InitBoard函数,x为棋盘的横坐标,y为棋盘的纵坐标 ,定义棋盘为board[ROW][COL]
void InitBoard(char board[ROW][COL], int x, int y)
{
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
board[i][j] = ' ';
}
}
}
通过以上的代码,每个棋盘格都被初始化为一个空格了
初始化棋盘后我们就可以定义一个DisplayBoard函数打印空的棋盘 我们可以用两个for循环进行嵌套,首先打印 “ | ”,打印两个“ | ”后就进行换行,打印纵向的分界线“ —|—|—”,打印两个分界线
void DisplayBoard(char board[ROW][COL], int x, int y)
{
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
printf(" %c ", board[i][j]);
// 此处的输出%c前后都加了空格,打印出来会更加美观
if(j<y-1)
printf("|");
}
printf("\n");
if (i < x - 1)
{
printf("---|---|---\n");
}
}
}
打印出来的效果如图
将棋盘格打印出来之后玩家可以进行下棋了,但是这里注意,玩家下棋时肯定是不会认为有(0,0)坐标的,所以我们在进行落子判断是有进行纵坐标和横坐标的“-1”操作,我们用“*”作为玩家的棋子
void PlayerMove(char board[ROW][COL], int x, int y)
{
int a = 0;
int b = 0;
printf("玩家下棋\n");
printf("请输入坐标->:");
while (1)
{
scanf("%d %d", &a, &b);
if (a >= 1 && a <= ROW && b >= 1 && b <= ROW)
{
if (board[a - 1][b - 1] == ' ')
{
board[a - 1][b - 1] = '*';
break;
}
//若玩家落子的棋盘格是空格则填入“*”
else
printf("该坐标已经有棋子,不能落子,请重新输入坐标->:");
}
else
printf("输入坐标不合法,请重新输入->:");
//玩家输入的坐标横坐标或者纵坐标不在1~3的范围内
}
}
效果如图
玩家下棋后,电脑玩家下棋,我们就用“#”作为电脑玩家的棋子,我们用rand函数随机生成两个个0~2内的数字,使用rand函数我们要记得用srand(unsigned int(time(NULL)))放入main函数,生成随机的“种子”, rand函数才能真正地实现随机数
void ComputerMove(char board[ROW][COL], int x, int y)
{
printf("电脑玩家\n");
int a = rand() % 3;
int b = rand() % 3;
while (1)//如果随机生成的坐标玩家已经落子就继续进行循环
{
if(a >= 0 && a <= ROW-1 &&b >= 0 && b <= ROW - 1)
{
if (board[a][b] == ' ')
{
board[a][b] = '#';
break;
}
}
}
}
效果如图
下棋之后我们就创建一个判断输赢的函数,如果还没有赢就继续下棋,棋盘满了之后没有胜负之分就是平局 首先我们用1代表玩家赢了 、2代表电脑赢了 、3代表平局 、 4代表继续 我们用两个for循环进行嵌套,创建一个判断棋盘是否已满的IsFull函数
int IsFull(char board[ROW][COL], int x, int y)
{
int i = 0;
int j = 0;
for (i = 0; i < x; i++)
{
for (j = 0; j < y; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
int Win(char board[ROW][COL], int x, int y)
{
//1--玩家赢了 2--电脑赢了 3--平局 4--继续
int i = 0;
int j = 0;
for (i = 0; i < x; i++)
{
if (board[i][0] == board[i][1] && board[i][2] == board[i][1] && board[i][0] == '*')
return 1;
}
for (j = 0; j < y; j++)
{
if (board[0][j] == board[1][j] && board[2][j] == board[1][j] && board[0][j] == '#')
return 2;
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == '*')
return 1;
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == '*')
return 1;
//对角线全是*的情况,玩家赢
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == '#')
return 2;
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == '#')
return 2;
//对角线全是#的情况,电脑玩家赢
if (IsFull(board, x, y) == 1)
return 3;//棋盘全满了,未能分出胜负,平局
else
return 4;//继续下棋
}
下面我们就可以将多个函数进行整合,放进game函数 我们定义一个变量ret来存放Win函数返回的值,来判断游戏的胜负 我们可以使用while循环,而后面的循环条件就用1,以便于游戏胜负已分之后,可以接着玩
void game()
{
//首先初始化棋盘里面的内容为空格
char board[ROW][COL] = { 0 };
int ret = 0;
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
while (1)
{
//玩家落子下棋
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = Win(board, ROW, COL);
if (ret != 4)
break;
//每进行一次下棋,就进行一次输赢的判断,只要不等于4就会停止循环,本次游戏结束
//电脑玩家落子下棋
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = Win(board, ROW, COL);
if (ret != 4)
break;
}
if (ret == 1)
{
printf("玩家赢\n");
}
else if (ret == 2)
printf("电脑玩家赢\n");
else
printf("平局\n");
}
到这里,三子棋游戏就完成了!
下面是三子棋游戏的完整代码 game.h(头文件包括了函数的声明)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void InitBoard(char board[ROW][COL], int, int);
void DisplayBoard(char board[ROW][COL], int, int);
void PlayerMove(char board[ROW][COL], int, int);
void ComputerMove(char board[ROW][COL], int, int);
int Win(char board[ROW][COL], int, int);
int IsFull(char board[ROW][COL], int, int);
game.c(函数定义)
#include "game.h"
void InitBoard(char board[ROW][COL], int x, int y)
{
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
board[i][j] = ' ';
}
}
}
void DisplayBoard(char board[ROW][COL], int x, int y)
{
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
printf(" %c ", board[i][j]);
if(j<y-1)
printf("|");
}
printf("\n");
if (i < x - 1)
{
printf("---|---|---\n");
}
}
}
void PlayerMove(char board[ROW][COL], int x, int y)
{
int a = 0;
int b = 0;
printf("玩家下棋\n");
printf("请输入坐标->:");
while (1)
{
scanf("%d %d", &a, &b);
if (a >= 1 && a <= ROW && b >= 1 && b <= ROW)
{
if (board[a - 1][b - 1] == ' ')
{
board[a - 1][b - 1] = '*';
break;
}
else
printf("该坐标已经有棋子,不能落子,请重新输入坐标->:");
}
else
printf("输入坐标不合法,请重新输入->:");
}
}
void ComputerMove(char board[ROW][COL], int x, int y)
{
printf("电脑玩家\n");
int a = rand() % 3;
int b = rand() % 3;
while (1)
{
if(a >= 0 && a <= ROW-1 &&b >= 0 && b <= ROW - 1)
{
if (board[a][b] == ' ')
{
board[a][b] = '#';
break;
}
}
}
}
int IsFull(char board[ROW][COL], int x, int y)
{
int i = 0;
int j = 0;
for (i = 0; i < x; i++)
{
for (j = 0; j < y; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
int Win(char board[ROW][COL], int x, int y)
{
//1--玩家赢了 2--电脑赢了 3--平局 4--继续
int i = 0;
int j = 0;
for (i = 0; i < x; i++)
{
if (board[i][0] == board[i][1] && board[i][2] == board[i][1] && board[i][0] == '*')
return 1;
}
for (j = 0; j < y; j++)
{
if (board[0][j] == board[1][j] && board[2][j] == board[1][j] && board[0][j] == '#')
return 2;
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == '*')
return 1;
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == '*')
return 1;
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == '#')
return 2;
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == '#')
return 2;
if (IsFull(board, x, y) == 1)
return 3;
else
return 4;
}
test.c
#include"game.h"
void menu()
{
printf("*********************\n");
printf("*****1.进入游戏******\n");
printf("*****2.退出游戏******\n");
printf("*********************\n");
}
void game()
{
//首先初始化棋盘里面的内容为空格
char board[ROW][COL] = { 0 };
int ret = 0;
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
while (1)
{
//玩家落子下棋
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = Win(board, ROW, COL);
if (ret != 4)
break;
//电脑玩家落子下棋
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = Win(board, ROW, COL);
if (ret != 4)
break;
}
if (ret == 1)
{
printf("玩家赢\n");
}
else if (ret == 2)
printf("电脑玩家赢\n");
else
printf("平局\n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入数字->:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
break;
}
} while (input);
return 0;
}
好了,以上就是今天的分享了,下次再见!