一、前言
三子棋大家应该都玩过,三个棋子连在一起就获胜。规则这里就不多介绍,下文就是用c语言来实现三子棋
二、思路分析
利用一个头文件包含所有库函数所要包含的文件和对函数的声明。在main函数里来操控游戏的进程,包含所有的自定义函数。由于棋盘是二维的,所以要创建一个二维数组“Chequer[ROW][COL]”来存储棋子;ROW是棋盘的行数,COL是棋盘的列数。Is_Win来判断输赢。
三、代码实现
1、main主函数
首先打印游戏界面
printf("*******************************\n");
printf("****** 1、开始游戏 *******\n");
printf("****** 2、退出 *******\n");
printf("*******************************\n");
如果选择1,则开始游戏循环。在游戏循环前初始化棋盘,然后打印棋盘。在循环体内用player函数代表玩家下棋,computer函数代表电脑下棋,在每次下棋后判断输赢
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int main()
{
srand(time(NULL));
char Win='P';
int re = 0;
char Chequer[ROW][COL];
while (1)
{
int a = 0;
printf("*******************************\n");
printf("****** 1、开始游戏 *******\n");
printf("****** 2、退出 *******\n");
printf("*******************************\n");
scanf("%d", &a);
if (a == 2)
break;
Init(Chequer, ROW, COL);//初始化棋盘
print_board(Chequer, ROW, COL);
while (1)
{
player(Chequer, ROW, COL);
print_board(Chequer, ROW, COL);
Win = Is_Win(Chequer, ROW, COL);
re = Print_Win(Win);
if (re == 1)
break;
computer(Chequer, ROW, COL);
print_board(Chequer, ROW, COL);
Win = Is_Win(Chequer, ROW, COL);
re = Print_Win(Win);
if (re == 1)
break;
}
}
return 0;
}
2、初始化棋盘
在函数体内用循环赋值,把每个数组初始化为空格
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Init(char Chequer[ROW][COL], int row, int col)
{
for (int n = 0; n < row; n++)
{
for(int m=0; m < col; m++)
{
Chequer[n][m] = ' ';
}
}
}
3、打印棋盘
横着打印,每一个位置循环打印
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void print_board(char Chequer[ROW][COL], int row, int col)
{
for (int n = 0; n < row; n++)//打印列,控制行
{
for (int m = 0; m < col; m++)//打印行,控制列
{
printf(" %c ", Chequer[n][m]);
if (m < col - 1)
{
printf("|");
}
}
printf("\n");
if (n < row - 1)
printf("---|---|---\n");
}
}
打印效果是这样的:
4、玩家下棋
用r来代表行,c来代表列
int r = 0;//行
int c = 0;//列
输入一个行列代表下棋的位置,并判断下棋的位置是否合法
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void player(char Chequer[ROW][COL], int row, int col)
{
int r = 0;//行
int c = 0;//列
printf("玩家下棋:>\n");
while (1)
{
scanf("%d %d", &r, &c);
if (Chequer[r-1][c-1] == ' ' && r-1<row && c-1<col)
{
Chequer[r-1][c-1] = '*';
break;
}
else
printf("请重新下棋\n");
}
}
5、电脑下棋
用rand生成随机的位置,如果位置非法则重新生成
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void computer(char Chequer[ROW][COL], int row, int col)
{
int r = 0;//行
int c = 0;//列
printf("电脑下棋:>\n");
Sleep(3000);
while (1)
{
r = rand() % row;
c = rand() % col;
if (Chequer[r][c] == ' ' && r < row && c < col)
{
Chequer[r][c] = '#';
break;
}
}
}
6、判断输赢
连续三个同样的棋就算赢
横三和竖三:
for (int n=0; n < row; n++)//某一放赢
{
if (Chequer[n][0] == Chequer[n][1] && Chequer[n][1] == Chequer[n][2] && Chequer[n][0] == Chequer[n][2] && Chequer[n][2]!=' ')
return Chequer[n][0];
}
for (int m = 0; m < col; m++)//某一放赢
{
if (Chequer[0][m] == Chequer[1][m] && Chequer[1][m] == Chequer[2][m] && Chequer[0][m]== Chequer[2][m] && Chequer[2][m] != ' ')
return Chequer[0][m];
}
斜着三个:
if (Chequer[0][0] == Chequer[1][1] && Chequer[1][1] == Chequer[2][2] && Chequer[0][0] == Chequer[2][2] && Chequer[2][2] != ' ')//某一放赢
return Chequer[1][1];
if (Chequer[0][2] == Chequer[1][1] && Chequer[1][1] == Chequer[2][0] && Chequer[0][2] == Chequer[2][0] && Chequer[2][0] != ' ')//某一放赢
return Chequer[1][1];
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
char Is_Win(char Chequer[ROW][COL], int row, int col)
{
for (int n=0; n < row; n++)//某一放赢
{
if (Chequer[n][0] == Chequer[n][1] && Chequer[n][1] == Chequer[n][2] && Chequer[n][0] == Chequer[n][2] && Chequer[n][2]!=' ')
return Chequer[n][0];
}
for (int m = 0; m < col; m++)//某一放赢
{
if (Chequer[0][m] == Chequer[1][m] && Chequer[1][m] == Chequer[2][m] && Chequer[0][m]== Chequer[2][m] && Chequer[2][m] != ' ')
return Chequer[0][m];
}
if (Chequer[0][0] == Chequer[1][1] && Chequer[1][1] == Chequer[2][2] && Chequer[0][0] == Chequer[2][2] && Chequer[2][2] != ' ')//某一放赢
return Chequer[1][1];
if (Chequer[0][2] == Chequer[1][1] && Chequer[1][1] == Chequer[2][0] && Chequer[0][2] == Chequer[2][0] && Chequer[2][0] != ' ')//某一放赢
return Chequer[1][1];
for (int n = 0; n < row; n++)
{
for (int m = 0; m < col; m++)
{
if (Chequer[n][m] == ' ')
return 'Q';//还未分出胜负
}
}
return 'W';//平局
}
7、打印输赢
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int Print_Win(char Win)
{
switch (Win)
{
case '*':
printf("你赢了\n");
return 1;
break;
case '#':
printf("你输了\n");
return 1;
break;
case 'W':
printf("平局\n");
return 1;
break;
case 'Q':
return 0;
break;
default:
printf("错误");
}
}
四、全部代码
1、game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int main()
{
srand(time(NULL));
char Win='P';
int re = 0;
char Chequer[ROW][COL];
while (1)
{
int a = 0;
printf("*******************************\n");
printf("****** 1、开始游戏 *******\n");
printf("****** 2、退出 *******\n");
printf("*******************************\n");
scanf("%d", &a);
if (a == 2)
break;
Init(Chequer, ROW, COL);//初始化棋盘
print_board(Chequer, ROW, COL);
while (1)
{
player(Chequer, ROW, COL);
print_board(Chequer, ROW, COL);
Win = Is_Win(Chequer, ROW, COL);
re = Print_Win(Win);
if (re == 1)
break;
computer(Chequer, ROW, COL);
print_board(Chequer, ROW, COL);
Win = Is_Win(Chequer, ROW, COL);
re = Print_Win(Win);
if (re == 1)
break;
}
}
return 0;
}
2、game.h
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<stdio.h>
#include<time.h>
#include<windows.h>
void Init(char Chequer[ROW][COL], int row, int col);
void print_board(char Chequer[ROW][COL], int row, int col);
void player(char Chequer[ROW][COL], int row, int col);
void computer(char Chequer[ROW][COL], int row, int col);
char Is_Win(char Chequer[ROW][COL], int row, int col);
int Print_Win(char Win);
3、Init.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Init(char Chequer[ROW][COL], int row, int col)
{
for (int n = 0; n < row; n++)
{
for(int m=0; m < col; m++)
{
Chequer[n][m] = ' ';
}
}
}
4、print_board.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void print_board(char Chequer[ROW][COL], int row, int col)
{
for (int n = 0; n < row; n++)//打印列,控制行
{
for (int m = 0; m < col; m++)//打印行,控制列
{
printf(" %c ", Chequer[n][m]);
if (m < col - 1)
{
printf("|");
}
}
printf("\n");
if (n < row - 1)
printf("---|---|---\n");
}
}
5、player.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void player(char Chequer[ROW][COL], int row, int col)
{
int r = 0;//行
int c = 0;//列
printf("玩家下棋:>\n");
while (1)
{
scanf("%d %d", &r, &c);
if (Chequer[r-1][c-1] == ' ' && r-1<row && c-1<col)
{
Chequer[r-1][c-1] = '*';
break;
}
else
printf("请重新下棋\n");
}
}
6、computer.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void computer(char Chequer[ROW][COL], int row, int col)
{
int r = 0;//行
int c = 0;//列
printf("电脑下棋:>\n");
Sleep(3000);
while (1)
{
r = rand() % row;
c = rand() % col;
if (Chequer[r][c] == ' ' && r < row && c < col)
{
Chequer[r][c] = '#';
break;
}
}
}
7、Is_Win.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
char Is_Win(char Chequer[ROW][COL], int row, int col)
{
for (int n=0; n < row; n++)//某一放赢
{
if (Chequer[n][0] == Chequer[n][1] && Chequer[n][1] == Chequer[n][2] && Chequer[n][0] == Chequer[n][2] && Chequer[n][2]!=' ')
return Chequer[n][0];
}
for (int m = 0; m < col; m++)//某一放赢
{
if (Chequer[0][m] == Chequer[1][m] && Chequer[1][m] == Chequer[2][m] && Chequer[0][m]== Chequer[2][m] && Chequer[2][m] != ' ')
return Chequer[0][m];
}
if (Chequer[0][0] == Chequer[1][1] && Chequer[1][1] == Chequer[2][2] && Chequer[0][0] == Chequer[2][2] && Chequer[2][2] != ' ')//某一放赢
return Chequer[1][1];
if (Chequer[0][2] == Chequer[1][1] && Chequer[1][1] == Chequer[2][0] && Chequer[0][2] == Chequer[2][0] && Chequer[2][0] != ' ')//某一放赢
return Chequer[1][1];
for (int n = 0; n < row; n++)
{
for (int m = 0; m < col; m++)
{
if (Chequer[n][m] == ' ')
return 'Q';//还未分出胜负
}
}
return 'W';//平局
}
8、Print_Win.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int Print_Win(char Win)
{
switch (Win)
{
case '*':
printf("你赢了\n");
return 1;
break;
case '#':
printf("你输了\n");
return 1;
break;
case 'W':
printf("平局\n");
return 1;
break;
case 'Q':
return 0;
break;
default:
printf("错误");
}
}