三字棋的实现方法
要想完成三字棋就必须先打印出三字棋的棋盘,我们可以用一个二维数组来实现,我们可以写一个Print_board函数去实现这个棋盘的打印
void Print_board(char arr[Row][Col], int row, int col) //打印棋盘
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", arr[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
for (j = 0; j < col; j++)
{
if (i < row - 1)
printf("___");
else
printf(" ");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
既然是一个小游戏就得有目录去让玩家选择,提示玩家游戏的进度,而且这个目录必须要出现一次以上,所以考虑用do…while循环体来实现,只要玩家不退出就可以一直进行游戏,我们也封装一个函数来实现,以便于主函数的便捷性
void menu1()
{
printf("**********************\n");
printf("******** 1.play ******\n");
printf("******** 0.exit*******\n");
printf("**********************\n");
}
do
{
menu1();
printf("请输入:");
scanf("%d", &input1);
switch (input1)
{
case 0:
printf("退出游戏!\n");
break;
case 1:
printf("开始游戏!\n");
{
game();
break;
}
default:
printf("输入错误,请规范输入!\n");
}
} while (input1);
}
这样就很好的完成了游戏的感觉。
接下来我们就要开始进行下棋的过程,无外乎电脑的移动和人的移动,要注意每一步人或者电脑的移动都要判断是否有结果,用Player_move和Computer_move两个函数来表示人和电脑的结果,其中有调用Is_win来判断游戏的结果以及进程,以下分别是三个函数。
void Player_move(char arr[Row][Col],int row,int col)
{
int x = 0;
int y = 0;
printf("请玩家输入坐标:");
scanf("%d%d", &x, &y);
while (1)
{
if (((x<row+1) && (x>0)) && ((y<col+1) && (y>0)))
{
if (arr[x - 1][y - 1] = ' ')
{
arr[x - 1][y - 1] = 'O';
break;
}
else
{
printf("此坐标已有元素,请重新选择!");
scanf("%d%d", &x, &y);
}
}
else
{
printf("选择失效,请重新选择!");
scanf("%d%d", &x, &y);
}
}
printf("\n");
Is_win(arr,row,col); //判断输赢
}
void Computer_move(char arr[Row][Col],int row,int col)
{
srand((unsigned int)time(NULL));
while (1)
{
int x = rand() % 4;
int y = rand() % 4;
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = 'X';
break;
}
}
Is_win(arr, row, col); //判断输赢
}
char Is_win(char arr[Row][Col], int row, int col) //判断输赢
{
int i, j;
int count = 0;
for (i = 0; i < row; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ') //行相等
return arr[i][1];
if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ') //列相等
return arr[1][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];
}
for (i = 0; i < row; i++)//平局
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == 'O' || arr[i][j] == 'X') //遍历数组,查看是否还有没有走的地方
{
count++;
if (count == 9)
return 'Q';
}
}
}
}
其实这样也差不多完成了我们三字棋的功能,详细代码分为三个部分:game.h,game.c和test.c,具体代码如下,
game.h
#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
#define Row 3
#define Col 3
void menu1();
void Init_board(char arr[Row][Col],int row,int col);
void Print_board(char arr[Row][Col],int row,int col);
void Player_move(char arr[Row][Col], int row, int col);
void Computer_move(char arr[Row][Col], int row, int col);
char Is_win(char arr[Row][Col], int row, int col);
#endif //__GAME_H__
game.c
#include"game.h"
void menu1()
{
printf("**********************\n");
printf("******** 1.play ******\n");
printf("******** 0.exit*******\n");
printf("**********************\n");
}
void game()
{
char arr[Row][Col] = { 0 };
Init_board(arr, Row, Col);
Print_board(arr, Row, Col);
printf("\n");
while (1)
{
Player_move(arr, Row, Col);
Print_board(arr, Row, Col);
char ret = Is_win(arr, Row, Col);
Computer_move(arr, Row, Col);
Print_board(arr, Row, Col);
ret = Is_win(arr, Row, Col);
if (ret == 'X')
{
printf("电脑赢!");
break;
}
else if (ret == 'O')
{
printf("玩家赢!");
break;
}
else if (ret == 'Q')
{
printf("平局");
break;
}
}
printf("\n");
}
void Init_board(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 Print_board(char arr[Row][Col], int row, int col) //打印棋盘
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", arr[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
for (j = 0; j < col; j++)
{
if (i < row - 1)
printf("___");
else
printf(" ");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
void Player_move(char arr[Row][Col],int row,int col)
{
int x = 0;
int y = 0;
printf("请玩家输入坐标:");
scanf("%d%d", &x, &y);
while (1)
{
if (((x<row+1) && (x>0)) && ((y<col+1) && (y>0)))
{
if (arr[x - 1][y - 1] = ' ')
{
arr[x - 1][y - 1] = 'O';
//Print_board(arr,row,col);
break;
}
else
{
printf("此坐标已有元素,请重新选择!");
scanf("%d%d", &x, &y);
}
}
else
{
printf("选择失效,请重新选择!");
scanf("%d%d", &x, &y);
}
}
printf("\n");
Is_win(arr,row,col); //判断输赢
}
void Computer_move(char arr[Row][Col],int row,int col)
{
srand((unsigned int)time(NULL));
while (1)
{
int x = rand() % 4;
int y = rand() % 4;
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = 'X';
break;
}
}
Is_win(arr, row, col); //判断输赢
}
char Is_win(char arr[Row][Col], int row, int col) //判断输赢
{
int i, j;
int count = 0;
for (i = 0; i < row; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ') //行相等
return arr[i][1];
if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ') //列相等
return arr[1][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];
}
for (i = 0; i < row; i++)//平局
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == 'O' || arr[i][j] == 'X') //遍历数组,查看是否还有没有走的地方
{
count++;
if (count == 9)
return 'Q';
}
}
}
}
test.c
#include "game.h"
void test()
{
int input1 = 0;
int input2 = 0;
do
{
menu1();
printf("请输入:");
scanf("%d", &input1);
switch (input1)
{
case 0:
printf("退出游戏!\n");
break;
case 1:
printf("开始游戏!\n");
{
game();
break;
}
default:
printf("输入错误,请规范输入!\n");
}
} while (input1);
}
int main()
{
test();
return 0;
}
程序运行结果如下
这样就完成了一个简易的三子棋程序!