想要完整地、清晰地实现三子棋的功能。必须有一个清晰地思路,再将思路转化为一个个功能不同的函数,最终实现三子棋人和电脑对战的效果。首先我先构想需要实现的功能,将这些功能封装成没一个函数,函数的具体实现在后面的过程中再具体完善。
首先我先要清楚我将要通过定义一个3*3的二维数组来完成三子棋基本功能,通过对二维数组的改变来实现三子棋的各个操作。
思路:选择菜单
1.打印棋盘;
2.玩家走;
3.判断输赢;
4.电脑走;
5.判断输赢;
代码如下:
game.h //头文件
#ifndef _GAME_H_
#define _GAME_H_
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define ROW 3 //行数
#define COL 3 //列数
void Init_board(int arr[ROW][COL],int row,int col);//初始化棋盘
void Print_board(int arr[ROW][COL],int row,int col);//打印棋盘
void Player_move(int arr[ROW][COL],int row,int col);//玩家走
void Computer_move(int arr[ROW][COL],int row,int col);//电脑走
int Check_win(int arr[ROW][COL],int row,int col);//判断输赢
#endif// _GAME_H_
game.c //游戏部分
#include "game.h"
void Init_board(int arr[ROW][COL],int row,int col)//初始化棋盘
{
int i = 0;
for(i=0;i<row;i++)
{
int j = 0;
for(j=0;j<col;j++)
{
arr[i][j]=' ';
}
}
}
void Print_board(int arr[ROW][COL],int row,int col )//打印棋盘
{
int i = 0;
for(i=0;i<row;i++)
{
printf("|%2c|%2c|%2c|\n",arr[i][0],arr[i][1],arr[i][2]);
if(i<row-1)//最后一行不打印,美观
{
printf("|--|--|--|\n");
}
}
printf("\n");
}
void Player_move(int arr[ROW][COL],int row,int col)//玩家走
{
int x = 0;
int y = 0;
while(1)
{
printf("输入坐标(x,y):");
scanf("%d%d",&x,&y);
if((x>=1)&&(x<=row)&&(y>=1)&&(y<=col))//保证坐标有效
{
if(arr[x-1][y-1]!=' ')
{
printf("输入的坐标被占用,请重新输入!\n");
}
else
{
arr[x-1][y-1]='*';//下标
break;
}
}
else
{
printf("输入的坐标无效!\n");
}
}
printf("\n");
}
void Computer_move(int arr[ROW][COL],int row,int col)//电脑走
{
int x = 0;
int y = 0;
while(1)
{
x=rand()%row;//电脑产生随机数
y=rand()%col;
if(arr[x][y]==' ')
{
arr[x][y]='X';
break;
}
}
printf("\n");
}
int Is_full(int arr[ROW][COL],int row,int col)//判断棋盘是否满格
{
int i = 0;
for(i = 0;i<row;i++)
{
int j = 0;
for(j=0;j<col;j++)
{
if(arr[i][j]==' ')
return 0;
}
}
return 1;
}
int Check_win(int arr[ROW][COL],int row,int col)//判断输赢
{
int i= 0;
for(i=0;i<row;i++)//从行判断
{
if((arr[i][0]==arr[i][1])&&
(arr[i][1]==arr[i][2])&&
arr[i][2]!=' ')
{
return arr[i][0];
}
}
for(i=0;i<col;i++)//从列判断
{
if((arr[0][i]==arr[1][i])&&
(arr[1][i]==arr[2][i])&&
arr[2][i]!=' ')
{
return arr[0][i];
}
}
//从对角线判断
if((arr[0][0]==arr[1][1])&&
(arr[1][1]==arr[2][2])&&
arr[2][2]!=' ')
{
return arr[0][0];
}
if((arr[0][2]==arr[1][1])&&
(arr[1][1]==arr[2][0])&&
arr[2][0]!=' ')
{
return arr[0][2];
}
if(Is_full(arr,row,col))
{
return 'q';
}
return ' ';
}
test.c //测试部分
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()//打印菜单
{
printf("******************************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("******************************\n");
}
void game()//开始游戏
{
int board[ROW][COL]={0};
int ret = 0;
Init_board(board,ROW,COL);//初始化棋盘
do
{
Print_board(board,ROW,COL);
printf("玩家走:");
Player_move(board,ROW,COL);
Print_board(board,ROW,COL);
ret=Check_win(board,ROW, COL);
if(ret!=' ')
break;
printf("电脑走:");
printf("\n");
Computer_move(board,ROW,COL);
Print_board(board,ROW,COL);
ret=Check_win(board,ROW, COL);
if(ret!=' ')
break;
}while(1);
if(ret=='X')
{
printf("电脑赢\n");
};
void test ()
{
int input =0;
srand=((unsigned)time(NULL));//初始化时间种子
do
{
menu();
printf("请输入->:")
scanf("%d",&input);
switch(input)
{
case 1:game();
break;
case 0:
break;
default:printf("输入错误,请重新输入!\n");
break;
}
}while(input);
}
int main()
{
test();
system("pause");
return 0;
}
结果:
总结完毕,请多指教!