三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。
如果两个人都掌握了技巧,那么一般来说就是平棋。一般来说,下在中间最有利,下在角上次之,下在边上再次之。最大的好处就是随便找个地方就可以玩这个简单而有趣的游戏了。
代码如下:
头文件 //game.h
#ifndef _GAME_H_ //假如没有定义这个游戏 #define _GAME_H_ //那么就定义一个呀 #include<stdio.h> #include<time.h> #include<stdlib.h> #define ROW 3 //我们定义行为3 #define COL 3 //定义列为3 #endif //结束 void Initboard(char board[ROW][COL],int row,int col); //初始化一个棋盘 void Displayboard(char board[ROW][COL],int row,int col); //打印这个棋盘 void PlayerMove(char board[ROW][COL],int row,int col); //玩家走之后显示的棋盘 void ComputerMove(char board[ROW][COL],int row,int col); //电脑走之后显示的棋盘 char Checkwin(char board[ROW][COL],int row,int col); //最终一方获胜,游戏结束,打印出棋盘
实现部分 //game.c
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include "game.h" #include <string.h> void ChessBoard(char arr[Row][Col], int row, int col) { memset(arr, ' ', row*col*sizeof(arr[0][0])); } void DisplayBoard(char arr[Row][Col], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { printf(" %c ",arr[i][j]); if (j != (col - 1)) { printf("|"); } } printf("\n"); if (i != (row - 1)) { for (j = 0; j < col; j++) { printf("___", arr[i][j]); if (j != (col - 1)) { printf("|"); } } printf("\n"); } else { for (j = 0; j < col; j++) { printf(" "); if (j != (col - 1)) { printf("|"); } } printf("\n"); } } } void PlayerMove(char arr[Row][Col], int row, int col) { int x = 0; int y = 0; while (1) { printf("玩家走:\n"); printf("请输入坐标:\n"); scanf("%d%d", &x, &y); if ((x >= 1) && (x <= row) && (y >= 1) && (y <= col)) { if (arr[x - 1][y - 1] == ' ') { arr[x - 1][y - 1] = 'X'; break; } else { printf("坐标被占用\n"); } } else { printf("坐标非法\n"); } } } void ComputerMove(char arr[Row][Col], int row, int col) { printf("电脑走\n"); while (1) { int x = rand() % row; int y = rand() % col; if (arr[x][y] == ' ') { arr[x][y] = '0'; break; } } } char CheckWin(char arr[Row][Col], int row, int col) { int i = 0; int j = 0; int flag = 0; for (i = 0; i < row; i++) { for (j = 0; j < col-1; j++) { if ((arr[i][j] == arr[i][j+1]) && (arr[i][0]!=' ')) { flag = 1; } else { flag = 0; break; } } if (flag == 1) { return arr[i][0]; } } for (j = 0; j < col; j++) { for (i = 0; i < row-1; i++) { if ((arr[i][j]==arr[i+1][j]) && (arr[0][j]!=' ')) { flag = 1; } else { flag = 0; break; } } if (flag == 1) { return arr[0][j]; } } for (i = 0; i < row-1; i++) { if ((arr[i][i]== arr[i+1][i+1]) && (arr[0][0]!=' ')) { flag = 1; } else { flag = 0; break; } } if (flag == 1) { return arr[0][0]; } for (i = 0; i < row-1; i++) { if ((arr[i][row-i-1]==arr[i+1][row-i-2]) && (arr[0][row-1]!=' ')) { flag = 1; } else { flag = 0; break; } } if (flag == 1) { return arr[0][row-1]; } if (IsFull(arr, row, col) == 1) { return 'q'; } return ' '; } int IsFull(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; }
测试部分 //test.c
#include"game.h" void menu() //游戏菜单 { printf("****************************\n"); printf("********* 1.play *********\n"); printf("********* 0.exit *********\n"); printf("****************************\n"); } void game() { char win = ' '; char board[ROW][COL] = {' '}; Initboard(board,ROW,COL); Displayboard(board,ROW,COL); while(1) { PlayerMove(board,ROW,COL); win = Checkwin(board,ROW,COL); if(win !=' ') break; Displayboard(board,ROW,COL); ComputerMove(board,ROW,COL); if(win !=' ') break; Displayboard(board,ROW,COL); } if(win == 'X') { printf("玩家赢\n"); } else if(win == '0') { printf("电脑赢\n"); } else printf("平局\n"); } void test() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:\n"); scanf("%d",&input); switch(input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误请重新选择!\n"); break; } } while(input); } int main() { test(); system("pause"); return 0; }
运行结果如下: