三子棋的实现还是比较简单的,在写代码之前,你先构建一下游戏的架构,这样写的时候思路比较清晰,不容易思想卡克,很容易就完成。再一个,你写的代码并不是孤芳自赏的,而是要拿出来给别人看,别人可以清楚地看懂你的代码,这才是好代码。
我们先来看三子棋的架构如何实现,这就看你的思维逻辑能力了。下面代码很清晰的展现了这一架构:
void game() //主游戏模块
{
char ret = 0;
char arr[ROWS][COLS] = {0}; //用二维数组来实现落子的坐标
init_chessboard(arr, ROWS, COLS); //初始化棋盘
display_chessboard(arr, ROWS, COLS); //打印棋盘
while (1) //通过while循环来实现玩家与电脑交替下棋的过程
{
player_move(arr, ROWS, COLS); //玩家下棋
display_chessboard(arr, ROWS, COLS);
ret = judge_win(arr, ROWS, COLS); //判断是否棋盘满了
if ( ret !=' ')
{
break;
}
printf("------------\n");
computer_move(arr, ROWS, COLS); //电脑下棋
display_chessboard(arr, ROWS, COLS);
ret = judge_win(arr, ROWS, COLS); //判断棋盘是否已满
if (ret != ' ')
{
break;
}
}
if ('O' == ret)
printf("恭喜你赢了!!!\\n");
else if ('X' == ret)`这里写代码片`
printf("很遗憾你输了!!!\n");
else
printf("平局\n");
}
下来我们来设计主函数。切记,主函数一定要简单,这样看上去一目了然,很有条理性。看下面主函数代码:
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); //利用rand()函数设计随机数种子
do //利用do while循环语句保证玩家可以连续玩游戏
{
print_menu(); //主菜单
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case PLAY:
game(); //主游戏模块
break;
case EXIT:
break;
default:
printf("输入错误,请重新输入!");
}
} while (input);
return 0;
}
写到这,可以说游戏已经完成了60%,剩下的就是具体功能块的实现和一些有待完善的小细节。
一, 玩家下棋
void player_move(char arr[ROWS][COLS], int rows, int cols)
{
int x = 0;
int y = 0;
while (1)
{
printf("输入你要落子的位置:");
scanf("%d%d", &x, &y);
x--;
y--;
if ((x >= 0) && (x <= rows - 1) && (y >= 0) && (y <= cols - 1))
{
if (arr[x][y] == ' ')
{
arr[x][y] = 'O';
break;
}
}
else
{
printf("输入错误,请重新输入!!!\n");
}
}
}
二, 电脑下棋
void computer_move(char arr[ROWS][COLS], int rows, int cols)
{
while (1)
{
int x = rand()%3;
int y = rand()%3;
if (arr[x][y] == ' ')
{
arr[x][y] = 'X';
break;
}
}
}
三, 判断棋盘是否已满
static int is_full(char arr[ROWS][COLS],int rows,int cols)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
if (' ' == arr[i][j])
{
return 0; //没有满,继续下
}
}
}
return 1; //满了,平局
}
char judge_win(char arr[ROWS][COLS], int rows, int cols)
{
int i = 0;
for (i = 0; i < rows; i++)
{
if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2])&&arr[i][0] != ' ')
{
return arr[i][0];
}
if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && arr[0][i] != ' ')
{
return arr[0][i];
}
}
if ((arr[0][0]) == (arr[1][1]) && (arr[1][1]) == (arr[2][2])&&arr[1][1]!=' ')
{
return arr[1][1];
}
if ((arr[0][2]) == (arr[1][1]) && (arr[1][1]) == (arr[2][0])&&arr[1][1] != ' ')
{
return arr[1][1];
}
if (is_full(arr, rows, cols))
{
return 'd'; //平局
}
else
return ' '; //没满,继续下
}
四, 初始化棋盘
void init_chessboard(char arr[ROWS][COLS],int rows,int cols)
{
//int i = 0; //方法一
//int j = 0;
//for (i = 0; i < 3; i++)
//{
// for (j = 0; j < 3; j++)
// {
// arr[i][j] = ' ';
// }
//}
memset(arr, ' ', sizeof(char)*rows*cols); //方法二,效率更高
}
五, 打印棋盘
void display_chessboard(char arr[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for (i = 0; i <= 2; i++)
{
printf(" %c | %c | %c \n", arr[i][0],arr[i][1],arr[i][2]);
if (i != ROWS - 1)
{
printf("---|---|---\n");
}
}
}
六, 菜单模块
void print_menu() //菜单函数
{
printf("-------------三子棋---------------\n");
printf("**********************************\n");
printf("* 1,开始游戏 \n");
printf("* 0,退出 \n");
printf("**********************************\n");
}
最后一点就是建立头文件对函数进行声明。代码如下:
#ifndef __CHEES_H__
#define __CHEES_H__
#define ROWS 3 //宏定义
#define COLS 3
void init_chessboard(char arr[ROWS][COLS], int rows, int cols);
void display_chessboard(char arr[ROWS][COLS], int rows, int cols);
void player_move(char arr[ROWS][COLS], int rows, int cols);
void computer_move(char arr[ROWS][COLS], int rows, int cols);
char judge_win(char arr[ROWS][COLS], int rows, int cols);
int is_full(char arr[ROWS][COLS], int rows,int cols);
#endif //__CHEES_H__
这个三子棋小游戏就完成了,是不是很简单,只要思路清晰,写出这个应该对你还是比较简单的。相信你,加油!!!