三子棋
文件:
test.c: 测试游戏的逻辑
game.c 游戏相关函数功能的实现
game.h 关于游戏相关的函数声明,符号声明,头文件的包含
完整代码:可以直接运行
详细步骤和解析均在代码注释里
test.c: 测试游戏的逻辑
/*
该程序某部分功能只适用与三子棋
输入1开始游戏,输入0结束游戏
输入下棋的位置时按坐标形式。如:"2 3"
玩家下的棋是"*",电脑下的棋是"#"
*/
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h> //srand和rand的头文件
#include <time.h> //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 <stdio.h>
#include <stdlib.h> //srand和rand的头文件
#include <time.h> //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 %d\n", 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 %d\n", 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);
完整代码:可以直接运行
/*
该程序某部分功能只适用与三子棋
输入1开始游戏,输入0结束游戏
输入下棋的位置时按坐标形式。如:"2 3"
玩家下的棋是"*",电脑下的棋是"#"
*/
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h> //srand和rand的头文件
#include <time.h> //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 %d\n", 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 %d\n", 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 '!';
}
运行结果示例: