
一:程序要求
井字棋,类似五子棋,任意三个标记形成一条直线,则为获胜。
这个程序中,要求不仅是三乘三的井字棋,而是能够实现更多行列的井字棋。
二:文件分类
采用模块化的编程方法,将函数、主函数和头文件分开存放。
1main.c文件
用来存放主函数。
2fun.c文件
用来存放自定义函数。
3hand.h
用来存放函数的声明和define定义
三:详细代码
1main.c文件
#include "hand.h"
#define _CRT_SECURE_NO_WARNINGS 1
int main()
{
int a = 0;
int i = 0;
char arr[ROW][COL] = { 0 };
int x = 0;
int y = 0;
srand((unsigned int)time(NULL));//随机数起点
do
{
//打印菜单
menu();
//选择游戏
printf("请进行选择:>");
scanf("%d", &a);
switch (a)
{
case 1:
printf("游戏开始");
//棋盘初始化
initiBoard(arr, ROW, COL);
//打印棋盘
displayBoard(arr, ROW, COL);
while (1)
{
//玩家输入
player(arr, ROW, COL);
//判断
if (isWin(arr, ROW, COL) == '*')
{
printf("玩家胜利");
break;
}
else if(isWin(arr, ROW, COL) == '$')
{
printf("电脑胜利");
break;
}
else if (isWin(arr, ROW, COL) == 'd')
{
printf("平局");
break;
}
//电脑输入
computer(arr, ROW, COL);
//判断
if (isWin(arr, ROW, COL) == '*')
{
printf("玩家胜利");
break;
}
else if (isWin(arr, ROW, COL) == '$')
{
printf("电脑胜利");
break;
}
else if (isWin(arr, ROW, COL) == 'd')
{
printf("平局");
break;
}
}
/*games();*/
break;
case 0:
printf("游戏结束");
break;
default:
printf("输入非法,请重新输入");
break;
}
} while (a);
return 0;
}
二:fun.c文件
#include "hand.h"
//打印菜单
void menu(void)
{
printf("\n***************************\n");
printf("********1.开始游戏*********\n");
printf("********0.结束游戏*********\n");
printf("***************************\n");
}
//遍历二维数组,将所有元素全部写入空格
void initiBoard(char arr[][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < COL; i++)
{
for (j = 0; j < COL; j++)
{
arr[i][j] = ' ';
}
}
}
//打印棋盘
void displayBoard(char arr[][COL],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
printf("\n");
for (j = 0; j < col; j++)
{
printf(" %c ", arr[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
}
}
void player(char arr[][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家走\n");
printf("请输入下棋坐标\n");
scanf("%d %d", &x, &y);
if (arr[x-1][y-1] == ' ')
{
arr[x-1][y-1] = '*';
displayBoard(arr, ROW, COL);
break;
}
else
printf("输入非法,请重新输入\n");
}
}
void computer(char arr[][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑走\n");
while (1)
{
x = rand() % row;
y = rand() % row;
if (arr[x][y] == ' ')
{
arr[x][y] = '$';
displayBoard(arr, ROW, COL);
break;
}
}
}
//判断棋盘状态
int isWin(char arr[][COL], int row, int col)
{
int i = 0;
int j = 0;
int k = 0;
int t = 0;
//if胜利的条件,行、列或斜对角的棋子被任意一方占据,即为胜利
//判断行
for (i = 0; i < row; i++)
{
k = 0;
t = 0;
for (j = 0; j < col; j++)
{
if (arr[i][j] == '*')
{
k++;
if (k == col)
{
return '*';
}
else if (arr[i][j] == '$')
{
t++;
if (t == col)
{
return '$';
}
}
}
}
}
//判断列
for (j = 0; j < col; j++)
{
k = 0;
t = 0;
for (i = 0; i < row; i++)
{
if (arr[i][j] == '*')
{
k++;
if (k == row)
{
return '*';
}
}
else if (arr[i][j] == '$')
{
t++;
if (t == row)
{
return '$';
}
}
}
}
//判断左上到右下对角线
k = 0;
t = 0;
for (i = 0; i < col; i++)
{
for (j = 0; j < row; j++)
{
if (i == j&&arr[i][j]=='*')
{
k++;
if (k == row)
{
return '*';
}
}
else if (i == j && arr[i][j] == '$')
{
t++;
if (t == row)
{
return '$';
}
}
}
}
//判断左下到右上对角线
k = 0;
t = 0;
for (i = 0; i < col; i++)
{
for (j = 0; j < row; j++)
{
if (i+j==col-1&&arr[i][j] == '*')
{
k++;
if (k == row)
{
return '*';
}
}
else if (i + j == col - 1 && arr[i][j] == '$')
{
t++;
if (t == row)
{
return '$';
}
}
}
}
//else if 遍历不存在空格 平局
k = 0;
for (i = 0; i < col; i++)
{
for (j = 0; j < row; j++)
{
if (arr[i][j] != ' ')
{
k++;
if (k == row * col)
{
return 'd';
}
}
}
}
//都不是,则继续
}
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#define ROW 10
#define COL 10
void initiBoard(char arr[][COL], int row, int col);
void displayBoard(char arr[][COL], int row, int col);
void player(char arr[][COL], int row, int col);
void computer(char arr[][COL], int row, int col);
int isWin(char arr[][COL], int row, int col);
在头文件中更换ROW和COL的值,便可以改变行列数。
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#define ROW 3
#define COL 3
void initiBoard(char arr[][COL], int row, int col);
void displayBoard(char arr[][COL], int row, int col);
void player(char arr[][COL], int row, int col);
void computer(char arr[][COL], int row, int col);
int isWin(char arr[][COL], int row, int col);
四:总结
1在判断胜利的条件上,写的太冗余,代码可继续优化。
2自定义函数可进一步分成更细的.c文件,方便调用。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)