最近学C语言,刚好到了三子棋这里,这里就把一些学习体会和自己敲的代码分享一下。
第一步,先写主函数,放在test.c文件中。
这里提示一下,要把所有的头文件导入,我这里就先把game.h的头文件也导入。
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include"game.h"
#include"add.h"
//三子棋//
void menu()
{
printf("**************************\n");
printf("***1.play**0.exit*********\n");
printf("**************************\n");
}
void game()
{
char board[ROW][COL]={0};//希望棋盘是空格
InitBoard(board,ROW,COL);
DisplayBoard(board,ROW,COL);
// PlayerMove(board,ROW,COL);
// DisplayBoard(board,ROW,COL);
// ComputerMove(board,ROW,COL);
// DisplayBoard(board,ROW,COL);
while (1)
{
/* code */PlayerMove(board,ROW,COL);
char ret=IsWin(board,ROW,COL);
if(ret!='C'){
break;
}
DisplayBoard(board,ROW,COL);
ComputerMove(board,ROW,COL);
ret=IsWin(board,ROW,COL);
if(ret!='C'){
break;
}
DisplayBoard(board,ROW,COL);
if(ret=='*')
{
printf("玩家赢\n");
}else if(ret='#')
{
printf("电脑赢\n");
}else{
printf("平局\n");
}
DisplayBoard(board,ROW,COL);
}
}
void test()
{
srand((unsigned int)time(NULL));//设置随机数的生成起点
int input =0;
do
{
/* code */menu();
printf("请选择:");
scanf("%d",&input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (/* condition */input);
}
int main()
{
test();
}
第二步,就是写game.h的头文件。
我在头文件中将ROW和COL定未3,但可以只根据自己的需要更改ROW和COL的大小,而不需要修改其他地方的代码。
注意,我这里是在头文件导入了game.c文件。我用的是vscode,用正常Visual studio的方式(在game.c引用game.h文件会出现,未定义等情况详情参考我另外一篇博客:(53条消息) VScode编译自定义头文件和函数时,出现未定义_刚学C语言没多久的博客-CSDN博客)
#define ROW 3
#define COL 3
#include "game.c"
#include<stdio.h>
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 IsWin(char board[ROW][COL],int row,int col);
第三步,就是编写game.c文件的具体函数。
在void DisplayBoard(char board[ROW][COL],int row,int col)函数中,我一直不能理解
以3*3的棋盘为例,如果第一个打印的是“ | | |”,第二行打印的是“---|---|---”,按照最终打印的效果来看,是打印了五行。但我是只有一个3*3的数组来存放啊所以我一直没搞明白。如果有理解这里的细节的老哥,可以指点一下小弟。
void InitBoard(char board[ROW][COL],int row,int col)
{
int i=0;
int j=0;
for ( i = 0; i < row; i++)
{
/* code */for ( j= 0; j < col; j++)
{
/* code */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++)
{
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("---|---|----\n");
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("请输入坐标>\n");
/* code */scanf("%d %d",&x,&y);
if(x>=1 &&x<=row&&y>=1&&y<=col)
{
/* code */if (board[x-1][y-1]==' ')
{
/* code */board[x-1][y-1]='*';
break;
}else
{
printf("坐标被占用,不能下棋,请选择其他位置\n");
}
}else
{
printf("坐标非法,请重新输入>\n");
}
}
}
void ComputerMove(char board[ROW][COL],int row,int col)
{
printf("电脑下棋\n");
int x =0;
int y=0;
while (1)
{
/* code */x=rand()%row;
y=rand()%col;
if(board[x-1][y-1]==' ')
{
board[x-1][y-1]='#';
break;
}
}
}
int IsFull(char board[ROW][COL],int row,int col)//满了返回1
{
int i=0;
int j=0;
for ( i = 0; i < row; i++)
{
/* code */for ( j = 0; j < col; j++)
{
/* code */if (board[i][j]==' ')
{
/* code */return 0;
}
}
}
return 1;
}
char IsWin(char board[ROW][COL],int row,int col)
{
int i=0;
int j=0;
for ( i = 0; i < row; i++)
{
/* code */if(board[i][0]==board[i][1]&&board[i][2]==board[i][1]&&board[i][1]!=' ')
{
return board[i][1];
}
}
for ( i = 0; j < col; j++)
{
/* code */if(board[0][j]==board[1][j]&&board[2][j]==board[1][j]&&board[1][j]!=' ')
{
return board[1][j];
}
}
if (board[1][1]==board[0][0]&&board[1][1]==board[2][2]&&board[1][1]!=' ')
{
/* code */return board[1][1];
}
if (board[0][2]==board[1][1]&&board[1][1]==board[2][0]&&board[1][1]!=' ')
{
/* code */return board[1][1];
}
if (IsFull(board,row,col))
{
/* code */return 'Q';
}
return 'C';
}