三子棋是两人在九个格子里分别摆放属于自己的棋子,只要三个自己的棋子连成一线,即可获胜。根据三子棋的条件,要使用C语言实现可以分为这几步,1.打印棋盘,2.双方下棋,3.打印所下棋子,4.判断谁赢或者平局(如果都不成立则双方又继续下棋至到一方胜出或者双方平局)
1.打印棋盘 首先先打印游戏开始菜单,使用do-while让用户可以选择开始游戏和离开游戏。
当输入1时,进入游戏,输入0时打印退出游戏,并跳出循环,且input为0跳到return 0,输入其他数字时,打印提示信息,因为input非0,所以继续进入循环,重新输入信息。
因为三子棋是在九宫格里下棋,所以可以采用二维数组来存储棋子,对于棋盘可以这样子设计
其中%c就是二维数组里的字符,一开始先对二维数组进行初始化,将每一个数据都打印成空格然后再打印出棋盘和棋子。其中ROW和COL代表行和列都为3
打印结果:
2.双方下棋
首先用户下棋,接着电脑下棋,下棋就是对二维数组录入数据,再将棋子打印在棋盘上。
用户下棋
电脑下棋
3.打印双方所下棋子
使用一开始打印棋盘和棋子的函数,来打印棋子。
每下完一步后就直接打印。
4.判断输赢或者平局
判断游戏获胜的条件是三行或者三列,或者对角线上三个字符相等即获胜。 平局的判断,若棋盘下满,即是平局。
棋盘是否下满的判断
全部代码:
main.c:
#include<stdio.h>
#include"game.h"
void meau();
void game()
{
char get = 0;
char arr[ROW][COL] = { 0 };
BoardInit(arr, ROW, COL);
BoardDisplay(arr,ROW,COL);
while (1)
{
Playermove(arr, ROW, COL);
BoardDisplay(arr, ROW, COL);
get=Iswin(arr, ROW, COL);
if (get != 'C')
{
break;
}
Computermove(arr, ROW, COL);
BoardDisplay(arr, ROW, COL);
get=Iswin(arr, ROW, COL);
if (get != 'C')
{
break;
}
}
if (get == '*')
{
printf("玩家胜利!\n");
}
else if (get == '#')
{
printf("电脑胜利!\n");
}
else
{
printf("和局\n");
}
}
int main()
{
srand((unsigned int) time(NULL));
int input = 0;
do
{
meau();
scanf_s("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
void meau()
{
printf("********三子棋*********\n");
printf("****1.play 0.exit***\n");
printf("***********************\n");
}
game.h:
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void BoardInit(char arr[ROW][COL], int row, int col);
void BoardDisplay(char arr[ROW][COL], int row, int col);
void Playermove(char arr[ROW][COL], int row, int col);
void Computermove(char arr[ROW][COL], int row, int col);
char Iswin(char arr[ROW][COL], int row, int col);
game.c
#include"game.h"
void BoardInit(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
arr[i][j] = ' ';
}
}
}
void BoardDisplay(char arr[ROW][COL], int row, int col)
{
for (int i = 0; i < ROW; i++)
{
if (i < ROW - 1)
{
printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
printf("---|---|---\n");
}
else
{
printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
}
}
}
void Playermove(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家走:>\n");
while (1)
{
printf("请玩家输入坐标:>");
scanf_s("%d %d", &x, &y);
if (1 <= x && x <= ROW && 1 <= y && y <= COL)//判断坐标的合法性
{
if (arr[x-1][y-1] == ' ')//判断坐标是否被占用,x和y都减一是因为数组的下标是从0开始。
{
arr[x-1][y-1] = '*';
break;
}
else
{
printf("该坐标被占用!\n");
}
}
else
{
printf("坐标非法,请重新输入!\n");
}
}
}
//提醒信息 输入棋子 判断棋子是否合法 1.写入数组 0.提醒重新输入
void Computermove(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑走:>\n");
while(1)
{
x = rand()%3;//调用rand函数,并对其取3的模,保证x和y的范围在0-2
y = rand()%3;
if (arr[ x ][ y ] == ' ')
{
arr[ x ][ y ] = '#';
break;
}
}
}
//全满返回1 不满返回0
int Fullboard(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (arr[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
//'*'代表玩家胜利,'#'代表电脑胜利,'$'平局,'C'继续
char Iswin(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
//先判断三行
for (x = 0; x < ROW; x++)
{
if (arr[x][0] == arr[x][1] && arr[x][0] == arr[x][2] && arr[x][1] !=' ')
{
return arr[x][1];
}
}
//三列
for (y = 0; y < COL; y++)
{
if (arr[0][y] == arr[1][y] && arr[0][y] == arr[2][y] && arr[1][y] != ' ')
{
return arr[1][y];
}
}
//交叉
if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[1][1] != ' ')
{
return arr[1][1];
}
if (arr[2][0] == arr[1][1] && arr[0][2] == arr[2][0] && arr[1][1] != ' ')
{
return arr[1][1];
}
if (1 == Fullboard(arr, ROW, COL))
{
return '$';
}
return 'C';
}