先简单说下三子棋游戏的大致思路:
1、棋盘的初始化
2、棋盘的打印
3、玩家下子
4、电脑下子
5、判断输赢
过程如下
1、首先,该游戏代码是基于二维数组上完成的,先创建一个3*3的二维数组board[3][3],并对棋盘初始化,即二位数组里的元素都是’ ‘,数值里存放棋盘的信息,比如是否有棋子,棋子是玩家下的,亦或是电脑下的,初始化棋盘的代码如下:
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] = ' ';
}
}
}
2、对棋盘进行打印,通过循环,对棋盘进行打印,该段代码如下:
void PrintBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for(i = 0; i < row; i++)
{
if(i <= row-1)
{
printf("|----|----|----|\n");
}
printf("| %c | %c | %c |\n",board[i][0],board[i][1],board[i][2]);
}
printf("|----|----|----|\n");
}
3、玩家下子通过坐标完成,需要注意的是,输入的坐标是否符合要求,即该坐标的x和y是否都是在1到3这个闭区间范围内的整数,或者输入该坐标前,坐标内是否有了别的棋子,不符合其中一点,坐标便不符合要求,应给出相应的提示:
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x=0;
int y=0;
printf("玩家走:\n");
while(1)
{
printf("请输入你棋子的位置:");
scanf("%d%d",&x,&y);
if(x>=1 && x<=row && y>=1 && y<=3)
{
if(board[x-1][y-1]==' ')
{
board[x-1][y-1]='@';
break ;
}
else
printf("该位置已有棋子,请重新输入:");
}
else
printf("你棋子的位置错误,请重新输入:");
}
}
4、电脑下子通过rand函数和借助srand((unsigned int)time(NULL))来完成,srand((unsigned int)time(NULL))是初始化随机函数种子:
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑走:\n");
while(1)
{
int x=rand()%row;
int y=rand()%col;
if(board[x][y]==' ')
{
board[x][y]='#';
break;
}
}
}
5、判断输赢,分别对行、列、和对角线的元素是否一样进行判断,若有元素满足其中任意一个判断条件,则该元素代表的玩家(电脑)便定义为赢的一方,且结束该局游戏:
char WhoWin(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][0]!= ' ')
return board[i][0];
}
//判断列
for(j=0; j<col; j++)
{
if(board[0][j]==board[1][j] && board[1][j]==board[2][j] && board[0][j]!= ' ')
return board[0][j];
}
//判断对角线
if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[0][0]!=' ')
{
return board[0][0];
}
else if(board[0][2]==board[1][1] && board[1][1]==board[2][0] &&board[0][2]!=' ')
{
return board[0][2];
}
if(IsFull(board,ROW,COL)==1)
{
return 'D';
}
return ' ';
}
需要注意的是,每次下子都应判断棋盘是否已下满了棋子,若下满了子还分不出输赢,则为平局:
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;
}
整体代码如下(头文件game.h用于函数定义及其它函数头文件的引用,源文件test.c用于存放主函数,game.c用于存放实现游戏的函数):
game.h:
#ifndef __GAME_H__
#define __GAME_H__
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 3
#define COL 3
void InitBoard(char board[ROW][COL], int row, int col);
void PrintBoard(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 WhoWin(char board[ROW][COL], int row, int col);
#endif __GAME_H__
test.c:
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void meun()
{
printf("*******************\n");
printf("**1.play 0.exit**\n");
printf("*******************\n");
}
void game()
{
char win=' ';
char borad[ROW][COL]={0};
InitBoard(borad,ROW, COL);
PrintBoard(borad,ROW, COL);
while(1)
{
PlayerMove(borad,ROW, COL);
PrintBoard(borad,ROW, COL);
win=WhoWin(borad,ROW, COL);//玩家赢'@' 电脑赢'#' 平局'D' 继续' '
if(win != ' ')
break;
ComputerMove(borad,ROW, COL);
PrintBoard(borad,ROW, COL);
win=WhoWin(borad,ROW, COL);
if(win !=' ')
break;
}
if(win=='@')
{
printf("恭喜你,你获得了胜利\n");
/*break;*/
}
else if(win=='#')
{
printf("很可惜你输了,再接再厉哦\n");
/*break;*/
}
else if(win=='D')
{
printf("平局,再接再厉哦\n");
}
}
int main()
{
int input=0;
srand((unsigned int)time(NULL));
do
{
meun();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
return 0;
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
}while(1);
return 0;
}
game.c:
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
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;
}
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 PrintBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for(i = 0; i < row; i++)
{
if(i <= row-1)
{
printf("|----|----|----|\n");
}
printf("| %c | %c | %c |\n",board[i][0],board[i][1],board[i][2]);
}
printf("|----|----|----|\n");
}
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x=0;
int y=0;
printf("玩家走:\n");
while(1)
{
printf("请输入你棋子的位置:");
scanf("%d%d",&x,&y);
if(x>=1 && x<=row && y>=1 && y<=3)
{
if(board[x-1][y-1]==' ')
{
board[x-1][y-1]='@';
break ;
}
else
printf("该位置已有棋子,请重新输入:");
}
else
printf("你棋子的位置错误,请重新输入:");
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑走:\n");
while(1)
{
int x=rand()%row;
int y=rand()%col;
if(board[x][y]==' ')
{
board[x][y]='#';
break;
}
}
}
char WhoWin(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][0]!= ' ')
return board[i][0];
}
//判断列
for(j=0; j<col; j++)
{
if(board[0][j]==board[1][j] && board[1][j]==board[2][j] && board[0][j]!= ' ')
return board[0][j];
}
//判断对角线
if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[0][0]!=' ')
{
return board[0][0];
}
else if(board[0][2]==board[1][1] && board[1][1]==board[2][0] &&board[0][2]!=' ')
{
return board[0][2];
}
if(IsFull(board,ROW,COL)==1)
{
return 'D';
}
return ' ';
}