头文件 game.h
#ifndef _GAME_H_ #define _GAME_H_ #include<stdio.h> #include"game.h" #include<stdlib.h> #include<time.h> #include<string.h> #pragma warning(disable:4996) typedef unsigned int uint; enum OPTION { EXIT, START }; #define ROW 3 #define COL 3 void menu(); void init_board(char board[ROW][COL], int row, int col);//初始化棋盘 void print_board(char board[ROW][COL], int row, int col);//打印棋盘 void computer_move(char board[ROW][COL], int row, int col);//电脑走 void palyer_move(char board[ROW][COL], int row, int col);//玩家走 int is_full(char board[ROW][COL], int row, int col);//判断是否下满 char is_win(char board[ROW][COL], int row, int col);//判断输赢 #endif //_GAME_H_
测试文件 test.c
#include"game.h" void menu() { printf("***** <三子棋游戏>*****\n"); printf("*************************\n"); printf("****** 1.play *******\n"); printf("****** 0.exit *******\n"); printf("*************************\n"); printf("*************************\n"); } void game() { char ret; char board[ROW][COL]; init_board(board, ROW, COL); print_board(board, ROW, COL); while (1) { printf("玩家走:\n"); palyer_move(board, ROW, COL); print_board(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != ' ') break; printf("电脑走:\n"); computer_move(board, ROW, COL); print_board(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != ' ') break; } if (ret == '#') { printf("恭喜你赢了!\n"); } else if (ret == '*') { printf("很遗憾,你输了\n"); } else if (ret == 'Q') { printf("平局\n"); } } int main() { int input = 0; srand((uint)time(NULL)); do { menu(); printf("请输入选择:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 2: break; case 3: printf("选择错误,请重新选择:"); break; } } while (input); return 0; }
接下来是 game.c
#include"game.h" void init_board(char board[ROW][COL], int row, int col) { for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { board[i][j] = ' '; } } } void print_board(char board[ROW][COL], int row, int col) { int i = 0; 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"); } } } void computer_move(char board[ROW][COL], int row, int col) { int x = 0, y = 0; while (1) { x = rand() % ROW; y = rand() % COL; if (board[x][y] = ' ') { board[x][y] = '*'; break; } } } void palyer_move(char board[ROW][COL], int row, int col) { int x = 0, y = 0; printf("请输入坐标:"); while (1) { scanf("%d,%d", &x, &y); if ((x >= 1 && x <= row) && (y >= 1 && y <= col)) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '#'; } else { printf("该坐标已被占用,请重新输入:\n"); } } else{ printf("坐标输入不合法,请重新输入:\n"); } } } static int is_full(char board[ROW][COL], int row, int col) { int i = 0; for (int i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { if (board[i][j] == ' ') { return 0; } } return 1; } } char is_win(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][2] != ' ')) { return board[i][1]; } } for (j = 0; j < col; j++) { if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[2][j] != ' ')) { return board[1][j]; } } if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[2][2] != ' ')) { return board[1][1]; } else if ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]) && (board[1][1] != ' ')) { return board[1][1]; } else if (is_full(board, ROW, COL) == 1) { return 'Q'; } else return ' '; }