提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、 本次实现的是3*3的三子棋玩法
一共有三个文件夹:
1、game.存放的是函数的实现
2、game.h存放函数声明等
3、test.c存放游戏主函数
二、先来讲讲三子棋的设计基本流程
1、创建菜单
2、创建一个二维数组
3、进行初始化
4、打印棋盘
5、利用九宫格坐标的方式进行下棋,玩家先走,用“*”代表玩家
6、接下来是电脑走,棋盘上空白坐标电脑随机匹配,用“#”代表电脑
7、实现判定输赢,“Q”代表平局
8、看看最终是玩家赢还是电脑赢
9、游戏结束,玩家可选择游戏继续或者退出游戏
三、主要设计流程
1、创建菜单
void menu()
{
printf("**************************\n");
printf("***1. play 0. exit ****\n");
printf("**************************\n");
}
2、创建二维数组
棋盘的类型是char型,三行三列。
#define ROW 3
#define COL 3
char board[ROW][COL] = {0};
3、棋盘初始化
void InitBoard(int 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++)
{
board[i][j]=' ';
}
}
}
4、打印棋盘
可把一行分为两部分进行打印,一部分是%c, |,另一部分是---就可以把一整行打印出来
void DisplayBoard(char board[ROW][COL], int row, int col)//打印棋盘
{
int i=0;
for(i=0; i<ROW; i++)
{
int j=0;
for(j=0; j<col; j++)
{
// 1、打印一行数据
printf("%c ", board[i][j]);
if(j< row-1)
printf("|");
}
pritnf("\n");
// 2、打印一份隔行
if(i< row-1)
{
for(j=0; j<col; j++)
{
printf("---");
if(j<col-1)
printf("|");
}
pritnf("\n");
}
}
}
棋盘打印结果:
5、利用九宫格坐标的方式进行下棋,玩家先走,用“*”代表玩家
- 因为有的玩家会落下棋子,所以我们要判断棋子的合法性。
- 因为玩家可能会出错所以我们要用while知道玩家输入正确才退出,记得退出加上break。
- 玩家要在棋盘上空的地方落子。
- 有些玩家他们并不知道第首数组的坐标是0 0,他们只知道输出1 1,所以我们要在玩家输出的数字减一来代表真正的位置
void PlayerMove(char board[ROW][COL], int row, int col)//玩家先走
{
int x=0;
int y=0;
printf("玩家走:>\n");
while(1)
{
printf("请输入要下的坐标:>\n");
scanf("%d%d", &x, &y);
//判断x,y坐标的合法性
if(x>=1 && x<=row &&y>=1 && y<=col)
{
if(board[x-1] | [y-1] =' ')
{
board[x-1] | [y-1] ='*';
break;
}
else
{
printf("该坐标已被占用");
}void ComputerMove(char board[ROW][COL], int row, int col)//电脑走
{
int x=0;
int y=0;
printf("电脑走:>\n");
while(1)
{
x=rand() % row;
y=rand() % col;
if(board[x][y] == '')
{
board[x][y]= 'y';
break;
}
}
}
}
else
{void ComputerMove(char board[ROW][COL], int row, int col)//电脑走
{
int x=0;
int y=0;
printf("电脑走:>\n");
while(1)
{
x=rand() % row;
y=rand() % col;
if(board[x][y] == '')
{
board[x][y]= 'y';
break;
}
}
}
printf("坐标非法,请重新输入! \n")
}
}
}
6
6、接下来是电脑走,棋盘上空白坐标电脑随机匹配,用“#”代表电脑
void ComputerMove(char board[ROW][COL], int row, int col)//电脑走
{
int x=0;
int y=0;
printf("电脑走:>\n");
while(1)
{
x=rand() % row;
y=rand() % col;
if(board[x][y] == '')
{
board[x][y]= 'y';
break;
}
}
}
7、实现判定输赢,“Q”代表平局
//判断是否平局
if(1 == IsFull(board, ROW, COL))
{
return 'Q';
}
return 'C';
}
8、看看最终是玩家赢还是电脑赢
- 判断有没有和棋
(1)通过调用IsFull函数
(2)如果数组中有元素为‘ ’,那么没满,返回0。如果全不为‘ ’,满了,返回1。
- 判定电脑玩家胜利
(1)判定所有行
(2)判定所有列
(3)判定二条对角线
//返回1,表示棋盘满了
//返回0,表示棋盘没满
int IsFull(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++)
{
if(board[i][j] =='')
{
return 0;
}
}
}
return 1; //满了
}
void IsWin(char board[ROW][COL], int row, int col)
{
int i=0;
//横三行
for(i=0; i<row; i++)
{
if(board[i][0]==board[i][1] && board[i][1]==board[i][2] && board[i][1] !='')
{
return board[i][1];
}
}
//竖三列
for(i=0; i<col; i++)
{
if(board[0][1]==board[1][i] && board[1][i]==board[2][i] && board[1][i] !='')
{
return board[1][i];
}
}
//两个对角线
if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[1][1] !='')
return board[1][1];
if(board[2][0]==board[1][1] && board[1][1] ==board[0][2] && board[1][1] !='')
return board[1][1];
四、结果
1、演示玩家赢
2、电脑赢
3、平局
五、全部代码
game.c
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void InitBoard(int 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++)
{
board[i][j]=' ';
}
}
}
void DisplayBoard(char board[ROW][COL], int row, int col)//打印棋盘
{
int i=0;
for(i=0; i<ROW; i++)
{
int j=0;
for(j=0; j<col; j++)
{
// 1、打印一行数据
printf("%c ", board[i][j]);
if(j< row-1)
printf("|");
}
pritnf("\n");
// 2、打印份隔行
if(i< row-1)
{
for(j=0; j<col; j++)
{
printf("---");
if(j<col-1)
printf("|");
}
pritnf("\n");
}
}
}
void PlayerMove(char board[ROW][COL], int row, int col)//玩家先走
{
int x=0;
int y=0;
printf("玩家走:>\n");
while(1)
{
printf("请输入要下的坐标:>\n");
scanf("%d%d", &x, &y);
//判断x,y坐标的合法性
if(x>=1 && x<=row &&y>=1 && y<=col)
{
if(board[x-1] | [y-1] =' ')
{
board[x-1] | [y-1] ='*';
break;
}
else
{
printf("该坐标已被占用");
}
}
else
{
printf("坐标非法,请重新输入! \n")
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)//电脑走
{
int x=0;
int y=0;
printf("电脑走:>\n");
while(1)
{
x=rand() % row;
y=rand() % col;
if(board[x][y] == '')
{
board[x][y]= 'y';
break;
}
}
}
//返回1,表示棋盘满了
//返回0,表示棋盘没满
int IsFull(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++)
{
if(board[i][j] =='')
{
return 0;
}
}
}
return 1; //满了
}
void IsWin(char board[ROW][COL], int row, int col)
{
int i=0;
//横三行
for(i=0; i<row; i++)
{
if(board[i][0]==board[i][1] && board[i][1]==board[i][2] && board[i][1] !='')
{
return board[i][1];
}
}
//竖三列
for(i=0; i<col; i++)
{
if(board[0][1]==board[1][i] && board[1][i]==board[2][i] && board[1][i] !='')
{
return board[1][i];
}
}
//两个对角线
if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[1][1] !='')
return board[1][1];
if(board[2][0]==board[1][1] && board[1][1] ==board[0][2] && board[1][1] !='')
return board[1][1];
//判断是否平局
if(1 == IsFull(board, ROW, COL))
{
return 'Q';
}
return 'C';
}
game.h
#define ROW 3
#define COL 3
#include <stdio.h>
#include <stdlib.h>
#include <time.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);
//告诉我们四种游戏的状态
// 玩家赢--‘*’
// 电脑赢--‘#’
// 平局--‘Q’
// 继续--‘C’
char IsWin()
test.c
#define ROW 3
#define COL 3
#include <stdio.h>
#include <stdlib.h>
#include <time.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);
//告诉我们四种游戏的状态
// 玩家赢--‘*’
// 电脑赢--‘#’
// 平局--‘Q’
// 继续--‘C’
char IsWin()
test.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu()
{
printf("**************************\n");
printf("***1. play 0. exit ****\n");
printf("**************************\n");
}
void game()
{
char ret=0;
//数组--存放玩家和电脑走出的棋盘信息
char board[ROW][COL]={0}; //全部空格
//初始化棋盘
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
//下棋
while(1)
{
//玩家下棋
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断玩家是否赢
ret = IsWin();
if (ret !='C')
{
break;
}
//电脑下棋
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断电脑是否赢
ret=IsWin();
if(ret !='C')
{
braek;
}
}
if(ret =='*')
{
printf("玩家赢\n");
}
else if (ret =='#')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
}
void test()
{
int input =0;
srand((unsigned int)time(Null));
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
printf("三子棋\n");
break;
case 2:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
}while (input);
}
int main()
{
test();
return 0;
}