【三子棋的实现】-创新互联
在红塔等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站建设、网站制作 网站设计制作定制网站制作,公司网站建设,企业网站建设,成都品牌网站建设,成都全网营销,外贸网站建设,红塔网站建设费用合理。文章目录
目录
文章目录
前言
一、如何去实现呢?
二、实现步骤
1.游戏菜单实现
编辑
2.游戏过程实现
1.下棋:通过坐标形式展示
2.判断输赢
3.完整代码实现
game.h
game.c
test.c
三、测试阶段
总结
前言
三子棋游戏想必大家都玩过吧,但有没有想过自己来编写一个程序实现三子棋功能呢?下面小编就来带大家一起实现这个小小程序,一起来看看吧!!!
一、如何去实现呢?
一般一个小工程可以分为多个模块来进行,这样会使得代码逻辑更清晰。因此我们将分为两大模块test.c(测试模块)以及game.c和game.h(游戏模块)。
二、实现步骤 1.游戏菜单实现main函数代码不要太多,我们主要通过函数来实现相关功能,所以我们选择放入test函数中实现
- test()函数实现
希望游戏可以玩多次do while循环
先打印一个菜单menu();
void menu()
{
printf("---------------------\n");
printf("----- 1、play -----\n");
printf("----- 0、exit -----\n");
printf("---------------------\n");
}
用switch case语句决定下一步
1 玩游戏 进入game()函数 0 退出游戏 default 选择错误
int input = 0;
do
{
menu();
printf("请选择:");
scanf_s("%d", &input);
switch (i)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("选择错误");
}
} while (input);//do while循环停止条件为input为0
2.game()函数实现
记录下棋位置的信息9个位置 对应3X3的数组,因此要存储数据需要一个3X3的数组。给出一个数组 char board[3][3]最开始数组中字符都为空格,初始化棋盘为全空格,用init_board()函数来实现
init_board(board,3,3);
但只有打印出来才能看见 设置打印数组 print_board(board,3,3)函数来定义
但是我们可以看到如果用数字3直接表示时就固定化了,因此可以用宏定义#define使得选择更多样
#define ROW 3 行定义为3
#define COL 3 列定义为3
在头文件中声明
void init_board(char board[ROW][COL],int row,int col);
void print_board(char board[ROW][COL],int row,int col);
在函数实现模块game.c中实现函数
//初始化函数
void init_board(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] = ' ';
}
}
在实现print_board()函数的时候,如果只是想把9个空格元素打印出来,就看不到效果不利于观察
所以我们想到通过排版打印出方格利于观察。
//打印函数实现
void print_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; i++)
{
printf("|---|---|---|\n");
printf("| %c | %c | %c |\n", board[i][0], board[i][1], board[i][2]);
}
printf("|---|---|---|\n");
}
最后效果展示
2.游戏过程实现 1.下棋:通过坐标形式展示(1)玩家下棋函数player_move();
考虑到一般人不知道数组下标的问题,所以将坐标行列范围都设置为从1开始
代码实现:
void player_move(char board[ROW][COL], int row, int col)
{
while (1)
{
int x = 0, y = 0;
scanf("%d%d", &x, &y);
if (x >= 0 && x<= ROW && y >= 0 && y<= COL)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;//当玩家下棋了之后跳出循环,只有可以确保玩家下棋了
}
else
printf("坐标占用 重新输入\n");
}
else
{
printf("坐标非法\n");
}
}
(2)电脑下棋computer_move()
可以现通过srand()以及rand()函数来生产随机数,从而生成随机坐标值,得引用头文件#include
void computer_play(char board[ROW][COL],int row,int col)
{
printf("电脑下棋:\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (x >= 0 && x< row && y >= 0 && y< col)
{
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
}
需要注意的是ran()函数一定要放在循环里边,因为电脑下棋可能会下到已经下了的位置,因此为了保证下错了可以重新下,就要重新产生新的坐标,因此rand()函数得放在循环里边。(开始的时候放在了while外边运行了好久都没成功!!)
2.判断输赢(1)is_win函数
设计一个新的函数来判断输赢情况,可以通过返回字符的方式来实现分类讨论。
玩家赢 返回 '*'
电脑赢 返回 '#'
平局 返回 '!'
没有分出胜负继续游戏 返回 '>'
(2)is_full函数
为了更方便判断平局,我们设计一个if_full()函数
代码实现:
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i< row; i++) //通过遍历整个二维数组判断满没满
{
for (j = 0; j< col; j++)
{
if (board[i][j] == ' ')
{
return -1; //有空格则说明没满,返回-1
}
}
}
return 1;//满了返回1
}
接下来就可以完整实现is_win()函数了
代码实现:
char is_win(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][0] != ' ')
{
return board[i][0];
}
}
//判断列相同
for (i = 0; i< col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//对角线相同
if ((board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') || (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0] != ' '))
return board[1][1];
//满了平局
int x = is_full(board, ROW, COL);
if (x == 1)
return '!';
//没满并且没分出胜负,则继续
else
return '>';
}
- 值得注意的是其中的顺序,首先是判断电脑与玩家是否分出胜负(根据每行,每列,每条对角线是否相等),然后在判断是否为平局(棋满了),如果不是棋满了,则继续
(3)game函数中判断输赢
首先是看是否继续(是否返回 '>' ),以此作为循环终止条件,然后再根据返回值类型判断输赢或是平局
void game()
{
char board[ROW][COL];
char ret;
init_board(board, ROW, COL);
print_board(board, ROW, COL);
srand((unsigned int)time(NULL));
while (1)
{
player_move(board, ROW, COL);
print_board(board, ROW, COL);
ret=is_win(board, ROW, COL);
if (ret != '>')
break;
computer_play(board, ROW, COL);
print_board(board, ROW, COL);
ret=is_win(board, ROW, COL);
if (ret != '>')
break;
}
//判断输赢或平局
if (ret == '*')
{
printf("玩家赢了!\n");
}
else if (ret == '#')
{
printf("电脑赢了!\n");
}
else if (ret == '!')
{
printf("平局!\n");
}
3.完整代码实现
game.h//game.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include#include#include#define ROW 3
#define ROWS 11
#define COL 3
#define COLS 11
void init_board(char board[ROW][COL], int row, int col);
void print_board(char board[ROW][COL], int row, int col);
void player_move(char board[ROW][COL], int row, int col);
void computer_play(char board[ROW][COL],int row,int col);
char is_win(char board[ROW][COL], int row, int col);
game.c #include"game.h"
void init_board(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 print_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; i++)
{
printf("|---|---|---|\n");
printf("| %c | %c | %c |\n", board[i][0], board[i][1], board[i][2]);
}
printf("|---|---|---|\n");
}
void player_move(char board[ROW][COL], int row, int col)
{
while (1)
{
int x = 0, y = 0;
printf("玩家下棋,坐标为->:");
scanf("%d%d", &x, &y);
if (x >0 && x<= ROW && y >0 && y<= COL)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;//当玩家下棋了之后跳出循环,就可以确保玩家下棋了
}
else
printf("坐标占用 重新输入\n");
}
else
{
printf("坐标非法\n");
}
}
}
void computer_play(char board[ROW][COL],int row,int col)
{
printf("电脑下棋:\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (x >= 0 && x< row && y >= 0 && y< col)
{
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
}
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i< row; i++)
{
for (j = 0; j< col; j++)
{
if (board[i][j] == ' ')
{
return -1;
}
}
}
return 1;
}
char is_win(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][0] != ' ')
{
return board[i][0];
}
}
//列相同
for (i = 0; i< col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//对角线相同
if ((board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') || (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0] != ' '))
return board[1][1];
//满了平局
int x = is_full(board, ROW, COL);
if (x == 1)
return '!';
//没满并且没分出胜负,则继续
else
return '>';
}
test.c#include"game.h"
void menu()
{
printf("---------------------\n");
printf("----- 1、play -----\n");
printf("----- 0、exit -----\n");
printf("---------------------\n");
}
void game()
{
char board[ROW][COL];
char ret;
init_board(board, ROW, COL);
print_board(board, ROW, COL);
srand((unsigned int)time(NULL));
while (1)
{
player_move(board, ROW, COL);
print_board(board, ROW, COL);
ret=is_win(board, ROW, COL);
if (ret != '>')
break;
computer_play(board, ROW, COL);
print_board(board, ROW, COL);
ret=is_win(board, ROW, COL);
if (ret != '>')
break;
}
//判断输赢或平局
if (ret == '*')
{
printf("玩家赢了!\n");
}
else if (ret == '#')
{
printf("电脑赢了!\n");
}
else if (ret == '!')
{
printf("平局!\n");
}
}
void test()
{
int input = 0;
do
{
menu();
printf("请选择:");
scanf_s("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("选择错误");
}
} while (input);
}
int main()
{
test();
return 0;
}
三、测试阶段最后来玩玩三子棋游戏啦!!
总结
今天的三子棋游戏就到这里啦!!喜欢的话记得点赞+收藏哦!!!
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
新闻名称:【三子棋的实现】-创新互联
标题来源:http://azwzsj.com/article/josje.html