三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。
实现的原理比较简单,我们直接看代码。
three_chess.h
#ifndef _THREE_CHESS_H_
#define _THREE_CHESS_H_
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
void start(void);
#endif
three_chess.c
#include "three_chess.h"
//判断棋盘是不是下满了,下满了返回0,没下满返回1
static int is_full(char board[][COL])
{
int i, j;
for(i = 0; i < ROW; i++)
{
for(j = 0; j < COL; j++)
{
if(board[i][j] == ' ')
{
return 1;
}
}
}
return 0;
}
//判断输赢的函数
static int is_win(char board[][COL])
{
int i;
//判断横着的三行,如果任意一行的符号全部一样说明,产生赢家
for(i = 0; i < ROW; i++)
{
if(board[i][0] == board[i][1] && board[i][1] == board[i][2])
{
//如果是'o'这个字符,说明玩家赢了
if(board[i][0] == 'o')
{
//玩家赢了,返回1
return 1;
}
//如果是'x'这个字符,说明电脑赢了
else if(board[i][0] == 'x')
{
//电脑赢了,返回2
return 2;
}
}
}
//和判断行原理相同
for(i = 0; i < COL; i++)
{
if(board[0][i] == board[1][i] && board[1][i] == board[2][i])
{
if(board[0][i] == 'o')
{
return 1;
}
else if(board[0][i] == 'x')
{
return 2;
}
}
}
//判断斜着的是否一样
if(board[0][0] == board[1][1] && board[1][1] == board[2][2] || board[0][2] == board[1][1] && board[1][1] == board[2][0])
{
if(board[1][1] == 'o')
{
return 1;
}
else if(board[1][1] == 'x')
{
return 2;
}
}
//走到这里说明棋盘满了,但是还没有产生赢家,那么返回3
if(!is_full(board))
{
return 3;
}
//走到这里说明,棋盘没有下满,也没有产生赢家,继续走
return 0;
}
//电脑产生0-2的随机数下棋,如果位置被占用,继续产生
static void computer_move(char board[][COL])
{
srand((unsigned int)time(NULL));
int x, y;
do
{
x = rand() % 3;
y = rand() % 3;
if(board[x][y] == ' ')
{
board[x][y] = 'x';
break;
}
}while(1);
}
//游戏玩家下棋函数
static void man_move(char board[][COL])
{
int x, y;
do
{
printf("请输入坐标<x, y> : ");
scanf("%d%d", &x, &y);
if(x < 1 || x > 3 || y < 1 || y > 3)
{
printf("坐标不在范围内!\n");
continue;
}
if(board[x - 1][y - 1] != ' ')
{
printf("此位置已经被占用!\n");
continue;
}
//走到这里说明输入正确,而且这个位置也没有被占用
board[x - 1][y - 1] = 'o';
break;
}while(1);
}
//打印棋盘
static void print_board(char board[][COL])
{
int i;
for(i = 0; i < ROW; i++)
{
printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
if(i < ROW - 1)
{
printf("---|---|---\n");
}
}
}
//初始化棋盘,全部初始化为空格' '
static void init_board(char board[][COL])
{
int i, j;
for(i = 0; i < ROW; i++)
{
for(j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
static void game(void)
{
char board[ROW][COL];
init_board(board);
int res;
do
{
system("clear");
print_board(board);
man_move(board);
res = is_win(board);
if(res)
{
break;
}
computer_move(board);
res = is_win(board);
if(res)
{
break;
}
}while(!res);
//为了最后退出游戏时,能看到下的那步棋
system("clear");
print_board(board);
if(1 == res)
{
printf("你赢了不会玩的电脑,hehe!\n");
exit(0);
}
if(2 == res)
{
printf("恭喜电脑获胜,yeah!\n");
exit(0);
}
if(3 == res)
{
printf("平局,666!\n");
exit(0);
}
}
//打印开始界面
static void menu(void)
{
printf("######################\n");
printf("######################\n");
printf("## three chess game ##\n");
printf("## 1.play ##\n");
printf("## 0.exit ##\n");
printf("######################\n");
printf("######################\n");
printf("Please choose: ");
}
void start(void)
{
int num;
do
{
system("clear");
menu();
scanf("%d", &num);
switch(num)
{
case 1:
game();
break;
case 0:
exit(0);
break;
default:
break;
}
}while(1);
}
main.c
#include "three_chess.h"
int main(void)
{
start();
return 0;
}
看一下游戏效果: