要完成三子棋我们可以分为以下几步:
1.用什么来实现三子棋的棋盘??
2.如何将三子棋的棋盘打印出来??
3.如何实现玩家和电脑的每一步棋??
4.如何检测哪一方的输赢??
5.打印菜单
1.要实现三子棋的棋盘我们可以用一个二维数组来实现
char board[ROW][COL] = { 0 };
2.打印棋盘:
由上图我们可以看出,我们可以将棋盘分为三组,前两组都是(---)和(|)的组合,最后一组只需去掉(---)就可以实现棋盘的打印,实现的代码:
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row ; i++)
{
//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
for (j = 0; j < col; j++)
{
printf(" %c ", board[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("|");
}
printf("\n");
}
}
3.实现玩家出棋:(A)
(1.)在出棋时我们必须考虑两种情况:
a.棋子是否出界
b.棋子是否重复已经有的位置
(2.)玩家出棋的思维和程序员不一样必须考虑到是从下标1开始而不是0
实现电脑出棋:(B)
(1.)电脑出棋必须是随机的(这里我们用rand函数来实现)
srand((unsigned int)time(NULL));
(2.)在出棋时我们必须考虑两种情况:
a.棋子是否出界
b.棋子是否重复已经有的位置
//玩家走
void PlayerMove(char board[ROW][COL], int row, int col)
{
int X = 0;
int Y = 0;
printf("玩家走:\n");
while (1)
{
printf("请输入坐标:");
scanf_s("%d%d", &X, &Y);
if (X >= 1 && X <= row&&Y >= 1 && Y <= col)
{
if (board[X-1][Y-1] == ' ')
{
board[X-1][Y-1] = 'A';
break;
}
else
{
printf("坐标已经被占用!!\n");
}
}
else
{
printf("坐标非法!!\n");
}
}
}
//电脑走
void ComputerMove(char board[ROW][COL], int row, int col)
{
int X = 0;
int Y = 0;
printf("电脑走:\n");
while (1)
{
X = rand() % row;
Y = rand() % col;
if (board[X][Y] == ' ')
{
board[X][Y] = 'B';
break;
}
}
}
4.检测输赢有三种情况:
(1.)任意一行是相同且不为空格,则返回这一行中任意一个位置
(2.)任意一列是相同且不为空格,则返回这一列中任意一个位置
(3.)任意一条对角线上相同且不为空格,则返回相同对角线中任意一个位置
(4.)利用返回值判断谁的输赢:
a.如果返回A则玩家赢
b.如果返回B则电脑赢
c.如果返回Q则平局
d.如果返回空格则继续
//判断棋盘是不已经满了
int IsFull(char board[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 (board[i][j] == ' ')
return 0;
}
}
return 1;
}
char CheckBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
//判断横竖
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];
}
}
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
{
return board[1][j];
}
}
//判断对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
return board[0][0];
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
return board[1][1];
//判断平局返回0
if (IsFull(board,row,col))
{
return 'Q';
}
else
return ' ';
}
以下是完整的封装完的代码:
game.h
#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
enum OPTION
{
EXIT,
PLAY
};
void InitBoard(char board[ROW][COL],int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
char CheckBoard(char board[ROW][COL], int row, int col);
#endif // __GAME_H__
test.c
#include<stdio.h>
#include<string.h>
#include<Windows.h>
#include"game.h"
void game()
{
char Win = 0;
char board[ROW][COL] = { 0 };
//初始化数组
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
while (1)
{
//玩家走
PlayerMove(board,ROW,COL);
//检测输赢
Win = CheckBoard(board, ROW, COL);
DisplayBoard(board, ROW, COL);
if (Win != ' ')
break;
//电脑走
ComputerMove(board, ROW, COL);
//检测输赢
Win = CheckBoard(board, ROW, COL);
DisplayBoard(board, ROW, COL);
if (Win != ' ')
break;
}
if (Win == 'A')
{
printf("玩家赢!!!\n");
}
else if (Win == 'B')
{
printf("电脑赢!!!!\n");
}
else
{
printf("平局!!!\n");
}
}
void menu()
{
printf("******************************\n");
printf("****1.play 0.exit ****\n");
printf("******************************\n");
}
void test( )
{
int num = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择: ");
scanf_s("%d", &num);
switch(num)
{
case PLAY:
game();
break;
case EXIT:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while(num);
}
int main()
{
test();
system("pause");
return 0;
}
game.c
#include"game.h"
//初始化数组
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row ; i++)
{
//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
for (j = 0; j < col; j++)
{
printf(" %c ", board[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("|");
}
printf("\n");
}
}
//玩家走
void PlayerMove(char board[ROW][COL], int row, int col)
{
int X = 0;
int Y = 0;
printf("玩家走:\n");
while (1)
{
printf("请输入坐标:");
scanf_s("%d%d", &X, &Y);
if (X >= 1 && X <= row&&Y >= 1 && Y <= col)
{
if (board[X-1][Y-1] == ' ')
{
board[X-1][Y-1] = 'A';
break;
}
else
{
printf("坐标已经被占用!!\n");
}
}
else
{
printf("坐标非法!!\n");
}
}
}
//电脑走
void ComputerMove(char board[ROW][COL], int row, int col)
{
int X = 0;
int Y = 0;
printf("电脑走:\n");
while (1)
{
X = rand() % row;
Y = rand() % col;
if (board[X][Y] == ' ')
{
board[X][Y] = 'B';
break;
}
}
}
//判断棋盘是不已经满了
int IsFull(char board[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 (board[i][j] == ' ')
return 0;
}
}
return 1;
}
char CheckBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
//判断横竖
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];
}
}
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
{
return board[1][j];
}
}
//判断对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
return board[0][0];
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
return board[1][1];
//判断平局返回0
if (IsFull(board,row,col))
{
return 'Q';
}
else
return ' ';
}