声明:我把每个步骤用main函数重新写一遍,方便读者进行验证,完整程序我会放在最后。
三子棋是一个大程序,需要用函数模块化,将问题拆分成小问题解决。
三子棋的组成
1.生成棋盘
2.玩家落子 保存棋盘
3.电脑落子 保存棋盘
4.胜,负,和棋,的判断
生成棋盘
我们需要打印一个这样的棋盘
| |
___|___|___
| |
___|___|___
| |
| |
但是,要保证棋盘能落子就必须在棋盘里加入二维数组,并用空格表示二维数组,后续落子时用落子替换空格。
所以我们仔细观察棋盘可以发现第一行是 空格+二位数组+空格+”|“ 这样循环3次,最后一次不用加“|”。
第二行是 “_"+"_"+"_"+"|" 这样循环3次,最后一次不用加”|“。
棋盘的基本逻辑就这样形成了。
#include<stdio.h>
#define ROW 3 //定义常量 行数
#define COL 3 //定义常量 列数
int main()
{
int i,j;
char board[ROW][COL];
//初始化二维数组
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
board[i][j]=' ';
}
}
//打印棋盘
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("___");
if(j!=COL-1)//最后一次的限制条件
{
printf("|");
}
}
printf("\n");
}
else
{
for(j=0;j<COL;j++)
{
printf(" ");
if(j!=COL-1)//最后一次的限制条件
{
printf("|");
}
}
printf("\n");
}
}
}
玩家落子
这个就比较简单了。
#include<stdio.h>
#define ROW 3 //定义常量 行数
#define COL 3 //定义常量 列数
void display_board(char board[ROW][COL]);//打印棋盘
void player_input(char board[ROW][COL]);//玩家落子
int main()
{
int i,j;
char board[ROW][COL];
//初始化二维数组
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
board[i][j]=' ';
}
}
display_board(board);
printf("---------------------------------------------------\n");
while(1)
{
player_input(board);
}
return 0;
}
//打印棋盘
void display_board(char board[ROW][COL])
{
int i,j;
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("___");
if(j!=COL-1)
{
printf("|");
}
}
printf("\n");
}
else
{
for(j=0;j<COL;j++)
{
printf(" %c ",board[i][j]);
if(j!=COL-1)
{
printf("|");
}
}
printf("\n");
}
}
}
//玩家落子
void player_input(char board[ROW][COL])
{
int x,y;
scanf("%d %d",&x,&y);//输入坐标
board[x-1][y-1]='#';
display_board(board);//保存棋盘
printf("-------------------------------------------\n");
}
电脑落子
这里需用到随机数,第二点就是限制电脑落子,只能在空格的格子里落子。
#include<stdio.h>
#include<stdlib.h> //随机数生成
#include<time.h>
#define ROW 3 //定义常量 行数
#define COL 3 //定义常量 列数
void display_board(char board[ROW][COL]);//打印棋盘
void player_input(char board[ROW][COL]);//玩家落子
void computer_input(char board[ROW][COL]);//电脑落子
int main()
{
int i,j;
char board[ROW][COL];
//初始化二维数组
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
board[i][j]=' ';
}
}
display_board(board);
printf("---------------------------------------------------\n");
while(1)
{
player_input(board);
computer_input(board);
}
return 0;
}
//打印棋盘
void display_board(char board[ROW][COL])
{
int i,j;
srand((unsigned int)time(NULL));//随机数生成
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("___");
if(j!=COL-1)
{
printf("|");
}
}
printf("\n");
}
else
{
for(j=0;j<COL;j++)
{
printf(" ");
if(j!=COL-1)
{
printf("|");
}
}
printf("\n");
}
}
}
//玩家落子
void player_input(char board[ROW][COL])
{
int x,y;
scanf("%d %d",&x,&y);//输入坐标
board[x-1][y-1]='#';
display_board(board);//保存棋盘
printf("-------------------------------------------\n");
}
//电脑落子
void computer_input(char board[ROW][COL])
{
int x;
int y;
while(1)
{
x=rand()%ROW; //将数限制在0,1,2这三个数内
y=rand()%COL;
if(board[x][y]==' ')
{
board[x][y]='&';
display_board(board);
printf("--------------------------------------------\n");
break;
}
}
}
胜,负,和棋,的判断
胜利有三种情况:横着三个,竖着三个,斜着三个
#include<stdio.h>
#include<stdlib.h> //随机数生成
#include<time.h>
#define ROW 3 //定义常量 行数
#define COL 3 //定义常量 列数
void display_board(char board[ROW][COL]);//打印棋盘
void player_input(char board[ROW][COL]);//玩家落子
void computer_input(char board[ROW][COL]);//电脑落子
char win_game(char board[ROW][COL]);//胜负判断
int main()
{
int i,j;
char board[ROW][COL];
char re;
//初始化二维数组
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
board[i][j]=' ';
}
}
display_board(board);
printf("---------------------------------------------------\n");
while(1)
{
player_input(board);
re=win_game(board);
if(re!='q')
{
break;
}
computer_input(board);
re=win_game(board);
if(re!='q')
{
break;
}
}
if(re=='#')
{
printf("YOU WIN!!!");
}
else if(re=='&')
{
printf("YOU LOSE!");
}
else if(re=='p')
{
printf("PEASE!!");
}
return 0;
}
//打印棋盘
void display_board(char board[ROW][COL])
{
int i,j;
srand((unsigned int)time(NULL));//随机数生成
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("___");
if(j!=COL-1)
{
printf("|");
}
}
printf("\n");
}
else
{
for(j=0;j<COL;j++)
{
printf(" ");
if(j!=COL-1)
{
printf("|");
}
}
printf("\n");
}
}
}
//玩家落子
void player_input(char board[ROW][COL])
{
int x,y;
while(1)
{
scanf("%d %d",&x,&y);//输入坐标
if(board[x-1][y-1]==' ')
{
board[x-1][y-1]='#';
display_board(board);//保存棋盘
printf("-------------------------------------------\n");
break;
}
else
{
printf("请重新落子\n");
}
}
}
//电脑落子
void computer_input(char board[ROW][COL])
{
int x;
int y;
while(1)
{
x=rand()%ROW; //将数限制在0,1,2这三个数内
y=rand()%COL;
if(board[x][y]==' ')
{
board[x][y]='&';
display_board(board);
printf("--------------------------------------------\n");
break;
}
}
}
char win_game(char board[ROW][COL])
{
int i,j;
int player=0; //标志,为后面三个一样的情况做判断条件
int computer=0;
int peace=0;
//横着三个
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
if(board[i][j]=='#')
{
player++;
}
else if(board[i][j]=='&')
{
computer++;
}
}
if(player==3)
{
return '#';
}
else if(computer==3)
{
return '&';
}
player=0;//进行下一行判断
computer=0;
}
//竖着三个
for(j=0;j<COL;j++)
{
for(i=0;i<ROW;i++)
{
if(board[i][j]=='#')
{
player++;
}
else if(board[i][j]=='&')
{
computer++;
}
}
if(player==3)
{
return '#';
}
else if(computer==3)
{
return '&';
}
player=0;//进行下一行判断
computer=0;
}
//斜线"\"三个
for(i=0;i<ROW;i++)
{
if(board[i][i]=='#')
{
player++;
}
else if(board[i][i]=='&')
{
computer++;
}
if(player==3)
{
return '#';
}
else if(computer==3)
{
return '&';
}
}
player=0;//重新赋值,进行下一轮判断
computer=0;
//斜线“/ “三个
for(i=0;i<ROW;i++)
{
if(board[i][ROW-1-i]=='#')
{
player++;
}
else if(board[i][ROW-1-i]=='&')
{
computer++;
}
if(player==3)
{
return '#';
}
else if(computer==3)
{
return '&';
}
}
player=0;//重新赋值,进行下一轮判断
computer=0;
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
if(board[i][j]!=' ')
{
peace++;
}
}
}
if(peace==9)
{
return 'p';
}
return 'q';
}
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void display_board(char board[ROW][COL]);//打印棋盘
void computer_input(char board[ROW][COL]);//电脑下棋
void player_input(char board[ROW][COL]);//玩家下棋
char win_game(char board[ROW][COL]);//胜利条件
int main()
{
srand((unsigned int)time(NULL));//生成随机数
int i, j;
char re;
char board[ROW][COL];
//初始化二维数组
for (i = 0; i < ROW; i++)//二位数组的下标最好从0开始,否则会导致未定义行为或崩溃
{
for (j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
display_board(board);//为什么是传递指针而不是数组borad[ROW][COL]
printf("--------------------------------------------------------------------\n");
while (1)
{
player_input(board);
printf("--------------------------------------------------------------------\n");
re=win_game(board);
if(re!='q')
{
break;
}
computer_input(board);
printf("--------------------------------------------------------------------\n");
re=win_game(board);
if (re != 'q')
{
break;
}
}
if (re == '#')
{
printf("YOU WIN!!!");
}
else if (re == '&')
{
printf("YOU LOSE!");
}
else if(re=='p')
{
printf("PEACE!!");
}
return 0;
}
//打印棋盘
void display_board(char board[ROW][COL])
{
int i, j;
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("___");
if (j != COL - 1)
printf("|");
}
printf("\n");
}
else
{
for (j = 0; j < COL; j++)
{
if (j != COL - 1)
printf(" |");
}
printf("\n");
}
}
}
//电脑落子
void computer_input(char board[ROW][COL])
{
int x, y;
while (1)
{
x= rand() % ROW;
y = rand() % COL;
if (board[x ][y ] == ' ')
{
board[x ][y] = '&';
break;
}
}
display_board(board);
}
//玩家落子
void player_input(char board[ROW][COL])
{
int x, y;
scanf("%d %d", &x, &y);
while (1)
{
if (board[x-1][y-1] == ' ')
{
board[x-1][y-1] = '#';
break;
}
else
{
printf("请输入正确的行列数\n");
scanf("%d %d", &x, &y);
}
}
display_board(board);
}
char win_game(char board[ROW][COL])
{
int i, j;
int player = 0;
int computer = 0;
int peace = 0;
//每行的判断
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (board[i][j] == '#')
{
player++;
}
else if (board[i][j] == '&')
{
computer++;
}
}
if (player == 3)
{
return '#';
}
else if (computer == 3)
{
return '&';
}
player = 0;
computer = 0;
}
//每列的判断
for (j = 0; j < COL; j++)
{
for (i = 0; i < ROW; i++)
{
if (board[i][j] == '#')
{
player++;
}
else if (board[i][j] == '&')
{
computer++;
}
}
if (player == 3)
{
return '#';
}
else if (computer == 3)
{
return '&';
}
player = 0;
computer = 0;
}
// 斜线"\"的判断
for (i = 0; i < ROW; i++)
{
if (board[i][i] == '#')
{
player++;
}
else if (board[i][i] == '&')
{
computer++;
}
if (player == 3)
{
return '#';
}
else if (computer == 3)
{
return '&';
}
}
player = 0;
computer = 0;
//斜线"/"的判断
for (i = ROW - 1;i>=0; i--)
{
if (board[ROW-i-1][i] == '#')
{
player++;
}
else if (board[ROW-i-1][i] == '&')
{
computer++;
}
if (player == 3)
{
return '#';
}
else if (computer == 3)
{
return '&';
}
}
//和棋
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (board[i][j] != ' ')
{
peace++;
}
}
}
if (peace == ROW * COL)
{
return 'p';
}
return 'q';
}