c语言算法三子棋:
开发环境:visual studio
语言:c
1:构思和想法
2:框架代码
3:功能代码
本人只是一名大二学生非科班,技术有限,代码比较乱,希望指正,这也是我第一次写博客,见谅。
1:构思和想法
本人正在学习编程ing,学了点c语言,想实践一下,而且大多数文章代码只有核心功能,没有细节上的功能比如:识别输入是否正确及过滤非正确输入、返回主菜单、电脑算法之类的,于是便想着自行写个完整的程序锻炼一下。这个项目,包含一个比较完整的游戏框架包括:菜单、输入识别与过滤非正确输入、游戏运行、返回菜单、三子棋和五子棋电脑算法等......还请大佬们指正。
2:框架代码
一、框架图:
二、mian.c
本文只有三子棋部分代码完整,五子棋部分还在开发。
#include<stdio.h>
#include "game.h"
void game3()
{
int board[ROW][COL] = { 0 },count=0,status=2;
init_board3(board, ROW, COL);
display_board3(board, ROW, COL);
while (1)
{
write3(board, ROW, COL);
display_board3(board, ROW, COL);
status = win3(board, ROW, COL);
if (status==1)
{
printf("你赢了,恭喜!\n");
break;
}
else if(status == 0)
{
printf("你输了,没事,还能再来!\n");
break;
}
if (full3(board, ROW, COL))
{
printf("平局!请重新开始游戏!\n");
break;
}
}
system("cls");
printf("\n\n");
start();
}
void game5()
{
int board[RO][CO] = { 0 };
init_board5(board, RO, CO);
display_board5(board, RO, CO);
while (1)
{
write5(board, RO, CO);
display_board5(board, RO, CO);
}
}
int main(void)
{
start();
}
三、game.h文件的函数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#define ROW 3 //宏定义棋盘长宽
#define COL 3
#define RO 5
#define CO 5
//三子棋函数-----------------------------------------------
void game3();
void init_board3(char board[ROW][COL], int row, int col);//初始化棋盘
void write3(char board[ROW][COL], int row, int col);//放置函数
int full3(char board[ROW][COL], int row, int col);//判断棋盘是否满
int defense3(char board[ROW][COL], int row, int col);//进攻函数
int attack3(char board[ROW][COL], int row, int col);//防御函数
int win3(char board[ROW][COL], int row, int col);//判断胜负函数
//共用函数-------------------------------------------------
void delay();//延迟函数
int random(int status);//随机函数
void menu();//菜单展示函数
void choose(int input);//菜单选择函数
void start();//游戏开始函数
//五子棋函数-----------------------------------------------
void game5();
void display_board5(char board[RO][CO], int row, int col);
void init_board5(char board[RO][CO], int row, int col);
void write5(char board[RO][CO], int row, int col);
四、game.c文件的函数
这一部分就是实现游戏功能,单独在下面一部分讲解。
3:功能代码
①输入过滤的实现:
识别:
scanf'正确读取一个对应类型则返回值1,正确读取两个则为2,利用返回值+if识别输入是否正确。
过滤:
用getchar()函数过滤错误输入的字母。
不过滤的话程序会陷入无限循环,这与scanf函数读取机制有关。
具体查阅:
//此处代码为片段,仅作解释作用
printf("请输入你的选择----->");
status = scanf_s("%d", &input);
while (status != 1 || input > 3 || input <= 0)//过滤错误输入
{
getchar();
printf("输入数据有错误,请重新输入正确范围数字:\n");
printf("请输入你的选择----->");
status = scanf_s("%d", &input);
}
②返回主菜单的实现:
利用start()函数
//此处代码为片段,仅作解释作用
void game3()
{
此处省略100000字的游戏代码
system("cls");
printf("\n\n");
start();
}
一、菜单函数展示和菜单选择函数
void menu()
{
printf(" 菜单\n");
printf("----1.三子棋----\n");
printf("----2.五子棋----\n");
printf("----3.退出 ----\n");
}
void choose(int input)
{
switch (input)
{
case 1:
printf("欢迎来到三子棋,祝你游戏愉快!\n\n");
game3();
break;
case 2:
printf("欢迎来到五子棋,祝你游戏愉快!\n\n");
game5();
break;
case 3:
printf("欢迎下次光临!\n");
break;
}
}
二、随机函数代码
为了适用于三子棋同时也适用于五子棋,因此用函数来产生随机数。
random(3)产生1-3的随机数字
random(5)产生1-5的随机数字
int random(int status)
{
int count=0;
srand((unsigned int)time(0));
if (status == 3)
{
while (count==0)
{
count = rand() % 4;
}
return count;
}
else if (status == 5)
{
while (count==0)
{
count = rand() % 6;
}
return count;
}
}
三、延迟函数
i=x即为x秒延迟
用于增强游戏体验
void delay()
{
int i = 5;
while (i >= 0)
{
system("cls");
printf("%d\n",i);
Sleep(1000);
i--;
}
}
四、开始游戏函数
方便游戏的开始
集合了菜单展示、选择和输入过滤功能。
方便游戏结束后,利用start()函数直接跳转到菜单,进行下一局游戏的开始。
void start()//开始游戏
{
int input = 0, status = 0;
menu();
printf("请输入你的选择----->");
status = scanf_s("%d", &input);
while (status != 1 || input > 3 || input <= 0)//过滤错误输入
{
getchar();
printf("输入数据有错误,请重新输入正确范围数字:\n");
printf("请输入你的选择----->");
status = scanf_s("%d", &input);
}
choose(input);
}
五、三子棋游戏函数
1:初始化棋盘函数
用数组存储
void init_board3( char board[ROW][COL],int row, int col)//初始化函数
{
int i=0,j=0;
for (i=0 ; i <row ;i++)
{
for (j=0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
2:可自适应棋盘打印函数
更改game.h中宏定义即可打印不同大小棋盘
将棋盘拆分为以下这几个元素:
“|” 和“---|”和“---”
然后判断什么时候打印哪个即可
判断的时候只能使用函数输入的row、col作为条件判断,才能达到更好的适用性。
void display_board3(char board[ROW][COL],int row,int col)
{
int i = 0,j=0,k=0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c", board[i][j]);
if (j < (col - 1))//判断边缘
{
printf(" |");
}
else
{
printf("\n");
}
}
if (i < (row - 1))//判断边缘
{
for (k = 0; k < (row - 1); k++)//判断边缘
{
printf("---|");
}
if ((k + 1) == row)//判断边缘
{
printf("---\n");
}
}
}
printf("\n\n");
}
3:棋盘是否满判断函数
int full3(char board[ROW][COL], int row, int col)
{
int i, j, count = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] != ' ')
{
count++;
}
}
}
if (count == row * col)
{
return 1;
}
else
{
return 0;
}
}
4:三子棋算法函数
①电脑防御函数
行列对角线判断。
中规中矩
(ps:难点在五子棋的算法
int defense3(char board[ROW][COL], int row, int col)//防御函数
{
int i = 0, k = 0, j = 0, l = 0;
//行判断
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] || board[i][1] == board[i][2])
{
if (board[i][1] == '#')
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
board[i][j] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", i+1, j+1);
return 1;
}
}
}
}
if (board[i][0] == '#' && board[i][2] == '#' && board[i][1] == ' ')
{
board[i][1] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", i + 1, 2);
return 1;
}
}
//列判断
for (k = 0; k < col; k++)
{
if (board[0][k] == board[1][k] || board[1][k] == board[2][k])
{
if (board[1][k] == '#')
{
for (l = 0; l < col; l++)
{
if (board[l][k] == ' ')
{
board[l][k] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", l + 1, k + 1);
return 1;
}
}
}
}
if (board[0][k] == '#' && board[2][k] == '#' && board[1][k] == ' ')
{
board[1][k] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", i + 1, 2);
return 1;
}
}
//对角线判断
//左对角线
if (board[0][0] == board[1][1])
{
if (board[1][1] == '#')
{
if (board[2][2] == ' ')
{
board[2][2] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 3, 3);
return 1;
}
}
}
if (board[1][1] == board[2][2])
{
if (board[1][1] == '#')
{
if (board[0][0] == ' ')
{
board[0][0] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 1, 1);
return 1;
}
}
}
if (board[0][0] == board[2][2] && board[0][0] =='#' && board[1][1] == ' ')
{
board[1][1] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 2, 2);
return 1;
}
//右对角线
if (board[2][0] == board[1][1] || board[1][1] == board[0][2])
{
if (board[1][1] == '#')
{
if (board[2][0] == ' ')
{
board[2][0] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 3, 1);
return 1;
}
if (board[0][2] == ' ')
{
board[0][2] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 3, 1);
return 1;
}
}
}
if (board[2][0] == board[0][2] && board[2][0] == '#' & board[1][1] == ' ')
{
board[1][1] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 2, 2);
return 1;
}
return 0;
}
②电脑进攻函数
Ctrl C+V防御函数然后改一下条件就可以了
int attack3(char board[ROW][COL], int row, int col)//进攻函数
{
int i = 0, k = 0, j = 0, l = 0;
//行判断
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] || board[i][1] == board[i][2])
{
if (board[i][1] == '*')
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
board[i][j] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", i + 1, j + 1);
return 1;
}
}
}
}
if (board[i][0] == '*' && board[i][2] == '*' && board[i][1] == ' ')
{
board[i][1] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", i + 1, 2);
return 1;
}
}
//列判断
for (k = 0; k < col; k++)
{
if (board[0][k] == board[1][k] || board[1][k] == board[2][k])
{
if (board[1][k] == '*')
{
for (l = 0; l < col; l++)
{
if (board[l][k] == ' ')
{
board[l][k] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", l + 1, k + 1);
return 1;
}
}
}
}
if (board[0][k] == '*' && board[2][k] == '*' && board[1][k] == ' ')
{
board[1][k] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", i + 1, 2);
return 1;
}
}
//对角线判断
//左对角线
if (board[0][0] == board[1][1])
{
if (board[1][1] == '*')
{
if (board[2][2] == ' ')
{
board[2][2] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 3, 3);
return 1;
}
}
}
if (board[1][1] == board[2][2])
{
if (board[1][1] == '*')
{
if (board[0][0] == ' ')
{
board[0][0] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 1, 1);
return 1;
}
}
}
if (board[0][0] == board[2][2] && board[0][0] == '*' && board[1][1] == ' ')
{
board[1][1] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 2, 2);
return 1;
}
//右对角线
if (board[2][0] == board[1][1] || board[1][1] == board[0][2])
{
if (board[1][1] == '*')
{
if (board[2][0] == ' ')
{
board[2][0] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 3, 1);
return 1;
}
if (board[0][2] == ' ')
{
board[0][2] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 3, 1);
return 1;
}
}
}
if (board[2][0] == board[0][2] && board[2][0] == '*' & board[1][1] == ' ')
{
board[1][1] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 2, 2);
return 1;
}
return 0;
}
5:三子棋下棋函数
void write3(char board[ROW][COL], int row, int col)//放置函数
{
int x=0, y=0, status=0;
int j=0, k=0;
//注:数组坐标记得减1
//玩家放置-------------------------------------
printf ("请输入你要放置的坐标(x,y)---->");
status = scanf_s("%d %d", &x, &y);//判断是否输入非数字
while (1)//判断输入
{
if (((x > ROW) || (y > COL)|| (x < 0) || (y < 0))||status!=2||board[x-1][y-1]!=' ')
{
getchar();//过滤非数字
printf("输入数据有错误,请重新输入:\n");
printf("请输入你要放置的坐标(x,y)---->");
status=scanf_s("%d %d", &x, &y);
}
else
{
printf("\n你放置的坐标是(%d,%d)\n", x, y);
break;
}
}
board[x-1][y-1]='#';
//电脑放置-----------------------------------
int status1 = 0, status2 = 0;
if (!full3(board, ROW, COL))//判断棋盘是否满
{
if(!(status1 = attack3(board, ROW, COL)))//判断防御/进攻函数是否生效
{
status2 = defense3(board, ROW, COL);
}
if(status2!=1)//不生效则随机放status1!=1&&
{
while (board[j - 1][k - 1] != ' ')
{
j = random(3);
k = random(3)-random(5);
while (k > 3||k<-4)
{
k = random(3) - random(5);
}
if (k < 0)
{
k = -k;
}
}
board[j - 1][k - 1] = '*';
printf("\n随机电脑放置的坐标是(%d,%d)\n\n", j, k);
}
}
}
6:三子棋判断输赢函数
int win3(char board[ROW][COL], int row, int col)//判断输赢
{
int i = 0, k = 0, j = 0, l = 0;
//行判断
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
{
if (board[i][0] == '#')
{
return 1;
}
else if (board[i][0] == '*')
{
return 0;
}
}
}
//列判断
for (k = 0; k < col; k++)
{
if (board[0][k] == board[1][k] && board[1][k] == board[2][k])
{
for (l = 0; l < col; l++)
{
if (board[0][k] == '#')
{
return 1;
}
else if (board[0][k] == '*')
{
return 0;
}
}
}
}
//对角线判断
//左对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
{
if (board[0][0] == '#')
{
return 1;
}
else if (board[0][0] == '*')
{
return 0;
}
}
//右对角线
if (board[2][0] == board[1][1] && board[1][1] == board[0][2])
{
if (board[2][0] == '#')
{
return 1;
}
else if (board[2][0] == '*')
{
return 0;
}
}
}
7:组成的game.c的内容
#include"game.h"
//共用函数-----------------------------------------------------
void delay()
{
int i = 5;
while (i >= 0)
{
system("cls");
printf("%d\n",i);
Sleep(1000);
i--;
}
}
int random(int status)
{
int count=0;
srand((unsigned int)time(0));
if (status == 3)
{
while (count==0)
{
count = rand() % 4;
}
return count;
}
else if (status == 5)
{
while (count==0)
{
count = rand() % 6;
}
return count;
}
}
void menu()
{
printf(" 菜单\n");
printf("----1.三子棋----\n");
printf("----2.五子棋----\n");
printf("----3.退出 ----\n");
}
void choose(int input)
{
switch (input)
{
case 1:
printf("欢迎来到三子棋,祝你游戏愉快!\n\n");
game3();
break;
case 2:
printf("欢迎来到五子棋,祝你游戏愉快!\n\n");
game5();
break;
case 3:
printf("欢迎下次光临!\n");
break;
}
}
void start()//开始游戏
{
int input = 0, status = 0;
menu();
printf("请输入你的选择----->");
status = scanf_s("%d", &input);
while (status != 1 || input > 3 || input <= 0)//过滤错误输入
{
getchar();
printf("输入数据有错误,请重新输入正确范围数字:\n");
printf("请输入你的选择----->");
status = scanf_s("%d", &input);
}
choose(input);
}
//三③子棋函数----------------------------------------------------
void init_board3( char board[ROW][COL],int row, int col)//初始化函数
{
int i=0,j=0;
for (i=0 ; i <row ;i++)
{
for (j=0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void display_board3(char board[ROW][COL],int row,int col)
{
int i = 0,j=0,k=0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c", board[i][j]);
if (j < (col - 1))//判断边缘
{
printf(" |");
}
else
{
printf("\n");
}
}
if (i < (row - 1))//判断边缘
{
for (k = 0; k < (row - 1); k++)//判断边缘
{
printf("---|");
}
if ((k + 1) == row)//判断边缘
{
printf("---\n");
}
}
}
printf("\n\n");
}
int full3(char board[ROW][COL], int row, int col)
{
int i, j, count = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] != ' ')
{
count++;
}
}
}
if (count == row * col)
{
return 1;
}
else
{
return 0;
}
}
int defense3(char board[ROW][COL], int row, int col)//防御函数
{
int i = 0, k = 0, j = 0, l = 0;
//行判断
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] || board[i][1] == board[i][2])
{
if (board[i][1] == '#')
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
board[i][j] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", i+1, j+1);
return 1;
}
}
}
}
if (board[i][0] == '#' && board[i][2] == '#' && board[i][1] == ' ')
{
board[i][1] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", i + 1, 2);
return 1;
}
}
//列判断
for (k = 0; k < col; k++)
{
if (board[0][k] == board[1][k] || board[1][k] == board[2][k])
{
if (board[1][k] == '#')
{
for (l = 0; l < col; l++)
{
if (board[l][k] == ' ')
{
board[l][k] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", l + 1, k + 1);
return 1;
}
}
}
}
if (board[0][k] == '#' && board[2][k] == '#' && board[1][k] == ' ')
{
board[1][k] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", i + 1, 2);
return 1;
}
}
//对角线判断
//左对角线
if (board[0][0] == board[1][1])
{
if (board[1][1] == '#')
{
if (board[2][2] == ' ')
{
board[2][2] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 3, 3);
return 1;
}
}
}
if (board[1][1] == board[2][2])
{
if (board[1][1] == '#')
{
if (board[0][0] == ' ')
{
board[0][0] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 1, 1);
return 1;
}
}
}
if (board[0][0] == board[2][2] && board[0][0] =='#' && board[1][1] == ' ')
{
board[1][1] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 2, 2);
return 1;
}
//右对角线
if (board[2][0] == board[1][1] || board[1][1] == board[0][2])
{
if (board[1][1] == '#')
{
if (board[2][0] == ' ')
{
board[2][0] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 3, 1);
return 1;
}
if (board[0][2] == ' ')
{
board[0][2] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 3, 1);
return 1;
}
}
}
if (board[2][0] == board[0][2] && board[2][0] == '#' & board[1][1] == ' ')
{
board[1][1] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 2, 2);
return 1;
}
return 0;
}
int attack3(char board[ROW][COL], int row, int col)//进攻函数
{
int i = 0, k = 0, j = 0, l = 0;
//行判断
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] || board[i][1] == board[i][2])
{
if (board[i][1] == '*')
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
board[i][j] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", i + 1, j + 1);
return 1;
}
}
}
}
if (board[i][0] == '*' && board[i][2] == '*' && board[i][1] == ' ')
{
board[i][1] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", i + 1, 2);
return 1;
}
}
//列判断
for (k = 0; k < col; k++)
{
if (board[0][k] == board[1][k] || board[1][k] == board[2][k])
{
if (board[1][k] == '*')
{
for (l = 0; l < col; l++)
{
if (board[l][k] == ' ')
{
board[l][k] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", l + 1, k + 1);
return 1;
}
}
}
}
if (board[0][k] == '*' && board[2][k] == '*' && board[1][k] == ' ')
{
board[1][k] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", i + 1, 2);
return 1;
}
}
//对角线判断
//左对角线
if (board[0][0] == board[1][1])
{
if (board[1][1] == '*')
{
if (board[2][2] == ' ')
{
board[2][2] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 3, 3);
return 1;
}
}
}
if (board[1][1] == board[2][2])
{
if (board[1][1] == '*')
{
if (board[0][0] == ' ')
{
board[0][0] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 1, 1);
return 1;
}
}
}
if (board[0][0] == board[2][2] && board[0][0] == '*' && board[1][1] == ' ')
{
board[1][1] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 2, 2);
return 1;
}
//右对角线
if (board[2][0] == board[1][1] || board[1][1] == board[0][2])
{
if (board[1][1] == '*')
{
if (board[2][0] == ' ')
{
board[2][0] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 3, 1);
return 1;
}
if (board[0][2] == ' ')
{
board[0][2] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 3, 1);
return 1;
}
}
}
if (board[2][0] == board[0][2] && board[2][0] == '*' & board[1][1] == ' ')
{
board[1][1] = '*';
printf("\n电脑放置的坐标是(%d,%d)\n\n", 2, 2);
return 1;
}
return 0;
}
void write3(char board[ROW][COL], int row, int col)//放置函数
{
int x=0, y=0, status=0;
int j=0, k=0;
//注:数组坐标记得减1
//玩家放置-------------------------------------
printf ("请输入你要放置的坐标(x,y)---->");
status = scanf_s("%d %d", &x, &y);//判断是否输入非数字
while (1)//判断输入
{
if (((x > ROW) || (y > COL)|| (x < 0) || (y < 0))||status!=2||board[x-1][y-1]!=' ')
{
getchar();//过滤非数字
printf("输入数据有错误,请重新输入:\n");
printf("请输入你要放置的坐标(x,y)---->");
status=scanf_s("%d %d", &x, &y);
}
else
{
printf("\n你放置的坐标是(%d,%d)\n", x, y);
break;
}
}
board[x-1][y-1]='#';
//电脑放置-----------------------------------
int status1 = 0, status2 = 0;
if (!full3(board, ROW, COL))//判断棋盘是否满
{
if(!(status1 = attack3(board, ROW, COL)))//判断防御/进攻函数是否生效
{
status2 = defense3(board, ROW, COL);
}
if(status2!=1)//不生效则随机放status1!=1&&
{
while (board[j - 1][k - 1] != ' ')
{
j = random(3);
k = random(3)-random(5);
while (k > 3||k<-4)
{
k = random(3) - random(5);
}
if (k < 0)
{
k = -k;
}
}
board[j - 1][k - 1] = '*';
printf("\n随机电脑放置的坐标是(%d,%d)\n\n", j, k);
}
}
}
int win3(char board[ROW][COL], int row, int col)//判断输赢
{
int i = 0, k = 0, j = 0, l = 0;
//行判断
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
{
if (board[i][0] == '#')
{
return 1;
}
else if (board[i][0] == '*')
{
return 0;
}
}
}
//列判断
for (k = 0; k < col; k++)
{
if (board[0][k] == board[1][k] && board[1][k] == board[2][k])
{
for (l = 0; l < col; l++)
{
if (board[0][k] == '#')
{
return 1;
}
else if (board[0][k] == '*')
{
return 0;
}
}
}
}
//对角线判断
//左对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
{
if (board[0][0] == '#')
{
return 1;
}
else if (board[0][0] == '*')
{
return 0;
}
}
//右对角线
if (board[2][0] == board[1][1] && board[1][1] == board[0][2])
{
if (board[2][0] == '#')
{
return 1;
}
else if (board[2][0] == '*')
{
return 0;
}
}
}
//五⑤子棋函数----------------------------------------------------
void init_board5(char board[RO][CO], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void display_board5(char board[RO][CO], int row, int col)
{
int i = 0, j = 0, k = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c", board[i][j]);
if (j < (col - 1))//判断边缘
{
printf(" |");
}
else
{
printf("\n");
}
}
if (i < (row - 1))//判断边缘
{
for (k = 0; k < (row - 1); k++)//判断边缘
{
printf("---|");
}
if ((k + 1) == row)//判断边缘
{
printf("---\n");
}
}
}
printf("\n\n");
}
void write5(char board[RO][CO], int row, int col)
{
int x = 0, y = 0, status = 0;
int j, k;
//注:数组坐标记得减1
//玩家放置-------------------------------------
printf("请输入你要放置的坐标(x,y)---->");
status = scanf_s("%d %d", &x, &y);//判断是否输入非数字
while (1)//判断输入
{
if ((x > RO) || (y > CO) || (x < 0) || (y < 0) || status != 2 || board[x - 1][y - 1] != ' ')
{
getchar();//过滤非数字
printf("输入数据有错误,请重新输入:\n");
printf("请输入你要放置的坐标(x,y)---->");
status = scanf_s("%d %d", &x, &y);
}
else
{
break;
}
}
board[x-1][y-1] = '#';
//电脑放置-----------------------------------
j = random(5);
k = random(5);
while (board[j - 1][k - 1] != ' ')
{
j = random(5);
k = random(5);
}
board[j - 1][k - 1] = '*';
}
4:main.c中三子棋功能运行逻辑函数
一、流程图
二、代码
void game3()
{
int board[ROW][COL] = { 0 },count=0,status=2;
init_board3(board, ROW, COL);
display_board3(board, ROW, COL);
while (1)
{
write3(board, ROW, COL);
display_board3(board, ROW, COL);
status = win3(board, ROW, COL);
if (status==1)
{
printf("你赢了,恭喜!\n");
break;
}
else if(status == 0)
{
printf("你输了,没事,还能再来!\n");
break;
}
if (full3(board, ROW, COL))
{
printf("平局!请重新开始游戏!\n");
break;
}
}
system("cls");
printf("\n\n");
start();
}
5:总结
作为一名新手,这次写这个项目,让我更加熟悉了c语言在实际中的应用。而且这个写起来并没有我想的那么简单。过程中很可能因为一些很低级很小的错误比如复制下来后==没改=,==用成=等等,导致bug,然后找半天。还要考虑代码的可读性,可维护性。反正就是考虑的东西会比我想的多,实际写下来会遇到问题,比我想的要困难一些。这还只是三子棋。然后我要继续完成比较难的五子棋了(主要在算法实现处)。