首先创建三个文本框:game.h(放在头文件内)test.c game.c(放在源文件中)
首先进行框架的搭建(放在test.c文件中)
game.h
#pragma once #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 PlayerMove(char board[ROW][COL], int row, int col);//玩家下棋 void ComputerMove(char board[ROW][COL], int row, int col);//电脑下棋 char IsWin(char board[ROW][COL], int row, int col);//判断输赢
test.c
# define _CRT_SECURE_NO_WARNINGS #include "game.h" #include<stdio.h> #include<time.h> void menu() {//简易菜单的打印 printf("*********************\n"); printf("**** 1.play *******\n"); printf("**** 0.exit********\n"); } void game() { char board[ROW][COL] = { 0 }; InitBoard(board, ROW, COL);//首先要对棋盘进行初始化 DisplayBoard(board, ROW, COL);//在初始化之后展示棋盘 while (1){ char ret = 0; PlayerMove(board, ROW, COL);//玩家下棋 ret=IsWin(board,ROW,COL);//判断输赢 if (ret != ' C ') { break; } DisplayBoard(board, ROW, COL);//在玩家下棋之后展示棋盘 ComputerMove(board, ROW, COL);//电脑下棋 ret = IsWin(board, ROW, COL);//判断输赢 if (ret != ' C ') { break; } DisplayBoard(board, ROW, COL);//在电脑下棋之后展示棋盘 if (ret != ' * ') { printf("玩家赢\n"); } else if (ret != ' # ') { printf("电脑赢\n"); } else { printf("平局\n"); } } } int main() { srand((unsigned int)(time(NULL)));//srand用于生成随机数 int input = 0; do { menu(); printf("请选择:\n"); scanf("%d", &input); switch(input){ case 1: game(); case 0: printf("退出游戏\n"); break; default: printf("选择错误\n"); break; } } while (input); return 0; }
game.c
# define _CRT_SECURE_NO_WARNINGS #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; for (i = 0; i < row; i++) { //打印数据 //printf(" %c | %c | %c ",board[i][0],board[i][1],board[i][2]); //打印分割信息 //printf("---|---|---\n"); //如果这样打印,我们就会发现每一行数据地下都有一条横杠,显然,这不是我们想要得到的结果,所以我们需要换一种方式 int j = 0; for (j = 0; j < col; j++)//我们不妨简化一下打印的过程:打印一个数据,再在他的后面加上竖杠,这样会使得程序看起来简洁不少 { printf(" %c ", board[i][j]); //最后一列不需要打印|,所以我们用if来限制条件 if (j < col - 1) printf("|"); } printf("\n"); //再打印分割信息 if (i < row - 1)//最后一行不用打印分割行 { int j = 0; for (j = 0; j < col; j++)//有多少列,打印多少对应分隔符 { printf("---"); printf("|"); } printf("\n"); } } } void PlayerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家下棋:\n"); while (1) { printf("请输入坐标:\n"); scanf("%d %d", &x, &y); //但是要注意的是:玩家输入的坐标和数组的坐标不一致,所以我们要在玩家输入坐标的基础上减去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"); } } } void ComputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; x = rand() % 3;//rand()用来生成随机值 y = rand() % 3;//0到2 while (1) {//如果被占用,重新生成坐标,只有下棋下对,才能结束循环 if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] == ' * '; break; } } } int isFull(char board[ROW][COL], int row, int col) {//如果满了 返回1 不满返回0 for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (board[i][j] == ' ') { return 0; } } } return 1; } //玩家赢 返回'#' 电脑赢 返回'*' 平局 返回'Q' 继续 返回‘C’ char IsWin(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][0] == board[i][2] && board[i][0] != ' ') { return board[i][0]; } } //列 int j = 0; for (j = 0; j < row; j++) { if (board[0][j] == board[1][j] && board[2][j] == board[0][j] && board[0][j] != ' ') { return board[0][j]; } } //斜对角线 if (board[2][2] == board[1][1] && board[1][1] == board[0][0] && 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 (isFull(board, row, col)) { return 'Q'; } return 'C';//游戏继续 } //如果没有人赢,就要判断是否平局