当前位置:网站首页>三子棋游戏——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;
}
边栏推荐
- MySql的初识感悟,以及sql语句中的DDL和DML和DQL的基本语法
- [Image detection] Research on cumulative weighted edge detection method based on grayscale image with matlab code
- 5.6EPOLLONESHOT事件
- 2022年SQL经典面试题总结(带解析)
- 5.5线程池
- C语言指针(指针数组、数组指针、函数指针、传参、回调函数等)超详细
- Different usage scenarios of subqueries as retrieval tables and the question of whether to add aliases
- My first understanding of MySql, and the basic syntax of DDL and DML and DQL in sql statements
- cmd (command line) to operate or connect to the mysql database, and to create databases and tables
- 384.打乱数组
猜你喜欢

pytorch中的线性代数

MySQL 用户授权

cmd(命令行)操作或连接mysql数据库,以及创建数据库与表

MySQL 灵魂 16 问,你能撑到第几问?

Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案

ezTrack-master使用教程

934.最短的桥(广度优先搜索)

从底层结构开始学习FPGA(6)----分布式RAM(DRAM,Distributed RAM)

50道SQL练习题(刷完直接进大厂)

MySQL Soul 16 Questions, how many questions can you last?
随机推荐
2022年SQL大厂高频实战面试题(详细解析)
SOA(面向服务架构)是什么?
海量号码需要保存,如何才能尽可能少地占用内存?
np.argsort()函数详细解析
Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案
[Mysql] DATEDIFF函数
pytorch中的线性代数
453.最小操作数使数组元素相等
Numpy 中 np.vstack() 和 np.hstack() 简单解析
5.6EPOLLONESHOT事件
ClickHouse 数据插入、更新与删除操作 SQL
Teach you how to design a CSDN system
It is enough for MySQL to have this article (37k words, just like Bojun!!!)
More fragrant open source projects than Ruoyi in 2022
What is SOA (Service Oriented Architecture)?
cookie和session区别
Socket通信编程
Qt实现单击或双击QTableWidge/View表头进行排序
【线性神经网络】线性回归 / 基础优化方法
[详解C语言]一文带你玩转数组