当前位置:网站首页>三子棋游戏——C语言
三子棋游戏——C语言
2022-07-30 05:39:00 【硌手的小虫子@】
目录:
1、菜单界面跳出,选择“ 1. play ”或者“ 0. exit ”。
4、玩家下棋(玩家输入行列坐标:x和y),' * ’表示玩家的落子。
6、判定胜负关系(平局,赢,输),返回' Q ’表示平局,返回 ’ * ‘ 表示玩家赢了,返回 ’ # ‘ 表示电脑赢了。
一、问题定义:
三子棋是黑白棋的一种,是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。
二、问题逻辑:
1、菜单界面跳出,选择“ 1. play ”或者“ 0. exit ”。
2、创建棋盘并初始化。
3、打印棋盘。
4、玩家下棋(玩家输入行列坐标:x和y),' * ’表示玩家的落子。
5、电脑下棋(随机位置落子) ,' # ’表示电脑落子。
6、判定胜负关系(平局,赢,输),返回' Q ’表示平局,返回 ’ * ‘ 表示玩家赢了,返回 ’ # ‘ 表示电脑赢了。
7、返回 ’ C ‘ ,则重新回到菜单。
三、基本步骤:

1、菜单界面:
void menu()
{
printf("*********************************\n");
printf("******** 1. play ********\n");
printf("******** 0. exit ********\n");
printf("*********************************\n");
}2、创建棋盘:
#define ROW 3
#define COL 3
char board[ROW][COL] = { 0 };3、初始化棋盘:
void init_board(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}4、打印棋盘:
void display_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//数据
//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
//---|---|---
if (i < row - 1)
{
//printf("---|---|---");
for (int j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}5、玩家下棋:
void player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋:\n");
while (1)
{
printf("请输入要下棋的坐标:");
scanf("%d %d", &x, &y);
//1.坐标的合法性
//2.坐标是否被占用
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该坐标被占用,请重新输入\n");
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
}6、电脑下棋:
void computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:\n");
//0~32726
//%3-->0~2
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}7、判断游戏状态:
//如果棋盘满了,返回1
//不满,返回0
static int is_full(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char is_win(char board[ROW][COL], int row, int col)
{
for (int 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 (int 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[1][1] != ' ')
{
return board[1][1];
}
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';
}四、结果:
1.玩家胜利:

2.电脑胜利:

3.平局:

五、代码:
#define ROW 3
#define COL 3
#include<time.h>
#include<stdio.h>
#include <stdlib.h>
void init_board(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void display_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//数据
//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
//---|---|---
if (i < row - 1)
{
//printf("---|---|---");
for (int 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");
while (1)
{
printf("请输入要下棋的坐标:");
scanf("%d %d", &x, &y);
//1.坐标的合法性
//2.坐标是否被占用
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该坐标被占用,请重新输入\n");
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
}
//电脑下棋
void computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:\n");
//0~32726
//%3-->0~2
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//如果棋盘满了,返回1
//不满,返回0
static int is_full(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char is_win(char board[ROW][COL], int row, int col)
{
for (int 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 (int 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[1][1] != ' ')
{
return board[1][1];
}
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';
}
void menu()
{
printf("*********************************\n");
printf("******** 1. play ********\n");
printf("******** 0. exit ********\n");
printf("*********************************\n");
}
void game()
{
char ret = 0;
char board[ROW][COL] = { 0 };
init_board(board, ROW, COL);
display_board(board, ROW, COL);
while (1)
{
player_move(board, ROW, COL);
display_board(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
break;
computer_move(board, ROW, COL);
display_board(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
break;
}
if (ret == '*')
printf("玩家赢了\n");
else if (ret == '#')
printf("电脑赢了\n");
else if (ret == 'Q')
printf("平局\n");
display_board(board, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择!\n");
break;
}
} while (input);
return 0;
}
边栏推荐
- It is enough for MySQL to have this article (37k words, just like Bojun!!!)
- 5.6EPOLLONESHOT事件
- 4461. Range Partition (Google Kickstart2022 Round C Problem B)
- “tensorflow.keras.preprocessing“ has no attribute “image_dataset_from_directory“
- PyCharm使用教程(较详细,图+文)
- MySQL的存储过程
- np.argsort()函数详细解析
- [GO Language Basics] 1. Why do I want to learn Golang and the popularization of GO language entry
- Countdown (Source: Google Kickstart2020 Round C Problem A) (DAY 88)
- Different usage scenarios of subqueries as retrieval tables and the question of whether to add aliases
猜你喜欢
随机推荐
MySQL database basics (a systematic introduction)
个人博客系统(附源码)
CISP-PTE Zhenti Demonstration
MySQL的 DDL和DML和DQL的基本语法
MySQL-Explain详解
MySQL (2)
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
It is enough for MySQL to have this article (37k words, just like Bojun!!!)
navicat无法连接mysql超详细处理方法
[Image processing] Image skeleton extraction based on central axis transformation with matlab code
Mysql
进程间的通信方式简介
cnpm安装步骤
Solve phpstudy unable to start MySQL service
Summary of SQL classic interview questions in 2022 (with analysis)
G Bus Count (Google Kickstart2014 Round D Problem B) (DAY 89)
MySql模糊查询大全
【Pytorch】torch.manual_seed()、torch.cuda.manual_seed() 解释
2022 SQL big factory high-frequency practical interview questions (detailed analysis)
【图像处理】基于中轴变换实现图像骨架提取附matlab代码


![[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及](/img/ac/80ab67505f7df52d92a206bc3dd50e.png)






