当前位置:网站首页>三子棋
三子棋
2022-07-21 05:04:00 【m0_63784118】
1.在主函数中先打印出菜单
2.定义棋盘的大小 创建二维数组 并且打印出棋盘
将3×3的数组都设为空格 之后的下棋步骤 是替换空格的位置 不是空格的位置不能下棋
打印3×3的数组 并且将棋盘的边线也打印出来 如下图
3.打印出棋盘之后 开始玩家和电脑下棋
双方每下一步棋 打印一次目前棋盘 在输赢之前一直持续 因此做while循环 当一方获胜时退出
![]()
玩家下棋 坐标范围控制在1~3之间 如果不是 则打印”坐标输入错误“
如果是空格 则可以下 如果不是 打印”该坐标被占用“
电脑下棋 随机产生两个数 % 可以将产生的两个数大小控制在0~2之间
然后替换空格 完成则退出 产生的两个数确定的位置被占用 则重新生成两个数
4.判断获胜
//电脑赢--'#'
//玩家赢--'*'
//平局----'Q'
//继续----'C'判断函数如果输出是C 那么说明游戏还未结束
如果不是C 说明有人获胜 或者平局
所以在玩家和电脑下棋之后都应该判断一下
如果三点一线成功 那么返回所在位置的符号 和ret进行比较 是哪方获胜
判断平局函数 :如果所有位置都被占用 且无人获胜 那么返回Q 平局
整体思路顺序就是这样 下方请看所有代码
创建三个源代码 对应下方三部分分别是
将所用到的函数 和头文件在放在 game.h 中
后面两个只需要包含第一个就行 #include"game.h"
头文件
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void Initboard(char board[ROW][COL], int row, int col);//初始化棋盘
void Displayboard(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 );//电脑下棋
char is_win(char board[ROW][COL], int row, int col);//判断输赢
游戏实现顺序
#include"game.h"
void menu()
{
printf("*************************\n");
printf("******** 1.play ********\n");
printf("******** 0.exit ********\n");
printf("*************************\n");
}
void game()
{
char ret;
//存放下棋的数据
char board[ROW][COL] = { 0 };
//初始化棋盘为空格
Initboard(board, ROW, COL);
//打印棋盘
Displayboard(board, ROW, COL);
while (1) {
//玩家下棋
player_move(board, ROW, COL);
Displayboard(board, ROW, COL);
//判断输赢
ret=is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑下棋
computer_move(board, ROW, COL);
Displayboard(board, ROW, COL);
//判断输赢
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '#')
{
printf("电脑赢!\n");
}
else if (ret == '*')
{
printf("玩家赢!\n");
}
else
printf("平局!\n");
}
//电脑赢--'#'
//玩家赢--'*'
//平局----'Q'
//继续----'C'
void test()
{
int input;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:");
scanf_s("%d", &input);
switch (input)
{
case 1:
game();//菜单
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
游戏的各部分功能实现
#include"game.h"
void Initboard(char board[ROW][COL], int row, int col)
{
int i;
for (i = 0; i < ROW; i++)
{
int j;
for (j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
void Displayboard(char board[ROW][COL], int row, int col)
{
int i;
for (i = 0; i < ROW; i++)
{
//打印数据
int j;
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;
printf("玩家下棋\n");
printf("请输入坐标:");
while (1)
{
scanf_s("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 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] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//判断是否平局
int is_full(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;
}
}
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];
break;
}
}
//判断列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
break;
}
}
//对角线
if (board[1][1] == board[2][2] && board[0][0] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//判断平局
if (is_full(board,row,col) == 1)
{
return 'Q';
}
//继续
return 'C';
}
边栏推荐
猜你喜欢
[PCB] modify the default settings for items such as (via) (text string) (wiring linear dimension) in Altium designer
Pytorch installation
1019数字黑洞
5. Paddlepaddle 10 lines of code deep learning image classification (cifar)
Glory mobile refrigerator app activation
【PCB】基于合泰HT32F52352芯片电路板绘制实验(WiFi及光传感模块)-画板笔记
Pre training and fine tuning of Google Bert model for beginners
Hetai 32 onenet WiFi module - Hetai MCU data cloud through mqtt protocol (II)
[PCB] production document sorting and output of circuit board drawing notes -- drawing board notes
合泰HT32--淘晶驰TJC--T0串口屏学习笔记(二)
随机推荐
做题引发对getchar()的理解
(笔记)吴恩达深度学习L4W2
力扣中 26.删除有序数组中的重复项 88.合并两个有序数组 和189.旋转数组
Operating instructions for opt101 monolithic photodiode and single power supply mutual resistance amplifier
[PCB] Based on Hetai ht32f52352 chip circuit board drawing experiment (WiFi and optical sensor module) - drawing board notes
Open3d官网代码学习
语义分割、实例分割
ESP8266固件下载及烧录(收录AT固件下载地址+固件烧录注意事项)
scanf 详解 - 你所不知道的scanf用法
《C语言》2022山西专升本C语言知识点
[PCB] modify the default settings for items such as (via) (text string) (wiring linear dimension) in Altium designer
Pytorch Basics
[C language] some commonly used string functions -- learning notes
PointNet++S3DIS数据集训练报错记录
1024 scientific counting method
深度剖析 string —— strcpy & strncpy
深度剖析 string —— strchr & strstr
合泰HT32 & 淘晶驰TJC--T0串口屏学习笔记
使用Arduino搭建基于阿里云平台的物联网智能家居
1012 digital classification