三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。
实现的原理比较简单,我们直接看代码。
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; }
看一下游戏效果: