当前位置:网站首页>三子棋游戏实现(c语言)
三子棋游戏实现(c语言)
2022-07-30 05:39:00 【果辰辰果】
我们想要完成一个真正的项目,我们需要先创建一个(test.c)文件存放主函数部分;再创建一个(game.c)文件去完成游戏的基本逻辑;最后,用(game.h)文件来包含我们使用的头文件。
一、三子棋游戏实现的思路
1.创建一个菜单让玩家选择,进入或退出
2.创建一个棋盘并初始化
3.打印棋盘
4.玩家落子
5.电脑落子
6.判断输赢的条件
1.菜单界面
菜单,我们直接使用printf函数来实现。
void menu()
{
printf("**********************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("**********************\n");
}

2.主函数的构建
当我们在游戏结束之后,依然是想玩,我们这里就要用到循环结构。
代码实现
int main()
{
int input = 0;
do
{
menu();
printf("请选择\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
3.创建棋盘
因为我们是三子棋,所以只需要一个3行3列的棋盘
void game()
{
//使用一个二维数组来存放数据
char board[ROW][COL]={
0};
}
此处我们使用了宏定义来初始化棋盘的大小
在“game.h"头文件中声明这个初始化函数
#define ROW 3
#define COL 3
//初始化棋盘
void init_borad(char board[ROW][COL], int row, int col);
在game.c中初始化棋盘
void init_borad(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_borad(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++)
{
//打印数据
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");
}
}
5.玩家落子
二维数组中,直接输入在坐标
这里需要判断,棋盘坐标之前已经是否落过位并且判断输入坐标是否违规
void player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋:>\n");
printf("请输入要下到的坐标:>\n");
scanf("%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("该坐标被占用,请重新输入\n");
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
}
6.电脑落子
我们使用用时间戳来生成一个随机数,并把数控制在0-2之间
因为随机数时间戳只需要产生一次,所以我们放在main函数中
srand((unsigned int)time(NULL));//产生随机数
void computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:>\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
电脑不需要判断,电脑只要在那个位置下不了,那么电脑就会重新产生新的坐标
7.判断输赢
1.玩家赢----->返回 ‘*’
2.电脑赢----->返回’#‘
3.平局-------->返回Q
4.继续--------->返回C
har is_win(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 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];
}
}
for (j = 0; j < col; j++)
{
//判断列
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
{
return board[0][j];
}
}
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_fun(board, row, col) == 1)
{
return 'Q';
}
return 'C';
}
二、总代码
1.game.h
#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
//初始化棋盘
void init_borad(char board[ROW][COL], int row, int col);
//打印棋盘
void display_borad(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);
2.game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void init_borad(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_borad(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++)
{
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;
while (1)
{
printf("玩家下棋:>\n");
printf("请输入要下到的坐标:>\n");
scanf("%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("该坐标被占用,请重新输入\n");
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
}
void computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:>\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
static int is_fun(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++)
{
if (' ' == board[i][j])
{
return 0;
}
}
}
return 1;
}
char is_win(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 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];
}
}
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
{
return board[0][j];
}
}
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_fun(board, row, col) == 1)
{
return 'Q';
}
return 'C';
}
3.test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
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_borad(board, ROW, COL);
display_borad(board, ROW, COL);
while (1)
{
player_move(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
display_borad(board, ROW, COL);
computer_move(board, ROW, COL);
if(ret != 'C')
{
break;
}
display_borad(board, ROW, COL);
}
if (ret == '*')
{
printf("玩家赢\n");
}
if (ret == '#')
{
printf("电脑赢\n");
}
if (ret == 'Q')
{
printf("平局\n");
}
display_borad(board, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
总结
@[email protected]看一遍一定不会吧!!!@ [email protected]
快!快!快!
自己快敲一遍
边栏推荐
猜你喜欢

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

MySQL fuzzy query performance optimization

解决没有配置本地nacos但是一直发生localhost8848连接异常的问题

【飞控开发基础教程9】疯壳·开源编队无人机-PWM(电机控制)

453.最小操作数使数组元素相等

net start mysql MySQL 服务正在启动 . MySQL 服务无法启动。 服务没有报告任何错误。

pytorch中的线性代数

Teach you how to design a CSDN system

MySql fuzzy query Daquan

解决phpstudy无法启动MySQL服务
随机推荐
asyncawait和promise的区别
面试前需要巩固的算法知识点(自用,更新中)
微积分 / 自动求导
MySQL 数据库基础知识(系统化一篇入门)
[Mysql] CONVERT function
PyCharm usage tutorial (more detailed, picture + text)
Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案
Different lower_case_table_names settings for server ('1') and data dictionary ('0') solution
MySQL user authorization
字符串(一) 哈希
mysql time field is set to current time by default
The difference between asyncawait and promise
Ranking of grades (Huazhong University of Science and Technology postgraduate examination questions) (DAY 87)
navicat无法连接mysql超详细处理方法
数据操作 / 数据预处理
list(列表)和array(数组)的区别
Machine Learning - Gradient Descent Optimization - C language implementation
子查询作为检索表时的不同使用场景以及是否需要添加别名的问题
51.N皇后(回溯法)
Learn FPGA from the underlying structure (6) ---- Distributed RAM (DRAM, Distributed RAM)