前言:底层实现三子棋,使用二维数组
源码地址:蒋文涛 (jiang-wentao-WelTW) - Gitee.com
首先:我们把我们所需要写的程序分为三份:头文件、函数实施、运行。这样设置的好处是高度封装,方便以后的更改等。本代码还可优化,给电脑做一些列算法,让他可以战胜人
1.头文件代码
#include
#include
#include
//定义棋盘的大小
#define ROW 3
#define COL 3
//初始化地图
void initdata(char board[ROW][COL], int row ,int col);
//打印地图函数
void displayboard(char board[ROW][COL],int row,int col);
//玩家下棋
void playermove(char board[][COL], int row, int col);
//电脑随机下棋 (可以进行算法优化)
void computermove(char board[ROW][COL], int row, int col);
//判断谁赢了 *人赢 #机器赢 C继续 Q 平局
char iswin(char board[ROW][COL], int row, int col);
2.主要函数实现
#define _CRT_SECURE_NO_WARNINGS 1
#include "head.h"
//遍历数组,给数组所有元素 变为 空
void initdata(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++)
{
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++)//打印 空格字符空格|空格字符空格|空格字符空格|
{
printf(" %c ", board[i][j]);
if (j < col-1 ) {
printf("|");
}
}
printf("\n");
if (i < row-1) //打印 ---|---|---| 棋盘的分割线
{
int j = 0;
for ( j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
void playermove(char board[][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家走:>\n");
while (1)
{
printf("请输入坐标>:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判断输入是否合法 ,玩家看来坐标为1
{
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;
while (1)
{
x = rand() % 3;//使用随机数 让棋盘随机生成 x,y的坐标
y = rand() % 3;
if (board[x][y] == ' ') //如果数组中为空 则可赋# ,否则一致随机 直到随机到有空的位置
{
board[x][y] = '#';
break;
}
else //当没有空的位置 电脑随机不到地方时 则跳出循环 否则会死循环
{
int res = isfull(board, ROW, COL);
if (res == 1)
{
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;
}
//给判断游戏是否要继续进行提供参数
char 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][i]==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[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//判断棋盘是否满了, 没满返回C 满了返回Q
int res = isfull(board , ROW, COL);
if (res==0)
{
return 'C';
}
else if (res==1)
{
return 'Q';
}
}
3.主程序
#define _CRT_SECURE_NO_WARNINGS 1
#include "head.h"
void menu()
{
printf("*********************\n");
printf("****** 1.play *******\n");
printf("****** 0.exit *******\n");
printf("*********************\n");
}
void game()
{
//创建一个数组存储棋盘的大小
char board[ROW][COL];
//打印map map初始化
initdata(board, ROW ,COL);
//打印棋盘
displayboard(board,ROW,COL);
printf("\n");
char read;
//开始下棋
while (1)
{
//玩家下棋 每次打印一遍棋盘
playermove(board, ROW, COL);
system("cls");//清屏
displayboard(board, ROW, COL);
//电脑下棋
computermove(board, ROW, COL);
displayboard(board, ROW, COL);
//判断是否 结束 *人赢 #机器赢 C继续 Q 平局
read = iswin(board, ROW, COL);
if (read != 'C')
{
break;
}
}
//输出最终获胜 或者结果
if (read == '*')
{
printf("人赢\n");
} else if(read == '#')
{
printf("机器赢\n");
}
else if (read == 'Q')
{
printf("平局\n");
}
}
int main()
{
srand((unsigned int)time(NULL)); //生成随机数
int input = 0;
do
{
menu();
printf("请选择是否游戏:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始游戏\n");
game();
break;
case 0:
printf("游戏退出\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}while (input);
return 0;
}
大体游玩展示:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)