1 创建三个工程分别为实现部分为test.c,游戏的头文件game.h,游戏的源文件game.c。
1 test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void menu()
{printf("***********************\n");printf("***** 1.play ******\n");printf("***** 0.exit ******\n");printf("***********************\n");
}void game()
{//数组存储到一个字符的二维数组,玩家下棋是’*‘,电脑下棋是‘#’。char board[ROW][COL] = { 0 };//数组的内容应该全部是空格InitBoard(board, ROW, COL);//初始化棋牌//打印棋盘DisplayBoard(board, ROW, COL);//下棋char ret = 0;while (1){player_move(board, ROW, COL);DisplayBoard(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret !='C'){break;}computer_move(board, ROW, COL);DisplayBoard(board, ROW, COL);ret = is_win(board, ROW, COL);//if (ret == 'C')//{// break;//}}if (ret == '*'){printf("玩家赢\n");}else if (ret == '#'){printf("电脑赢\n");}else{printf("平局\n");}
}void test()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");default:printf("选择错误");break;}} while (input);
}int main()
{test();return 0;
}
2.游戏的头文件
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard (char board[ROW][COL], int row, int col);
//玩家下棋
void player_move(char board[ROW][COL], int row, int col);
//电脑下棋
void computer_move(char board[ROW][COL], int row, int col);
//判断输赢的代码
//玩家赢-’*‘
//电脑赢- ’#‘
//平均---’Q‘
//继续---’C‘
char is_win(char board[ROW][COL], int row, int col);
int is_full(char board[ROW][COL], int row, int col);
3.游戏的源文件
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"void InitBoard(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}
}//void DisplayBoard(char board[ROW][COL], int row, int col)
//{
// int i = 0;
// int j = 0;
// for (i = 0; i < row; i++)
// {
// //数据
// printf(" %c | %c | %c \n", board[i][0], board[i][i], board[i][2]);
// //分割行
// if(i<row-1)
// printf("---|---|---\n");
// }
//}
//版本2
void DisplayBoard(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){//数据for (j = 0; j < col; j++){printf(" %c ", board[i][j]);if (j < col - 1)printf("|");}printf("\n");if (i < row - 1){for (j = 0; j < col; j++){printf("---");if (j < row - 1)printf("|");}}printf("\n");}
}
void player_move(char board[ROW][COL], int row, int col)
{printf("玩家下棋:>");int x = 0;int y = 0;scanf("%d %d", &x, &y);while (1){//坐标合法的判断if (x >= 1 && x <= row && y >= 1 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("坐标已被占用,请重新输入!\n");}}else{printf("坐标非法,请重新输入!\n");}}
}
void computer_move(char board[ROW][COL], int row, int col)
{while (1){int x = 0;int y = 0;printf("电脑下棋>\n");x = rand() % ROW;//0~2y = rand() % COL;//0~2if (board[x][y] == ' '){board[x][y] = '#';break;}}
}int is_full(char board[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 (board[i][j] == ' '){return 0;}}}return 1;
}
char is_win(char board[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] &&board [i][1]!= ' '){return board[i][1];}}for (i = 0; i < col; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' '){return board[1][i];}}//判断对角线if (board[0][0]==board[1][1]&& board[1][1]== board[2][2] &&board[1][1] !=' '){return board[1][1];}if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[1][1];}//判断平局if (1==is_full(board, row, col)){return'Q';}return 'C';//继续
}