当前位置:网站首页>C语言实现三子棋(代码详解)
C语言实现三子棋(代码详解)
2022-08-11 05:30:00 【CHAKMING1】
目录
一、问题分析
1.写一个简单的菜单界面,供用户进行选择
2.下棋的总方案,需要实现哪些具体的步骤
3.就是将我们的棋盘进行初始化
4.玩家进行下棋的方式
5.电脑进行下棋的方式
6.判断电脑和玩家谁获胜
二、代码流程
1.简单的菜单
只有简单的两个功能,输入1是开始玩游戏,输入0是退出游戏
void menu()
{
printf("*************************\n");
printf("******* 1.play ********\n");
printf("******* 0.exit ********\n");
printf("*************************\n");
}
void test()
{
int input = 0;
// 菜单
do {
menu();
printf("请输入:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出成功\n");
break;
default:
printf("输入错误,请按照规定范围输入\n");
break;
}
}while(input);
}2.下棋的方案
// 游戏总方案
void game()
{
// 棋盘的创立
char board[ROW][COL] = { 0 };
// 初始化棋盘
init_Board(board, ROW, COL);
// 打印棋盘
Print_Board(board,ROW,COL);
// 游戏开始
while (1)
{
// 玩家输入
printf("玩家输入\n");
Player_move(board, ROW, COL);
Print_Board(board, ROW, COL);
//判断胜利条件
if (Win_Name(board, ROW, COL) == '*') { // 返回值为1,说明玩家胜利
printf("恭喜你赢了\n");
break;
}
if (Board_Max(board, ROW, COL) == 1){ // 判断棋子是否满了
printf("真菜!还打成平手\n");
break;
}
// 电脑输入
printf("电脑输入.............................\n");
Sleep(1000); //延迟1秒
Computer_move(board, ROW, COL);
Print_Board(board, ROW, COL);
if (Win_Name(board, ROW, COL) == '#') { // 返回值为#,说明电脑胜利
printf("真菜!人机都打不过\n");
break;
}
if (Board_Max(board, ROW, COL) == 1) { // 判断棋子是否满了
printf("真菜!还打成平手\n");
break;
}
}
}3.棋盘初始化
建立一个二维数组作为棋盘,这一步骤是将棋盘的值先初始化为空格,然后再设置一个样式。
// 棋盘初始化,将所有值设置为空格
void init_Board(char board[][COL], int row, int col)
{
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
board[i][j] = ' ';
printf("\n");
}
// 打印棋盘,为棋盘设置一个好看的样式
void Print_Board(char board[][COL],int row,int col) {
printf("+---+---+---+\n");
for (int row = 0; row < ROW; row++) {
printf("| %c | %c | %c |\n", board[row][0],board[row][1], board[row][2]);
printf("+---+---+---+\n");
}
printf("\n");
}4.玩家下棋
这一步骤让玩家通过输入来确认在哪个位置下棋,判断这个位置是否合理,如不合理让玩家重新输入。
// 玩家下棋
void Player_move(char board[][COL], int row, int col)
{
while (1)
{
// 定义坐标
int x = 0; // 行
int y = 0; // 列
printf("输入方法:行 列 \n");
printf("请输入您的坐标(row,col):> ");
scanf("%d %d", &x, &y);
// 判断这个坐标是否在合理范围,行和列均从1开始
if (x >= 0 && x <= row && y >= 0 && y <= col)
{
if (board[x-1][y-1] != ' ')
printf("此位置已有棋子,无法下棋\n");
else
{
board[x-1][y-1] = '*'; // *号代表是玩家下的棋
break;
}
}
else
printf("您输入的坐标不合理,请重新输入\n");
}
}5.电脑下棋
这一步骤是通过一个传入一个随机值来让电脑进行随机下棋。
// 电脑输入
void Computer_move(char board[][COL], int row, int col)
{
while (1)
{
int x = rand() % (row+1);
int y = rand() % (col+1);
//检查电脑下棋的位置是否有棋子
if (board[x - 1][y - 1] != ' ')
continue;
board[x - 1][y - 1] = '#'; // # 为电脑下棋
break;
}
}6.判定输赢
三子棋游戏的输赢是看数组中横、竖、斜的字符是否相等,如果相等就传回其中一个值。如果棋盘已满,则为平手。
// 判断谁胜利
char Win_Name(char board[][COL], int row, int col)
{
// 胜利条件是横排或者竖排或者斜对角线都是相同符号,满足其中一个条件即可
// 玩家胜利
int i, j = 0;
// 判断横排是否相等
for (i = 0; i < row; i++)
{
if (board[i][0] != ' ' && board[i][0] == board[i][1] && board[i][1] == board[i][2]) {
return board[i][0];
}
}
// 判断竖排是否相等
for (i = 0; i < col; i++) {
if (board[0][i] != ' ' && board[0][i] == board[1][i] && board[1][i] == board[2][i]) {
return board[0][i];
}
}
// 判断左斜线是否相等
if (board[0][0] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2]) {
return board[0][0];
}
// 判断右斜线是否相等
if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[1][1] == board[2][0]) {
return board[1][1];
}
return 0;
}
// 判断是否棋满
int Board_Max(char board[][COL], int row, int col)
{
int i, j;
int count = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
if (board[i][j] != ' ')
count++;
}
if (count == row * col)
return 1;
return 0;
}7.头文件
#include <stdio.h>
#include <time.h> // 包含 time
#include <stdlib.h> // 包含 rand、srand
#include <Windows.h> // 包含 Sleep
// 棋盘大小的初始值设置
#define ROW 3
#define COL 3
// 棋盘初始化
void init_Board(char board[][COL],int row,int col);
// 打印棋盘
void Print_Board(char board[][COL], int row, int col);
// 玩家输入
void Player_move(char board[][COL], int row, int col);
// 电脑输入
void Computer_move(char board[][COL], int row, int col);
// 判断谁赢了
char Win_Name(char board[][COL], int row, int col);
// 判断是否棋盘
int Board_Max(char board[][COL], int row, int col);8.主函数
int main()
{
srand((unsigned int)time(NULL)); // 设置随机数
test();
return 0;
}三、总结
进行一个大工程的代码实现,最好就是先理清思路,设计好一个总方案以及具体需要实现的步骤,才能把复杂问题变成简单问题。再写这篇代码之前,可以先看了别人写的代码,了解后再用自己擅长的方式进行填写。
边栏推荐
- OpenMLDB + Jupyter Notebook:快速搭建机器学习应用
- Day 69
- Node 踩坑之80端口被占用
- Js method commonly used objects and attributes
- Day 85
- 微信小程序启动页的实现
- Vscode远程连接服务器终端zsh+Oh-my-zsh + Powerlevel10 + Autosuggestions + Autojump + Syntax-highlighting
- 8-byte standard request parsing during USB enumeration
- 杀死进程-查看防火墙状态
- PyQt5中调用.ui转换的.py文件代码解释
猜你喜欢

Vscode远程连接服务器终端zsh+Oh-my-zsh + Powerlevel10 + Autosuggestions + Autojump + Syntax-highlighting

Tinker接入全流程---编译篇

OpenMLDB官网升级,神秘贡献者地图带你快速进阶

JS进阶网页特效(pink老师笔记)

虚拟机更改IP地址

Interpretation of the paper: Cross-Modality Fusion Transformer for Multispectral Object Detection

nepctf Nyan Cat 彩虹猫

stack stack

buuctf hacknote

Asis2016 books null off by one
随机推荐
OpenMLDB + Jupyter Notebook:快速搭建机器学习应用
Invalid revision: 3.18.1-g262b901-dirty
深度学习Matlab工具箱代码注释
Vscode remote connection server terminal zsh+Oh-my-zsh + Powerlevel10 + Autosuggestions + Autojump + Syntax-highlighting
Day 73
论文解读TransFG: A Transformer Architecture for Fine-grained Recognition
【无标题】
The Summer of Open Source 2022 is coming | Welcome to sign up for the OpenMLDB community project~
函数使用记录
buuctf hacknote
Asis2016 books null off by one
Wonderful linkage | OpenMLDB Pulsar Connector principle and practical operation
helm安装
mysql basic summary
Jetpack use exception problem collection
Js method commonly used objects and attributes
欧拉法解微分方程
JS advanced web page special effects (pink teacher notes)
Pinyougou project combat notes
JVM tuning and finishing