个人主页:
专题分栏---小项目
目录
一、绪论
顾名思义和五子棋一样,连成3个子即为胜利。那么我们如何写呢?有什么思路呢?
首先你要是想玩,是不是需要先有一个棋盘,那么我们就需要打印棋盘;是不是还需要存数据呢?就需要用到数组;未初始化的数组存的是随机值,那么我们需要对其进行初始化;电脑下棋和玩家下棋的过程;判断是否赢了的条件。
由以上可得所需要的函数:1.打印棋盘函数、2.对棋盘进行初始化函数、3.玩家、电脑下棋函数、4.判断输赢函数
二、讲解
1.打印棋盘函数
三子棋的棋盘,怎么打印呢?第一种就是通过printf函数进行打印,第二种是用循环(找到这个棋盘重复的地方),但是要是光打印棋盘的话,怎么实现玩家下棋的时候在棋盘上实时的出现落子呢?那么我们就需要配合二维数组来进行打印:
void print(char arr[ROW][COL], int row, int col)
{
int i, j;
for (j = 0; j < col; j++)
{
//一行
i = 0;
while (i < row - 1)
{
printf(" %c |",arr[i][j]);
i++;
}
printf(" %c ", arr[i][j]);
printf("\n");
if (j < col - 1)
{
i = 0;
while (i < row - 1)
{
printf("---|");
i++;
}
printf("---");
printf("\n");
}
}
}
2.对棋盘进行初始化函数
初始化很简单,遍历赋初值即可,对于字符型二维数组而言,未初始化的时候里面存了随机值,会影响打印的棋盘,那么我们对二维数组进行赋值为‘ ’(一个空格) 即可。
void Initboard(char arr[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
arr[i][j] = ' ';
}
3.玩家、电脑下棋函数
3.1玩家下棋
把棋盘看作是一个直角坐标系,通过玩家进行输入坐标的方式来完成下棋,并在玩家下棋的位置进行展示,并且最重要的是需要判断玩家输入的坐标是否超出了棋盘,下棋的位置是否被占。
void Player_p(char arr[ROW][COL], int row, int col)
{
printf("玩家下:>\n");
int i, j;
scanf("%d%d", &i, &j);
while (i > row || i<1 || j>col || j < 1)
{
printf("坐标非法,请重输:\n");
scanf("%d%d", &i, &j);
}
while (arr[j-1][i-1] == '#'|| arr[j - 1][i - 1] == '*')
{
printf("坐标已被占用,请重新输入:\n");
scanf("%d%d", &i, &j);
}
arr[j-1][i-1] = '*';
}
3.2电脑下棋
电脑通过产生随机数的方式来产生坐标,也需要判断输入的坐标是否超出了棋盘,下棋的位置是否被占。
产生随机数的函数:srand(time(NULL)); rand();---<stdlib.h> <time.h>
(rand这一个函数就能产生随机值,但每次产生的一样,所以需要配合srand、time函数进行使用)
void Computer_p(char arr[ROW][COL], int row, int col)
{
printf("电脑下:>\n");
int i, j;
srand(time(0));
i = rand() % row ;
j = rand() % col ;
while (arr[i][j] == '*'|| arr[i][j] == '#')
{
i = rand() % row + 1;
j = rand() % col + 1;
}
arr[i][j] = '#';
}
4.判断输赢
三子棋的判断输赢的方式就是看有没有连成三个子的。三个子可以横向,可以竖向,也可以斜向,需要把每种情况均考虑清楚。
char iswin(char arr[ROW][COL], int row, int col)
{
// #电脑赢
// *玩家赢
// q平局
// c继续
if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2])
return arr[0][0];
else if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2])
return arr[0][0];
else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2])
return arr[1][0];
else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2])
return arr[2][0];
else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0])
return arr[0][2];
else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0])
return arr[0][0];
else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1])
return arr[0][1];
else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2])
return arr[0][2];
int count = 0;
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
if (arr[i][j] != ' ')
count++;
if (count < row * col)
return 'c';
else if (count == row * col)
return 'q';
}
我不会那种高深的判断方法,如果有会的,请指点指点我!
三、总代码
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void print(char arr[ROW][COL], int row, int col);
void Initboard(char arr[ROW][COL], int row, int col);
void Computer_p(char arr[ROW][COL], int row, int col);
void Player_p(char arr[ROW][COL], int row, int col);
char iswin(char arr[ROW][COL], int row, int col);
int main()
{
char arr[ROW][COL];
//初始化棋盘
Initboard(arr, ROW, COL);
//棋盘打印
print(arr, ROW, COL);
//下棋
while (1)
{
//电脑下棋#
Computer_p(arr, ROW, COL);
print(arr, ROW, COL);
//判断输赢
if (iswin(arr, ROW, COL) == '#')
{
printf("电脑赢\n");
break;
}
if (iswin(arr, ROW, COL) == 'q')
{
printf("平局\n");
break;
}
//玩家下棋*
Player_p(arr, ROW, COL);
print(arr, ROW, COL);
//判断输赢
if (iswin(arr, ROW, COL) == '*')
{
printf("玩家赢\n");
break;
}
if (iswin(arr, ROW, COL) == 'q')
{
printf("平局\n");
break;
}
}
return 0;
}
// | |
//---|---|---
// | |
//---|---|---
// | |
void print(char arr[ROW][COL], int row, int col)
{
int i, j;
for (j = 0; j < col; j++)
{
//一行
i = 0;
while (i < row - 1)
{
printf(" %c |",arr[i][j]);
i++;
}
printf(" %c ", arr[i][j]);
printf("\n");
if (j < col - 1)
{
i = 0;
while (i < row - 1)
{
printf("---|");
i++;
}
printf("---");
printf("\n");
}
}
}
void Initboard(char arr[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
arr[i][j] = ' ';
}
void Computer_p(char arr[ROW][COL], int row, int col)
{
printf("电脑下:>\n");
int i, j;
srand(time(0));
i = rand() % row ;
j = rand() % col ;
while (arr[i][j] == '*'|| arr[i][j] == '#')
{
i = rand() % row + 1;
j = rand() % col + 1;
}
arr[i][j] = '#';
}
void Player_p(char arr[ROW][COL], int row, int col)
{
printf("玩家下:>\n");
int i, j;
scanf("%d%d", &i, &j);
while (i > row || i<1 || j>col || j < 1)
{
printf("坐标非法,请重输:\n");
scanf("%d%d", &i, &j);
}
while (arr[j-1][i-1] == '#'|| arr[j - 1][i - 1] == '*')
{
printf("坐标已被占用,请重新输入:\n");
scanf("%d%d", &i, &j);
}
arr[j-1][i-1] = '*';
}
char iswin(char arr[ROW][COL], int row, int col)
{
// #电脑赢
// *玩家赢
// q平局
// c继续
if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2])
return arr[0][0];
else if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2])
return arr[0][0];
else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2])
return arr[1][0];
else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2])
return arr[2][0];
else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0])
return arr[0][2];
else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0])
return arr[0][0];
else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1])
return arr[0][1];
else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2])
return arr[0][2];
int count = 0;
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
if (arr[i][j] != ' ')
count++;
if (count < row * col)
return 'c';
else if (count == row * col)
return 'q';
}
谢谢大家支持!