当前位置:网站首页>三子棋游戏实现(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]
快!快!快!
自己快敲一遍
边栏推荐
猜你喜欢

Error: listen EADDRINUSE: address already in use 127.0.0.1:3000

It is enough for MySQL to have this article (37k words, just like Bojun!!!)

MySQL 用户授权

406.根据身高重建队列

2022年比若依更香的开源项目

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

mysql time field is set to current time by default

650.只有两个键的键盘(动态规划)

net start mysql MySQL service is starting. MySQL service failed to start.The service did not report any errors.

More fragrant open source projects than Ruoyi in 2022
随机推荐
4461. 范围分区(Google Kickstart2022 Round C Problem B)
net start mysql MySQL 服务正在启动 . MySQL 服务无法启动。 服务没有报告任何错误。
MySQL user authorization
417.太平洋大西洋水流问题
互斥量解决线程同步问题
手把手教你设计一个CSDN系统
Navicat new database
cmd(命令行)操作或连接mysql数据库,以及创建数据库与表
排列数字(DAY90)dfs
每日练习------输出一个整数的二进制数、八进制数、十六进制数。
MySQL 有这一篇就够(呕心狂敲37k字,只为博君一点赞!!!)
PyCharm使用教程(较详细,图+文)
asyncawait和promise的区别
【Koltin Flow(一)】五种创建flow的方式
create-nuxt-app创建出来的项目没有server
MySQL笔记(pymysql)
406.根据身高重建队列
机器学习—梯度下降Gradient Descent Optimization—c语言实现
mysql time field is set to current time by default
相对路径和绝对路径的区别