三子棋
文件:
test.c: 测试游戏的逻辑
game.c 游戏相关函数功能的实现
game.h 关于游戏相关的函数声明,符号声明,头文件的包含
完整代码:可以直接运行
详细步骤和解析均在代码注释里
test.c: 测试游戏的逻辑
#define _CRT_SECURE_NO_WARNINGS 1 #include#include //srand和rand的头文件 #include //time(NULL)的头文件 #include "game.h" void Menu() //菜单 { printf("************************n"); printf("*******1. 三子棋 *******n"); printf("*******0.离开游戏*******n"); printf("************************n"); } void Game() { //创建棋盘(数组) char qipan[ROW][COL]; int ret = 0; //初始化棋盘 InitQipan(qipan, ROW, COL); //打印棋盘 PrintQipan(qipan, ROW, COL); while (1) { //玩家下棋 PlayerMove(qipan, ROW, COL); PrintQipan(qipan, ROW, COL); ret = Win(qipan, ROW, COL); //判断输赢平结果 该功能只适用于三子棋 if (ret != 0) { break; } //电脑下棋 ComputerMove(qipan, ROW, COL); PrintQipan(qipan, ROW, COL); ret = Win(qipan, ROW, COL); //判断输赢平结果 该功能只适用于三子棋 if (ret != 0) { break; } } if (ret == '*') //输出结果 { printf("玩家赢了n"); } else if (ret == '#') { printf("电脑赢了n"); } else if (ret == '!') { printf("和局n"); } PrintQipan(qipan, ROW, COL); //打印棋盘 } int main() { int input = 0; srand((unsigned int)time(NULL)); //使rand()生成的数每次都是随机 do { Menu(); printf("请选择:"); scanf("%d", &input); //选择1或0 switch (input) { case 1: printf("开始游戏n"); Game(); break; case 0: printf("离开游戏n"); break; default: printf("选择错误,请重新输入n"); break; } } while (input); return 0; }
game.c 游戏相关函数功能的实现
#define _CRT_SECURE_NO_WARNINGS 1 #include#include //srand和rand的头文件 #include //time(NULL)的头文件 #include "game.h" void InitQipan(char qipan[ROW][COL], int row, int col) //初始化棋盘 { int i = 0, j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { qipan[i][j] = ' '; } } } void PrintQipan(char qipan[ROW][COL], int row, int col) //打印棋盘 { int i = 0, j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf(" %c ", qipan[i][j]); if (j < row - 1) { printf("|"); } } printf("n"); if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } printf("n"); } } } void PlayerMove(char qipan[ROW][COL], int row, int col) //玩家下棋 { int x = 0, y = 0; printf("玩家走>n"); while (1) { printf("请输入下棋的位置:"); scanf("%d %d", &x, &y); if (1 <= x && x <= row && 1 <= y && y <= col) //判断输入的位置是否在范围内 { if (qipan[x - 1][y - 1] == ' ') { qipan[x - 1][y - 1] = '*'; //玩家下棋标志 printf("玩家下棋的位置:%d %dn", x, y); break; } else { printf("此位置已被占用,请重新输入n"); } } else { printf("非法操作,请重新输入n"); } } } void ComputerMove(char qipan[ROW][COL], int row, int col) //电脑下棋 { printf("电脑走>n"); while (1) { //随机在范围内生成位置 int x = rand() % row + 1; //例如:rand() % n + m, m是初始值,n - 1 + m 是终止值, n是整数范围 int y = rand() % col + 1; //即区间[1,col],1是起始值, col + 1 - 1 是终止值,col是整数范围 if (qipan[x - 1][y - 1] == ' ') //判断是否为空位置 { qipan[x - 1][y - 1] = '#'; //电脑下棋标志 printf("电脑下棋的位置:%d %dn", x, y); break; } } } int Win(char qipan[ROW][COL], int row, int col) //判断输赢平结果 该功能只适用于三子棋 { int i = 0, j = 0; for (i = 0; i < row; i++) { if (qipan[i][0] == qipan[i][1] && qipan[i][0] == qipan[i][2] && qipan[i][0] == '*') { return '*'; } if (qipan[0][i] == qipan[1][i] && qipan[0][i] == qipan[2][i] && qipan[0][i] == '*') { return '*'; } if (qipan[i][0] == qipan[i][1] && qipan[i][0] == qipan[i][2] && qipan[i][0] == '#') { return '#'; } if (qipan[0][i] == qipan[1][i] && qipan[0][i] == qipan[2][i] && qipan[0][i] == '#') { return '#'; } } if (qipan[0][0] == qipan[1][1] && qipan[0][0] == qipan[2][2] && qipan[0][0] == '*') { return '*'; } if (qipan[0][2] == qipan[1][1] && qipan[0][2] == qipan[2][0] && qipan[0][2] == '*') { return '*'; } if (qipan[0][0] == qipan[1][1] && qipan[0][0] == qipan[2][2] && qipan[0][0] == '#') { return '#'; } if (qipan[0][2] == qipan[1][1] && qipan[0][2] == qipan[2][0] && qipan[0][2] == '#') { return '#'; } for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (qipan[i][j] == ' ') { return 0; } } } return '!'; }
game.h 关于游戏相关的函数声明,符号声明,头文件的包含
#pragma once #define ROW 3 //自定义棋盘的行数 #define COL 3 //自定义棋盘的列数 void InitQipan(char qipan[ROW][COL], int row, int col); void PrintQipan(char qipan[ROW][COL], int row, int col); void PlayerMove(char qipan[ROW][COL], int row, int col); void ComputerMove(char qipan[ROW][COL], int row, int col); int Win(char qipan[ROW][COL], int row, int col);
完整代码:可以直接运行
#define _CRT_SECURE_NO_WARNINGS 1 #include#include //srand和rand的头文件 #include //time(NULL)的头文件 #define ROW 3 //自定义棋盘的行数 #define COL 3 //自定义棋盘的列数 void InitQipan(char qipan[ROW][COL], int row, int col); void PrintQipan(char qipan[ROW][COL], int row, int col); void PlayerMove(char qipan[ROW][COL], int row, int col); void ComputerMove(char qipan[ROW][COL], int row, int col); int Win(char qipan[ROW][COL], int row, int col); void Menu() //菜单 { printf("************************n"); printf("*******1. 三子棋 *******n"); printf("*******0.离开游戏*******n"); printf("************************n"); } void Game() { //创建棋盘(数组) char qipan[ROW][COL]; int ret = 0; //初始化棋盘 InitQipan(qipan, ROW, COL); //打印棋盘 PrintQipan(qipan, ROW, COL); while (1) { //玩家下棋 PlayerMove(qipan, ROW, COL); PrintQipan(qipan, ROW, COL); ret = Win(qipan, ROW, COL); //判断输赢平结果 该功能只适用于三子棋 if (ret != 0) { break; } //电脑下棋 ComputerMove(qipan, ROW, COL); PrintQipan(qipan, ROW, COL); ret = Win(qipan, ROW, COL); //判断输赢平结果 该功能只适用于三子棋 if (ret != 0) { break; } } if (ret == '*') //输出结果 { printf("玩家赢了n"); } else if (ret == '#') { printf("电脑赢了n"); } else if (ret == '!') { printf("和局n"); } PrintQipan(qipan, ROW, COL); //打印棋盘 } int main() { int input = 0; srand((unsigned int)time(NULL)); //使rand()生成的数每次都是随机 do { Menu(); printf("请选择:"); scanf("%d", &input); //选择1或0 switch (input) { case 1: printf("开始游戏n"); Game(); break; case 0: printf("离开游戏n"); break; default: printf("选择错误,请重新输入n"); break; } } while (input); return 0; } void InitQipan(char qipan[ROW][COL], int row, int col) //初始化棋盘 { int i = 0, j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { qipan[i][j] = ' '; } } } void PrintQipan(char qipan[ROW][COL], int row, int col) //打印棋盘 { int i = 0, j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf(" %c ", qipan[i][j]); if (j < row - 1) { printf("|"); } } printf("n"); if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } printf("n"); } } } void PlayerMove(char qipan[ROW][COL], int row, int col) //玩家下棋 { int x = 0, y = 0; printf("玩家走>n"); while (1) { printf("请输入下棋的位置:"); scanf("%d %d", &x, &y); if (1 <= x && x <= row && 1 <= y && y <= col) //判断输入的位置是否在范围内 { if (qipan[x - 1][y - 1] == ' ') { qipan[x - 1][y - 1] = '*'; //玩家下棋标志 printf("玩家下棋的位置:%d %dn", x, y); break; } else { printf("此位置已被占用,请重新输入n"); } } else { printf("非法操作,请重新输入n"); } } } void ComputerMove(char qipan[ROW][COL], int row, int col) //电脑下棋 { printf("电脑走>n"); while (1) { //随机在范围内生成位置 int x = rand() % row + 1; //例如:rand() % n + m, m是初始值,n - 1 + m 是终止值, n是整数范围 int y = rand() % col + 1; //即区间[1,col],1是起始值, col + 1 - 1 是终止值,col是整数范围 if (qipan[x - 1][y - 1] == ' ') //判断是否为空位置 { qipan[x - 1][y - 1] = '#'; //电脑下棋标志 printf("电脑下棋的位置:%d %dn", x, y); break; } } } int Win(char qipan[ROW][COL], int row, int col) //判断输赢平结果 该功能只适用于三子棋 { int i = 0, j = 0; for (i = 0; i < row; i++) { if (qipan[i][0] == qipan[i][1] && qipan[i][0] == qipan[i][2] && qipan[i][0] == '*') { return '*'; } if (qipan[0][i] == qipan[1][i] && qipan[0][i] == qipan[2][i] && qipan[0][i] == '*') { return '*'; } if (qipan[i][0] == qipan[i][1] && qipan[i][0] == qipan[i][2] && qipan[i][0] == '#') { return '#'; } if (qipan[0][i] == qipan[1][i] && qipan[0][i] == qipan[2][i] && qipan[0][i] == '#') { return '#'; } } if (qipan[0][0] == qipan[1][1] && qipan[0][0] == qipan[2][2] && qipan[0][0] == '*') { return '*'; } if (qipan[0][2] == qipan[1][1] && qipan[0][2] == qipan[2][0] && qipan[0][2] == '*') { return '*'; } if (qipan[0][0] == qipan[1][1] && qipan[0][0] == qipan[2][2] && qipan[0][0] == '#') { return '#'; } if (qipan[0][2] == qipan[1][1] && qipan[0][2] == qipan[2][0] && qipan[0][2] == '#') { return '#'; } for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (qipan[i][j] == ' ') { return 0; } } } return '!'; }
运行结果示例:



