目录
一、游戏解剖
1、游戏简介
三子棋又称之为井字棋,横竖斜三子连成线则获胜
2,游戏实现思路
1:我们需要设计一个游戏开始菜单,玩家可以自行选择开始游戏,游戏模式,结束游戏
2:需要设计实现游戏的函数
3:设计判断输赢函数
由于代码量较多,为我们可以分为三部分写
test.c用来实现主函数
game.c用来实现游戏函数
game.h用来声明函数
二、代码实现
1、代码实现
1:程序开始
int main()
{
test();
return 0;
}
void test()
{
int choose = 0;
printf("请选择:>\n");
do
{
menu();//设计菜单
scanf_s("%d", &choose);
switch (choose)
{
case 1:
{
test1();
if (choose1 == 0)
{
menu();
break;
}
break;
}
case 2:
{
choose = 0;
break;
}
default:
{
printf("输入非法,请重新输入\n");
break;
}
}
} while (choose);
}
void test1()
{
srand((unsigned int)time(NULL));
menu1();//设计子菜单
printf("请选择模式:>\n");
do
{
scanf_s("%d", &choose1);
switch (choose1)
{
case 1:
{
game1();//设计人机对战
break;
}
case 2:
{
game2();//设计玩家对战
break;
}
case 3:
{
choose1 = 0;
break;
}
default:
{
printf("输入非法,请重新输入\n");
break;
}
}
} while (choose1);
}
2、菜单界面
1:开始游戏进入子菜单
子菜单可以选择模式
1:人机对战
2:玩家对战
3:返回上一级
2:结束游戏
void menu()
{
printf("************************************\n");
printf("************************************\n");
printf("\n");
printf("*********** 开 始 菜 单 ***********\n");
printf("\n");
printf("******1:开始游戏 2:结束游戏******\n");
printf("\n");
printf("************************************\n");
printf("************************************\n");
}
void menu1()
{
printf("\n");
printf("\n");
printf("\n");
printf("************************************\n");
printf("*********** 选 择 模 式 ***********\n");
printf("\n");
printf(" 1:人 机 对 战 \n");
printf(" 2:玩 家 对 战 \n");
printf(" 3:返 回 上 一 级 \n");
}
运行结果:
3、创建棋盘
棋盘使用三行三列二位数组表示
行:ROW
列:COL
使用#define来定义
ROW,COL原因:
可改性更强,如果将来需要将棋盘扩大或缩小,代码修改会很方便
#define ROW 3
#define COL 3
4、棋盘初始化
将棋盘内容全部置为空格
//棋盘初始化的实现
void initboard(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
for (x = 0; x < row; x++)
{
for (y = 0; y < col; y++)
{
board[x][y] = ' ';
}
}
}
5、打印棋盘
//打印棋盘的函数实现
void displayboard(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
for (x = 0; x < row; x++)
{
for (y = 0; y < col; y++)
{
printf(" %c ", board[x][y]);
if (y < col - 1)
{
printf("|");
}
}
printf("\n");
if (x < row - 1)
{
for (y = 0; y < col; y++)
{
printf("---");
if (y < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
结果:
6、玩家落子
注意:
因为大部分玩家没有接触过编程,所以又可能不知道数组下标从0开始,所以当玩家输入时判断坐标是否为空时需要将横纵坐标都减1
//玩家走函数的实现
void playermove(char board[ROW][COL], int row, int col)
{
printf("玩家走:>\n");
int x = 0;
int y = 0;
while (1)
{
printf("请玩家落子\n");
scanf_s("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '#';
break;
}
{
printf("该坐标被占用,请重新输入\n");
}
}
else
{
printf("非法坐标,请重新输入\n");
}
}
}
7、电脑落子
电脑落子随机产生,需要引用时间戳 srand((unsigned int)time(NULL));
//电脑走的函数实现
void comboard(char board[ROW][COL], int row, int col)
{
printf("电脑落子:>\n");
int x = 0;
int y = 0;
while(1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '*';
break;
}
}
}
8、判断胜负
定义返回结果的含义
返回‘#’玩家赢
返回‘*’电脑赢,或玩家2赢
返回'Q'平局
返回'C'继续落子
是否平局判定:
调用isfull函数,如果数组中有' '元素,证明没满返回0,否则返回1。
//判断棋盘是否满了返回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;
}
//下棋部分判断输赢函数实现
char iswin(char board[ROW][COL], int row, int col)
{
int x = 0;
//判断行是否有赢家
for (x = 0; x < row; x++)
{
if (board[x][0] == board[x][1] && board[x][2] == board[x][0] && board[x][1] != ' ')
{
return board[x][1];
}
}
//判断列是否有赢家
for (x = 0; x < col; x++)
{
if (board[1][x] == board[2][x] && board[2][x] == board[0][x] && board[1][x] != ' ')
{
return board[1][x];
}
}
//判断斜是否有赢家
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' '
|| board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//判断是否平局
if (1 == isfull(board, ROW, COL))
{
return 'Q';
}
return 'C';
}
玩家胜利结果展示:
电脑胜利结果展示
玩家2胜利结果展示:
和棋展示
test.c全部代码
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
int choose1 = 0;
void menu()
{
printf("************************************\n");
printf("************************************\n");
printf("\n");
printf("*********** 开 始 菜 单 ***********\n");
printf("\n");
printf("******1:开始游戏 2:结束游戏******\n");
printf("\n");
printf("************************************\n");
printf("************************************\n");
}
void menu1()
{
printf("\n");
printf("\n");
printf("\n");
printf("************************************\n");
printf("*********** 选 择 模 式 ***********\n");
printf("\n");
printf(" 1:人 机 对 战 \n");
printf(" 2:玩 家 对 战 \n");
printf(" 3:返 回 上 一 级 \n");
}
void game1()
{
//设计棋盘
char board[ROW][COL] = { 0 };
//棋盘初始化
initboard(board, ROW, COL);
//打印棋盘
displayboard(board, ROW, COL);
int ret = 0;
while (1)
{
//玩家走
playermove(board, ROW, COL);
displayboard(board, ROW, COL);
//判断输赢
ret = iswin(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑走
comboard(board, ROW, COL);
displayboard(board, ROW, COL);
//判断输赢
ret = iswin(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '#')
{
printf("恭喜你,你赢了\n");
}
else if (ret == '*')
{
printf("很遗憾,你输了\n");
}
else
{
printf("很遗憾,是平局\n");
}
printf("游戏结束\n");
menu1();
}
void game2()
{
//设计棋盘
char board[ROW][COL] = { 0 };
//棋盘初始化
initboard(board, ROW, COL);
//打印棋盘
displayboard(board, ROW, COL);
int ret = 0;
while (1)
{
//玩家1走
playermove(board, ROW, COL);
displayboard(board, ROW, COL);
//判断输赢
ret = iswin(board, ROW, COL);
if (ret != 'C')
{
break;
}
//玩家2走
playermove2(board, ROW, COL);
displayboard(board, ROW, COL);
//判断输赢
ret = iswin(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '#')
{
printf("恭喜玩家1,你赢了\n");
}
else if (ret == '*')
{
printf("恭喜玩家2,你赢了\n");
}
else
{
printf("很遗憾,是平局\n");
}
printf("游戏结束\n");
menu1();
}
void test1()
{
srand((unsigned int)time(NULL));
menu1();//设计子菜单
printf("请选择模式:>\n");
do
{
scanf_s("%d", &choose1);
switch (choose1)
{
case 1:
{
game1();//设计人机对战
break;
}
case 2:
{
game2();//设计玩家对战
break;
}
case 3:
{
choose1 = 0;
break;
}
default:
{
printf("输入非法,请重新输入\n");
break;
}
}
} while (choose1);
}
void test()
{
int choose = 0;
printf("请选择:>\n");
do
{
menu();//设计菜单
scanf_s("%d", &choose);
switch (choose)
{
case 1:
{
test1();
if (choose1 == 0)
{
menu();
break;
}
break;
}
case 2:
{
choose = 0;
break;
}
default:
{
printf("输入非法,请重新输入\n");
break;
}
}
} while (choose);
}
int main()
{
test();
return 0;
}
game.h全部代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
//棋盘初始化的声明
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 comboard(char board[ROW][COL], int row, int col);
//判断输赢,q玩家赢,w电脑赢,e平局,r继续落子
char iswin(char board[ROW][COL], int row, int col);
//玩家2走的函数声明
void playermove2(char board[ROW][COL], int row, int col);
game.c全部代码
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
//棋盘初始化的实现
void initboard(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
for (x = 0; x < row; x++)
{
for (y = 0; y < col; y++)
{
board[x][y] = ' ';
}
}
}
//打印棋盘的函数实现
void displayboard(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
for (x = 0; x < row; x++)
{
for (y = 0; y < col; y++)
{
printf(" %c ", board[x][y]);
if (y < col - 1)
{
printf("|");
}
}
printf("\n");
if (x < row - 1)
{
for (y = 0; y < col; y++)
{
printf("---");
if (y < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
//玩家走函数的实现
void playermove(char board[ROW][COL], int row, int col)
{
printf("玩家走:>\n");
int x = 0;
int y = 0;
while (1)
{
printf("请玩家落子\n");
scanf_s("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '#';
break;
}
{
printf("该坐标被占用,请重新输入\n");
}
}
else
{
printf("非法坐标,请重新输入\n");
}
}
}
//电脑走的函数实现
void comboard(char board[ROW][COL], int row, int col)
{
printf("电脑落子:>\n");
int x = 0;
int y = 0;
while(1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '*';
break;
}
}
}
//玩家2走函数的实现
void playermove2(char board[ROW][COL], int row, int col)
{
printf("玩家2走:>\n");
int x = 0;
int y = 0;
while (1)
{
printf("请玩家2落子\n");
scanf_s("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
{
printf("该坐标被占用,请重新输入\n");
}
}
else
{
printf("非法坐标,请重新输入\n");
}
}
}
//判断棋盘是否满了返回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;
}
//下棋部分判断输赢函数实现
char iswin(char board[ROW][COL], int row, int col)
{
int x = 0;
//判断行是否有赢家
for (x = 0; x < row; x++)
{
if (board[x][0] == board[x][1] && board[x][2] == board[x][0] && board[x][1] != ' ')
{
return board[x][1];
}
}
//判断列是否有赢家
for (x = 0; x < col; x++)
{
if (board[1][x] == board[2][x] && board[2][x] == board[0][x] && board[1][x] != ' ')
{
return board[1][x];
}
}
//判断斜是否有赢家
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ' || board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//判断是否平局
if (1 == isfull(board, ROW, COL))
{
return 'Q';
}
return 'C';
}
希望可以帮到大家!!!