一、首先说一下具体思路:
我们首先要想到的是三子棋的棋盘是一个3*3的正方形棋盘,那么这个棋盘我们可以用一个二维数组来实现。接下来就要想到具体要怎么玩儿,首先让电脑下一个棋子走一步,然后玩家再下一个棋子走一步。电脑下棋我们要产生一些随机数,玩家下棋需要输入具体的坐标。最后就是判断输赢了:我们知道,三行三列还有两斜如果都是电脑或者玩家的棋子,那么对应的电脑或玩家获胜。如果棋盘全部被占满,还没有人获胜,那么就是平局。大概的思路就是这样。
二、再说下具体的设计过程:
1.首先我们要定义并初始化我们的三子棋棋盘:定义一个三行三列的二维数组,并将其每个元素都初始化为空格。
2.接着需要打印显示我们的棋盘。
3.然后就要实现电脑下棋的函数了:电脑下棋,需要产生一些随机数,这些随机数需要用到srand()函数和rand()函数。接着放棋子,放棋子也有条件,即只有当将要放的位置是空格时,才能放入棋子。
4.然后就是玩家下棋的函数了:玩家下棋具体实现方法是要输入一个(x,y)坐标,确定要放棋子的位置。玩家放棋子也有条件,即1必须得在这个3*3棋盘内部,2只有当将要放的位置是空格时才能放入棋子。
5.最后一步是判断输赢。三行三列两斜三行三列还有两斜如果都是电脑或者玩家的棋子,那么对应的电脑或玩家获胜。如果棋盘全部被占满,还没有人获胜,那么就是平局。我们规定如果电脑赢返回字符X,如果玩家赢返回字符O,如果是平局,就返回字符Q。
三、我们需要创建一个头文件来定义具体实现游戏需要的函数,即三子棋.h。需要一个实现游戏的源文件,即三子棋.c。需要一个用于测试的源文件,即main.c。
四、最后,将具体实现代码奉上。
三子棋.h 头文件 用于定义各个函数
#ifndef __SANZIQI__
#define __SANZIQI__
#define ROW 3
#define COL 3
//初始化棋盘
void Initboard(char arr[ROW][COL], int row, int col);
//打印棋盘
void Printboard(char arr[ROW][COL], int row, int col);
//电脑下棋
void Computermove(char arr[ROW][COL], int row, int col);
//人下棋
void Playermove(char arr[ROW][COL], int row, int col);
//判断输赢
char Iswin(char arr[ROW][COL], int row, int col);
#endif
三子棋.c 用于实现各个函数
#include"三子棋.h"
//初始化棋盘
void Initboard(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';//将棋盘初始化为全空格
}
}
}
//打印棋盘
void Printboard(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
printf("-------------\n");
for (i = 0; i < row; i++)
{
printf("|");
for (j = 0; j < col; j++)
{
printf("%2c |", arr[i][j]);
}
printf("\n-------------\n");
}
}
//电脑下棋 首先产生随机数种子 其次放入棋子,放入棋子时要判断放入的位置是否为空格,如果是则放入
void Computermove(char arr[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
do
{
int x = rand() % ROW;//产生一个随机数 行0-2 应该放入循环体内
int y = rand() % COL;//产生一个随机数 列0-2 应该放入循环体内
if (arr[x][y] == ' ')//如果要放入的位置不是空格,则表示可以放入
{
arr[x][y] = 'X';
break;
}
} while (1);
}
//人下棋 首先要判断放入棋子的位置是否在棋盘(3*3)内部,其次还要判断将要放入棋子的位置是否为空格,如果是则放入
void Playermove(char arr[ROW][COL], int row, int col)
{
int x = 0;//行
int y = 0;//列
do
{
printf("玩家下棋\n");
printf("请输入坐标(x,y):");
scanf("%d%d", &x, &y);
x -= 1;//输入的是从下标为1开始的,而程序运行的则是从下标为0开始
y -= 1;
if (((x >= 0) && (x < ROW)) && ((y >= 0) && (y < COL)))//判断是否在(3*3)棋盘内部
{
if (arr[x][y] == ' ')//判断将要放入棋子的位置是否为空格
{
arr[x][y] = 'O';
break;
}
else
{
printf("该位置已有棋子\n");
}
}
else
{
printf("跑到棋盘外面去啦\n");
}
} while (1);
}
//判断棋盘是否已满函数 因为要声明在函数内部,所以用static关键字修饰
static int Isfull(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')//如果棋盘内还有空格,返回0
{
return 0;
}
}
}
return 1;//循环完了还没有找到有空格的位置,则棋盘已满,返回1
}
//判断输赢 3行3列2斜,玩家赢或电脑赢。如果棋盘满了还没有一方赢,则为平局。
char Iswin(char arr[ROW][COL], int row, int col)
{
int i = 0;
//判断电脑赢
//三行
for (i = 0; i < row; i++)
{
if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][1] == 'X'))
{
return 'X';
}
}
//三列
for (i = 0; i < col; i++)
{
if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[1][i] == 'X'))
{
return 'X';
}
}
//2斜
if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[1][1] == 'X'))
{
return 'X';
}
if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[1][1] == 'X'))
{
return 'X';
}
//判断玩家赢
//三行
for (i = 0; i < row; i++)
{
if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][1] == 'O'))
{
return 'O';
}
}
//三列
for (i = 0; i < col; i++)
{
if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[1][i] == 'O'))
{
return 'O';
}
}
//2斜
if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[1][1] == 'O'))
{
return 'O';
}
if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[1][1] == 'O'))
{
return 'O';
}
//判断棋盘是否已满
if (Isfull(arr,row,col))
{
return 'Q';
}
return ' ';//如果以上情况全部没有满足,则返回空格
}
main.c 用于测试
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"三子棋.h"
//菜单函数
void menu()
{
printf("**************************\n");
printf("****** 1.play ********\n");
printf("****** 0.exit ********\n");
printf("**************************\n");
}
//玩游戏函数
void game(void)
{
char ret = 0;//定义判断函数返回值
char arr[ROW][COL];//初始化棋盘数组
srand((unsigned int)time(NULL));//产生一个此刻时间为初始值的随机数种子
Initboard(arr, ROW, COL);//初始化棋盘
do
{
Computermove(arr, ROW, COL);//电脑走一步
Printboard(arr, ROW, COL);//打印棋盘
ret = Iswin(arr, ROW, COL);//判断输赢
if (ret != ' ')//如果ret不是空格,则说明是其他情况(电脑赢或玩家赢或平局),此时游戏已结束,所以break跳出
{
break;
}
Playermove(arr, ROW, COL);//玩家走一步
Printboard(arr, ROW, COL);//打印棋盘
ret = Iswin(arr, ROW, COL);//判断输赢
if (ret != ' ')//如果ret不是空格,则说明是其他情况(电脑赢或玩家赢或平局),此时游戏已结束,所以break跳出
{
break;
}
} while ( 1 );
if (ret == 'X') //若返回字符X 则电脑赢
{
printf("电脑赢\n");
}
else if (ret == 'O')//若打印字符O 则玩家赢
{
printf("玩家赢\n");
}
else if (ret == 'Q')//若打印字符Q 则为平局
{
printf("平局\n");
}
}
int main()
{
int choose = 0;
do
{
menu();
printf("请选择:");
scanf("%d", &choose);
switch (choose)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (choose);
system("pause");
return 0;
}