相信大家都玩过五子棋吧,今天我来写一个简易版的三子棋,第一次写超过200行的代码,是自己的一个进步,这算是我的第一个小项目了。
写三子棋首先要有一个简单的思路:
1. 要有棋盘,初始化棋盘,显示棋盘
2. 该下棋了,人和电脑进行对战,那就需要两个函数,分别是人下棋的函数和电脑下棋的函数。
3. 下完棋之后,每一步都要判断输赢。
我们先来看一下运行结果:
O---------玩家
X---------电脑
![](https://i-blog.csdnimg.cn/blog_migrate/f9166655b054dc74eaeff2ac37da2849.png)
![](https://i-blog.csdnimg.cn/blog_migrate/eaaf770b4467550c438985be349e0d9b.png)
首先,打印一个菜单供玩家选择int menu( ),当玩家选择玩游戏时,进入游戏函数 game( )。
进入游戏之后,进行初始化棋盘InitBoard(board, ROW, COL)
初始化完成之后,需要下棋,由电脑和玩家进行对战,ComputerMove(board, ROW, COL),电脑和玩家每一次下完棋都要进行判断是否已经赢了。下列为头文件:
#define ROW 3
#define COL 3
#ifndef __三子棋__H__
#define __三子棋__H__
//初始化
void InitBoard(char arr[ROW][COL], int row, int col);
//显示棋盘
void DisplayBoard(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 __三子棋__H__
以下是测试函数功能是否编写正确的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include "三子棋.h"
int menu(void)
{
int choose;
printf("********************\n");
printf(" 0.退出 \n");
printf(" 1.玩游戏 \n");
printf("********************\n");
printf("choose:");
scanf("%d", &choose);
return choose;
}
void game(void)
{
char ret = 0;
char board[ROW][COL];
InitBoard(board, ROW, COL);//初始化面板
do{
ComputerMove(board, ROW, COL); //电脑下棋
DisplayBoard(board, ROW, COL);//显示棋盘
ret = IsWin(board, ROW, COL);//判断输赢
if (ret == 'X')
{
printf("你输了\n");
break;
}
else if (ret == 'O')
{
printf("你赢了\n");
break;
}
else if (ret == 'E')
{
printf("水平相当\n");
break;
}
PlayerMove(board, ROW, COL);
ret = IsWin(board, ROW, COL);
DisplayBoard(board, ROW, COL);
if (ret == 'X')
{
printf("你输了\n");
break;
}
else if (ret == 'O')
{
printf("你赢了\n");
break;
}
else if (ret == 'E')
{
printf("水平相当\n");
break;
}
} while (1);
}
int main()
{
int choose = 0;
int ret = 0;
srand((unsigned int)time(NULL));
do{
choose = menu();
switch (choose){
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
break;
}
} while (choose);
system("pause");
return 0;
}
接下来就是各个函数的功能实现了
#define _CRT_SECURE_NO_WARNINGS 1
#include "三子棋.h"
#include<stdio.h>
#include<stdlib.h>
void InitBoard(char arr[ROW][COL], int row, int col)//初始化一个三行三列的棋盘
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
void DisplayBoard(char arr[ROW][COL], int row, int col)//显示棋盘
{
int i = 0, j = 0;
printf("-------------\n");
for (i = 0; i < row; i++)
{
printf(" %c| %c | %c\n", arr[i][0], arr[i][1], arr[i][2]);
printf("-------------\n");
}
}
//电脑下棋
void ComputerMove(char arr[ROW][COL], int row, int col)
{
int x = 0, y = 0;
while (1)
{
x = rand() % row;//电脑下棋产生随机数,也就是随机坐标
y = rand() % col;
if (arr[x][y] == ' ')//判断为空才能下棋
{
arr[x][y] = 'X';
break;
}
}
}
//玩家下棋
void PlayerMove(char arr[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("请输入你想下的坐标(x,y):");
do{
scanf("%d,%d", &x, &y);//玩家输入坐标2,3
x--; //x-1,y-1就是棋盘的真实坐标
y--;
if ((0 <= x &&x <= 2) && (0 <= y && y <= 2))//判断坐标输入是否正确
{
if ((arr[x][y] == ' '))//输入坐标没有子才能下棋
{
arr[x][y] = 'O';
break;
}
else
{
printf("该坐标已有子不能输入,请重新输入:");
}
}
else
{
printf("输入坐标有误,请重新输入:");
}
} while (1);
}
static int Isfull(char arr[ROW][COL], int row, int col)//静态函数,只能在此源文件内使用
{ //判断棋盘是否已下满
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
return 0;
}
}
return 1;
}
//判断输赢,三横三竖或两个对角线即为赢
char IsWin(char arr[ROW][COL], int row, int col)
{
int i = 0,j = 0;
for (i = 0; i < row; i++)
{
if (((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][2] == 'X')) ||
((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[2][i] == 'X')))
return 'X';
if (((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][2] == 'O')) ||
((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[2][i] == 'O')))
return 'O';
}
if(((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == 'X')) ||
((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == 'X')))
return 'X';
if (((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == 'O')) ||
((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == 'O')))
return 'O';
if(Isfull(arr, row, col))
{
return 'E';
}
}
这就是简易版的三子棋的代码了,写完再看发现也不是特别难,就是一定要有一个清晰的思路。加油加油