当前位置:网站首页>【三子棋】7.25
【三子棋】7.25
2022-08-03 05:11:00 【tt142】
三子棋是喜闻乐见的娱乐游戏,这个简单过程如何代码实现呢
本文不止分享代码过程,也会详细阐述我们想要的效果如何通过简单的修改达到目的
目录
注意:1.的讲解是穿插在2.和3.之中,因为头文件的引用是根据代码决定的
首先我们从主体思路讲起
运行游戏肯定有简单的选项菜单——>menu();
菜单里对应开始游戏/退出——>menu的实现
菜单运行结束要有函数可以读取到选项的信息并且做出反应——>main函数的实现
用到printf等基本函数——>头文件#include <stdio.h>
srand不在目前的功能里,所以他的头文件此时先忽略,他的作用在本文后一部分
上代码
void menu()
{
printf("*********************\n");
printf("*******1.play********\n");
printf("*******0.exit********\n");
printf("*********************\n");
}
int main()
{
srand((unsigned int)time(NULL)); //这行的作用后面会解释
int n = 0;
do
{
menu();
printf("请输入数字\n");
scanf("%d", &n);
switch (n)
{
case 1:
{
printf("游戏开始\n");
game(); //这里为游戏函数的插入
break;
}
case 0:
{
printf("已经退出游戏\n");
break;
}
default:
{
printf("输入错误请重新输入\n");
break;
}
}
} while (n);
return 0;
}
注意:此时代码的运行如果输入0,自动跳出,而输入非0非1会再次跳出菜单选项,并且整个三子棋游戏运行结束之后还会再次跳出菜单,也就是一把不过瘾接着来
但是如果我们只想玩一次,并且不想输入非0非1会再次跳出菜单选项,那么main函数更改为
int main()
{
srand((unsigned int)time(NULL));
int n = 0;
menu();
begin: printf("请输入数字\n");
scanf("%d", &n);
if(n==1)
{
printf("游戏开始\n");
game();
}
else if(n==0)
{
printf("已经退出游戏\n");
}
else
{
printf("输入错误请重新输入\n");
goto begin;
}
return 0;
}
至此 我们正式进入游戏
首先画一个棋盘,由于网格形式——>二维数组
棋盘一开始需要是空白的——>初始化数组
打印棋盘——>需要落子的地方先用空格填充
棋盘为3*3——>头文件里用宏定义行和列
所以头文件和棋盘的初始化部分和打印棋盘函数的代码
#define _CRT_SECURE_NO_WARNINGS
#define ROW 3
#define COL 3
#include<stdio.h>
void InitBoard(char arr[ROW][COL], int row, int col);
void PrintfBoard(char arr[ROW][COL], int row, int col);
void InitBoard(char arr[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
void PrintfBoard(char arr[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 (j < col - 1)
printf(" %c |", arr[i][j]);
else
printf(" %c \n", arr[i][j]);
}
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
if (j < col - 1)
printf("---|");
else
printf("---\n");
}
}
}
}
在主题函数中加入game()函数
目前test函数的思路为
void menu()
{
printf("*********************\n");
printf("*******1.play********\n");
printf("*******0.exit********\n");
printf("*********************\n");
}
void game()
{
char ret = 0; //后面会用到,现在不涉及
char arr[ROW][COL] = { 0 };
InitBoard(arr, ROW, COL);
PrintfBoard(arr, ROW, COL);
现在棋盘打印完毕,我们这里规定玩家先手——>落子用‘*’
每次落子之后要在棋盘上有所体现——>再次打印棋盘
对弈过程是循环不可能只有一次——>while循环
玩家落子的代码为
void PlayerMove(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("轮到您了\n");
flag: printf("请输入坐标");
scanf_s("%d%d", &x, &y);
if(x >= 1 && x <= row && y >= 1 && y <= col)
{
if(arr[x - 1][y - 1] == ' ')
arr[x - 1][y - 1] = '*';
else
{
printf("位置已经被占用请重新输入\n");
goto flag;
}
}
else
{
printf("位置非法请重新输入");
goto flag;
}
}
test.c变为
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
printf("*********************\n");
printf("*******1.play********\n");
printf("*******0.exit********\n");
printf("*********************\n");
}
void game()
{
char ret = 0;
char arr[ROW][COL] = { 0 };
InitBoard(arr, ROW, COL);
PrintfBoard(arr, ROW, COL);
while (1)
{
PlayerMove(arr, ROW, COL);
PrintfBoard(arr, ROW, COL);
注意 :我们这个函数在玩家输入坐标不在棋盘范围内,记为坐标非法,此情况和坐标被占用一样都会返回让玩家重新输入坐标那一步,而不是和其他三子棋代码一样再打印一下棋盘!!!!
由于第一轮,电脑还没落子,但是,我们要知道,玩家先手所以第二回合之后就可能要判断玩家是否获胜,或者平局,玩家比电脑多下一个棋子,这里不可能电脑获胜
此时头文件变成
#define _CRT_SECURE_NO_WARNINGS
#define ROW 3
#define COL 3
#include<stdio.h>
void InitBoard(char arr[ROW][COL], int row, int col);
void PrintfBoard(char arr[ROW][COL], int row, int col);
void PlayerMove(char arr[ROW][COL], int row, int col);
char Is_win(char arr[ROW][COL], int row, int col);
此时写一个判断输赢的函数
char Is_win(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
return arr[i][0];
}
for (j = 0; j < col; j++)
{
if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[0][j] != ' ')
return arr[0][j];
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
return arr[0][0];
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
return arr[0][2];
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
return 'c';
}
}
return 'q';
}
test.c里的game函数变为
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
printf("*********************\n");
printf("*******1.play********\n");
printf("*******0.exit********\n");
printf("*********************\n");
}
void game()
{
char ret = 0;
char arr[ROW][COL] = { 0 };
InitBoard(arr, ROW, COL);
PrintfBoard(arr, ROW, COL);
while (1)
{
PlayerMove(arr, ROW, COL);
PrintfBoard(arr, ROW, COL);
ret = Is_win(arr, ROW, COL);
if (ret == '*')
{
printf("恭喜获胜\n");
break;
}
else if (ret == 'q')
{
printf("恭喜您水平和智障一样\n");
break;
}
轮到电脑落子,由于电脑下棋应该有随机性,而且我们无法判断玩家下在哪里——>生成随机数(用时间这个随时都在变的量来实现 )
随机数——>#include<time.h>
rand srand——>#include<stdlib.h>
电脑落子之后要考虑是否电脑获胜(因为玩家是否获胜或者平局已经在玩家落子时候考虑过)
随机数生成一次即可
注意:玩家两次坐标输入不宜太快,否则电脑的随机数用时间很难区分
控制随机数在棋盘范围里,并且把函数设计成无需考虑坐标非法的问题
上代码
void ComputerMove(char arr[ROW][COL], int row, int col)
{
printf("轮到电脑了\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (arr[x][y] == ' ')
{
arr[x][y] = '#';
break;
}
}
}
头文件
#define _CRT_SECURE_NO_WARNINGS
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void InitBoard(char arr[ROW][COL], int row, int col);
void PrintfBoard(char arr[ROW][COL], int row, int col);
void PlayerMove(char arr[ROW][COL], int row, int col);
char Is_win(char arr[ROW][COL], int row, int col);
void ComputerMove(char arr[ROW][COL], int row, int col);
test.c
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
printf("*********************\n");
printf("*******1.play********\n");
printf("*******0.exit********\n");
printf("*********************\n");
}
void game()
{
char ret = 0;
char arr[ROW][COL] = { 0 };
InitBoard(arr, ROW, COL);
PrintfBoard(arr, ROW, COL);
while (1)
{
PlayerMove(arr, ROW, COL);
PrintfBoard(arr, ROW, COL);
ret = Is_win(arr, ROW, COL);
if (ret == '*')
{
printf("恭喜获胜\n");
break;
}
else if (ret == 'q')
{
printf("恭喜您水平和智障一样\n");
break;
}
ComputerMove(arr, ROW, COL);
PrintfBoard(arr, ROW, COL);
ret= Is_win(arr, ROW, COL);
if (ret == '#')
{
printf("恭喜您输给人工智障\n");
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));
int n = 0;
menu();
begin: printf("请输入数字\n");
scanf_s("%d", &n);
if(n==1)
{
printf("游戏开始\n");
game();
}
else if(n==0)
{
printf("已经退出游戏\n");
}
else
{
printf("输入错误请重新输入\n");
goto begin;
}
return 0;
}
最后的三个文件game.h game.c test.c的最终代码为
game.h
#define _CRT_SECURE_NO_WARNINGS
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void InitBoard(char arr[ROW][COL], int row,
int col);
void PrintfBoard(char arr[ROW][COL], int row, int col);
void PlayerMove(char arr[ROW][COL], int row, int col);
char Is_win(char arr[ROW][COL], int row, int col);
void ComputerMove(char arr[ROW][COL], int row, int col);
game.c
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void InitBoard(char arr[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
void PrintfBoard(char arr[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 (j < col - 1)
printf(" %c |", arr[i][j]);
else
printf(" %c \n", arr[i][j]);
}
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
if (j < col - 1)
printf("---|");
else
printf("---\n");
}
}
}
}
void PlayerMove(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("轮到您了\n");
flag: printf("请输入坐标");
scanf_s("%d%d", &x, &y);
if(x >= 1 && x <= row && y >= 1 && y <= col)
{
if(arr[x - 1][y - 1] == ' ')
arr[x - 1][y - 1] = '*';
else
{
printf("位置已经被占用请重新输入\n");
goto flag;
}
}
else
{
printf("位置非法请重新输入");
goto flag;
}
}
char Is_win(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
return arr[i][0];
}
for (j = 0; j < col; j++)
{
if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[0][j] != ' ')
return arr[0][j];
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
return arr[0][0];
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
return arr[0][2];
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
return 'c';
}
}
return 'q';
}
void ComputerMove(char arr[ROW][COL], int row, int col)
{
printf("轮到电脑了\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (arr[x][y] == ' ')
{
arr[x][y] = '#';
break;
}
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
printf("*********************\n");
printf("*******1.play********\n");
printf("*******0.exit********\n");
printf("*********************\n");
}
void game()
{
char ret = 0;
char arr[ROW][COL] = { 0 };
InitBoard(arr, ROW, COL);
PrintfBoard(arr, ROW, COL);
while (1)
{
PlayerMove(arr, ROW, COL);
PrintfBoard(arr, ROW, COL);
ret = Is_win(arr, ROW, COL);
if (ret == '*')
{
printf("恭喜获胜\n");
break;
}
else if (ret == 'q')
{
printf("恭喜您水平和智障一样\n");
break;
}
ComputerMove(arr, ROW, COL);
PrintfBoard(arr, ROW, COL);
ret= Is_win(arr, ROW, COL);
if (ret == '#')
{
printf("恭喜您输给人工智障\n");
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));
int n = 0;
menu();
begin: printf("请输入数字\n");
scanf_s("%d", &n);
if(n==1)
{
printf("游戏开始\n");
game();
}
else if(n==0)
{
printf("已经退出游戏\n");
}
else
{
printf("输入错误请重新输入\n");
goto begin;
}
return 0;
}
欢迎斧正,创作不易,感谢观看
边栏推荐
猜你喜欢
随机推荐
shell script loop statement
安装IIS服务(Internet信息服务(Internet Information Services,简写IIS,互联网信息服务)
FileZilla 搭建ftp服务器
Pr第二次培训笔记
HarmonyOS应用开发第一次培训
VSO Downloader Ultimate 5.0.1.45 中文多语免费版 在线视频下载工具
[Harmony OS] [ARK UI] ETS context basic operations
1069 微博转发抽奖 (20 分)(C语言)
13.< tag-动态规划和回文字串>lt.647. 回文子串 + lt.516.最长回文子序列
flask 面试题 问题
设计模式——组合模式、享元模式(Integer缓存)(结构型模式)
1089 狼人杀-简单版 (20 分)
Get the Ip tool class
Djiango第四次培训笔记
1095 解码PAT准考证 (25 分)(C语言)
breed Web刷机升级详细教材修正编译器固件说明_itkeji.top
celery工作原理图
typescript49-交叉类型
详解Nurbs曲线
【Flask】Flask-SQLAlchemy的增删改查(CRUD)操作