当前位置:网站首页>【三子棋】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;
}欢迎斧正,创作不易,感谢观看
边栏推荐
猜你喜欢

第三次HarmonyOS培训

typescript39-class类的可见修饰符

js implements a bind function

Talking about GIS Data (6) - Projected Coordinate System

Tag stack - stack monotonically preparatory knowledge - lt. 739. The daily temperature

High availability, two locations and three centers

如何不耍流氓的做运维之-SHELL脚本

在树莓派上搭建属于自己的网页(1)

Build your own web page on the Raspberry Pi (2)

VSO Downloader Ultimate 5.0.1.45 中文多语免费版 在线视频下载工具
随机推荐
Kaggle 入门(Kaggle网站使用及项目复现)
1059 C语言竞赛 (20 分)(C语言)
1079 延迟的回文数 (20 分)
Install PostgreSQL on Windows
C-PHY速率
内部类、static关键字、final
MySql数据库
【Flask】Flask-SQLAlchemy的增删改查(CRUD)操作
业务表解析-余额系统
【转】最小描述长度准则MDL(Minimun Description Length)
typescript41-class类的私有修饰符
web安全-命令执行漏洞
嵌入式-I2C-物理电路图
The problem that the rosbag tool plotjuggler cannot open rosbag
[Harmony OS] [ArkUI] ets development graphics and animation drawing
HarmonyOS应用开发第一次培训
Install IIS services (Internet Information Services (Internet Information Services, abbreviated IIS, Internet Information Services)
Power button 561. An array of split
JS学习笔记(三)
Redis常用命令