十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
大家好,最近一直在学习C语言的相关知识,今天分享的是C语言中的三子棋代码与思路
成都创新互联是一家专注于成都网站设计、做网站、成都外贸网站建设公司与策划设计,延平网站建设哪家好?成都创新互联做网站,专注于网站建设10年,网设计领域的专业建站公司;建站业务涵盖:延平等地区。延平做网站价格咨询:13518219792首先分为头文件game.h 和game.c与test.c三个文件
目录
1、菜单界面
2、玩家选择游戏界面
3、初始化三子棋棋盘
4、打印棋盘
5、玩家下棋
6、电脑下棋
7、判断输赢 已经平局的函数
判断棋盘是否满的函数
在test.c中的game函数中调用
整体程序实现
test.c
game.c
game.h
void menu()
{
printf("*****************************\n");
printf("*****************************\n");
printf("*******1、play ***********\n");
printf("*******0、exit ***********\n");
printf("*****************************\n");
printf("*****************************\n");
printf("*****************************\n");
}
2、玩家选择游戏界面玩家输入0/1进入游戏 调用菜单界面 选择1调用game函数开始游戏 选择0退出游戏
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); //记得包含两个头文件
do
{
menu(); //先是打印菜单
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
3、初始化三子棋棋盘void initboard(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++)
{
board[i][j] = ' '; //这是字符 不是字符串!!!!
}
}
}
初始化二维数组 这里将遍历的行、列数组全部用字符‘ ’(字符空格)初始化
4、打印棋盘void display(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)
{
for (j = 0; j< col; j++)
{
printf("---");
if (j< col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
这里将三子棋“井”字框架搭建起来
5、玩家下棋void player_move(char board[ROW][COL], int row, int col) //玩家下棋
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋:\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x<= row && y >= 1 && y<= col)
{
if (board[x - 1][y - 1] == ' ') //因为玩家是送1开始的 数组的坐标是从0开始的 所以必须减1
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标已满,请重新输入!");
}
}
else
{
printf("输入的坐标非法,请重新输入");
}
}
}
这里输入坐标,将‘ ’位置换成‘*’ 并加入判断语句 ,如果输入的坐标不符合条件范围则坐标非法,如果输入的坐标没有‘ ’,则说明此坐标已经被占用。
6、电脑下棋#include#includevoid computer_move(char board[ROW][COL], int row, int col) //电脑下棋
{
int x = 0;
int y = 0;
printf("电脑下棋:\n");
while (1)
{
x = rand() % row; // 0~2 随机数
y = rand() % col; // 0~2 随机数
if (board[x ][y ] == ' ') //0~2的随机数 这时坐标就不能在减1
{
board[x][y] = '#';
break;
}
}
}
电脑下棋需要生成随机的坐标 这里用到随机函数,这样对行、列取模 得到的是0~2的随机数,在坐标中while循环填入 ,填入后退出循环。
7、判断输赢 已经平局的函数int iswin(char board[ROW][COL], int row, int col) //判断输赢
{
int i = 0;
int j = 0;
for (i = 0; i< row; i++)
{
if (board[i][0] == board[i][1]&& board[i][1] == board[i][2] && board[i][2 ]!= ' ')//判断行
{
return board[i][0]; //这里返回i行的几列都行 结果都是相同的
}
}
for (j = 0; j< col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[2][j] != ' ')//判断列
{
return board[0][j]; //这里返回j列的几行都行 结果都是相同的
}
}
if (board[0][0] == board[1][1]&& board[1][1 ]== board[2][2] && board[2][2] != ' ') //判断对角线
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
{
return board[2][0];
}
if (isfull(board, ROW, COL) == 1) //如果满了 用Q表示
{
return 'Q';
}
return 'C'; //没满 继续 用C表示
}
此函数通过判断行、判断列、判断对角线是否相等且不等于‘ ’,来判断是否满足获胜条件 如果满足则返回结果 ‘*’说明玩家赢 ‘#’说明电脑赢 返回‘Q’说明棋盘已满 说明是平局 如果以上条件都没满足则返回‘C’,游戏继续 玩家与电脑继续输入
判断棋盘是否满的函数static int isfull(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++)
{
if (board[i][j]==' ')
{
return 0; //返回0说明没满 返回1说明满了
}
}
}
return 1;
}
此函数用来判断棋盘是否满 如果有‘ ’说明没满返回0 不满足说明满了 返回1 同时此函数加入static说明在头文件和test.c中都可以不出现 只用在iswin函数内部就行
以上就是游戏的基本逻辑了
在test.c中的game函数中调用void game()
{
char ret = '0';//初始化字符ret
char board[ROW][COL] = { 0 };
initboard(board, ROW, COL); //初始化棋盘
display(board, ROW, COL); //打印棋盘
while (1)
{
player_move(board, ROW, COL);//玩家下棋
display(board, ROW, COL); //打印棋盘
ret = iswin(board, ROW, COL); //输赢结果判断
if (ret != 'C') //如果不继续 要不棋盘满了 要不电脑或者玩家赢了 退出循环
{
break;
}
computer_move(board, ROW, COL);//电脑下棋
display(board, ROW, COL); //打印棋盘
ret = iswin(board, ROW, COL); //输赢结果判断
if (ret != 'C') //如果不继续 要不棋盘满了 要不电脑或者玩家赢了 退出循环
{
break;
}
}
if (ret == '*')
{
printf("玩家获胜!\n");
}
else if (ret == '#')
{
printf("电脑获胜!\n");
}
else if (ret == 'Q')
{
printf("平局!\n");
}
}
整体程序实现
test.c #define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("*****************************\n");
printf("*****************************\n");
printf("*******1、play ***********\n");
printf("*******0、exit ***********\n");
printf("*****************************\n");
printf("*****************************\n");
printf("*****************************\n");
}
void game()
{
char ret = '0';//初始化字符ret
char board[ROW][COL] = { 0 };
initboard(board, ROW, COL); //初始化棋盘
display(board, ROW, COL); //打印棋盘
while (1)
{
player_move(board, ROW, COL);//玩家下棋
display(board, ROW, COL); //打印棋盘
ret = iswin(board, ROW, COL); //输赢结果判断
if (ret != 'C') //如果不继续 要不棋盘满了 要不电脑或者玩家赢了 退出循环
{
break;
}
computer_move(board, ROW, COL);//电脑下棋
display(board, ROW, COL); //打印棋盘
ret = iswin(board, ROW, COL); //输赢结果判断
if (ret != 'C') //如果不继续 要不棋盘满了 要不电脑或者玩家赢了 退出循环
{
break;
}
}
if (ret == '*')
{
printf("玩家获胜!\n");
}
else if (ret == '#')
{
printf("电脑获胜!\n");
}
else if (ret == 'Q')
{
printf("平局!\n");
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); //记得包含两个头文件
do
{
menu(); //先是打印菜单
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
game.c#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void initboard(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++)
{
board[i][j] = ' '; //这是字符 不是字符串!!!!
}
}
}
void display(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)
{
for (j = 0; j< col; j++)
{
printf("---");
if (j< col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
void player_move(char board[ROW][COL], int row, int col) //玩家下棋
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋:\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x<= row && y >= 1 && y<= col)
{
if (board[x - 1][y - 1] == ' ') //因为玩家是送1开始的 数组的坐标是从0开始的 所以必须减1
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标已满,请重新输入!");
}
}
else
{
printf("输入的坐标非法,请重新输入");
}
}
}
void computer_move(char board[ROW][COL], int row, int col) //电脑下棋
{
int x = 0;
int y = 0;
printf("电脑下棋:\n");
while (1)
{
x = rand() % row; // 0~2 随机数
y = rand() % col; // 0~2 随机数
if (board[x ][y ] == ' ') //0~2的随机数 这时坐标就不能在减1
{
board[x][y] = '#';
break;
}
}
}
//封装一个棋盘满的函数 并且不给头文件用 前面加上static
static int isfull(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++)
{
if (board[i][j]==' ')
{
return 0; //返回0说明没满 返回1说明满了
}
}
}
return 1;
}
int iswin(char board[ROW][COL], int row, int col) //判断输赢
{
int i = 0;
int j = 0;
for (i = 0; i< row; i++)
{
if (board[i][0] == board[i][1]&& board[i][1] == board[i][2] && board[i][2 ]!= ' ')//判断行
{
return board[i][0]; //这里返回i行的几列都行 结果都是相同的
}
}
for (j = 0; j< col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[2][j] != ' ')//判断列
{
return board[0][j]; //这里返回j列的几行都行 结果都是相同的
}
}
if (board[0][0] == board[1][1]&& board[1][1 ]== board[2][2] && board[2][2] != ' ') //判断对角线
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
{
return board[2][0];
}
if (isfull(board, ROW, COL) == 1) //如果满了 用Q表示
{
return 'Q';
}
return 'C'; //没满 继续 用C表示
}
game.h#pragma once
#include#include#include#define ROW 3
#define COL 3
void initboard(char board[ROW][COL], int row, int col); //初始化棋盘
void display(char board[ROW][COL], int row, int col); //打印棋盘
void player_move(char board[ROW][COL], int row, int col); //玩家下棋
void computer_move(char board[ROW][COL], int row, int col);//电脑下棋
int iswin(char board[ROW][COL], int row, int col); //输赢结果
头文件主要包括函数的声明和库函数头文件
以上就是实现三字棋的全部代码
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧