@TOC
前言
所有代码详解 都在代码中
1. test.c---内容框架
#include"game.h" void menu() { printf("********************\n"); printf("***1.play 0.exit****\n"); printf("********************\n"); } void game() { char ret = 0; char board[row][col] = { 0 }; initboard(board, row, col);//初始化棋盘 displayboard(board, row, col);//打印棋盘 while (1)//使用while才可以把玩家和电脑下棋的过程多次进行 { pepplayer( board, row, col);//玩家 ret = iswin(board, row, col);//iswin用来判断是谁赢 if (ret != 'c')//c代表继续 如果ret的值不为继续 就跳出循环 { break; } displayboard(board, row, col); complayer( 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() { int input = 0; do { menu(); printf("输入数字:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("输入错误\n"); break; default: break; } } while (input); return 0; }
2. game .h---函数的声明和头文件
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> #define col 3//代表行 #define row 3//代表列 void initboard(char board[row][col], int rows, int cols);//这里参数本想都为 row 和col但是常量不能作为参数 void displayboard(char board[row][col], int rows, int cols); void pepplayer(char board[row][col], int rows, int cols); void complayer(char board[row][col], int rows, int cols); char iswin(char board[row][col], int rows, int cols);//判断谁赢
3. game .c--函数的定义
#include"game.h" void initboard(char board[row][col], int rows, int cols)//初始化 { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = ' ';//将每个都赋值成 空格 如果赋值 0会报错 } } } void displayboard(char board[row][col], int rows, int cols)//打印 { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { printf("%c ", board[i][j]);//先打印出空格 if (j < cols - 1)//最后一列没有| { printf(" |");//然后再打印 | 这里需要加一个空格 否则会发现与后面的|连接不上 } } printf("\n");//换行 if (i < rows - 1)//因为最后一行不需要--- { for (j = 0; j < rows; j++) { printf("---"); if (j < row - 1)//最后一列没有| { printf("|"); } } } printf("\n");//这里还需要空格 } } void pepplayer(char board[row][col], int rows, int cols) { int x = 0; int y = 0; while (1) { printf("请输入坐标:>");//因为要多次调用所以放在里面 scanf("%d%d", &x, &y); if (x >= 1 && x <= rows && y >= 1 && y <= cols)//范围 { if (board[x - 1][y - 1] == ' ')//输入的是从1开始的值 而数组下标是值-1 { board[x - 1][y - 1] = '*';//*代表玩家 break; } else { printf("坐标被占用\n"); } } else { printf("坐标非法\n"); } } } void complayer(char board[row][col], int rows, int cols) { while (1) { int x = rand() % row;//使用rand()%3 返回0到2 int y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#';//这里本身就从0开始所以不需要-1 break; } } } int isfull(char board[row][col], int rows, int cols)//判断棋盘是否满 若满了返回 1 { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { if (board[i][j] == ' ') { return 0; } } } return 1; } char iswin(char board[row][col], int rows, int cols) { int i = 0; for (i = 0; i < col; i++)//每一列的情况 { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')//若每一列相等时 { return board[0][i]; //返回一个值 就知道是 '*' / '#' } } for (i = 0; i< row; i++)//每一行的情况 { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')//若每一行相等时 { return board[i][0];//返回一个值 就知道是 '*' / '#' } } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') { return board[0][0];//对角线 } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ') { return board[0][2]; } if (isfull(board, row, col) == 1)//棋盘满了 { return 'Q'; } else return 'c';//以上情况都没发生 即棋盘继续执行 }