初阶C语言——三子棋

news/2024/10/17 17:25:11/

我们今天讲一个小游戏,三子棋大家应该都玩过吧,就是行和列,或者对角线上有一样大的字符时,就为获胜,今天我们就来写这样的一个代码实现这样的功能

首先我们要创建两个源文件和一个头文件

头文件game.h用来包含我们的头文件和函数的声明以及一些定义
game.c来实现游戏
test.c用来测试我们游戏的逻辑

test.c

#include<stdio.h>
void menu()
{printf("***************\n");printf("****0.exit*****\n");printf("****1.play*****\n");printf("***************\n");
}
void test()
{int input = 0;do{menu();//打印菜单printf("请选择>");scanf("%d", &input);switch(input){case 0:printf("退出游戏\n");break;case 1:printf("进入游戏\n");break;default:printf("请重新选择\n");break;}} while (input);
}
int main()
{test();return 0;
}

我们先实现一个打印菜单的逻辑
在这里插入图片描述
选择1进入游戏,选择0退出游戏,选择其他重新选择
用do while函数的话一上来就打印菜单,满足我们的需求
现在我们要实现游戏选择1完成

下一步我们要创建game()函数来实现三子棋的逻辑
首先我们要初始化棋盘

test.c

void game()
{//存放下棋的数据char board[Row][Col ] = { 0 };//初始化棋盘为空格Initboard(board, Row, Col);
}

game.h

//初始化棋盘
void Initboard(char board[Row][Col], int row, int col);

game.c

void Initboard(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++){board[i][j] = ' ';}}}

初始化棋盘之后我们要打印棋盘,打印棋盘是个井字

game.h

//打印棋盘
void Displayboard(char board[Row][Col], int row, int col);

game.c

void Displayboard(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");}}
}

test.c

//打印棋盘Displayboard(board, Row, Col);

接下来我们要做的就是我们下棋

game.h

//玩家下棋
void play_move(char board[Row][Col], int row, int col);

game.c

void play_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);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");}}}

test.c

play_move(board, Row, Col);//打印棋盘Displayboard(board, Row, Col);

玩家下棋完,我们开始电脑下棋,但是我们在这里电脑下棋完成的只是随机下棋

game.h

void computer_move(char board[Row][Col], int row, int  col);

game.c

void computer_move(char board[Row][Col], int row, int  col)
{int x = 0;int y = 0;printf("电脑下棋\n");while (1){x = rand() % row;y = rand() % col;if (board[x][y] == ' '){board[x][y] = '#';break;}}}

电脑下棋和玩家下棋是一个循环,且随机,这个时候要用到我们的rand函数,同时要用到srand,还有时间戳的这样一个概念,这些都在猜数字里讲过
那我们接下来就是要思考怎么产生x = rand() % row; y = rand() % col;这样产生坐标,思考这个我们需要思考怎么才能判断输赢,判断三子棋的输赢就是对角线或者行和列要满足,那么我们就做这样的一个函数来实现

test.c

while (1){//玩家下棋play_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");}Displayboard(board, Row, Col);//再次打印棋盘
}
*玩家赢
#电脑赢
C平局

完整代码
game.h

#pragma once#include<stdio.h>#define Row 3
#define Col 3
//初始化棋盘
void Initboard(char board[Row][Col], int row,int  col);
//打印棋盘
void Displayboard(char board[Row][Col], int row,int  col);
//玩家下棋
void play_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);

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"void Initboard(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++){board[i][j] = ' ';}}
}
void Displayboard(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 play_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);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)
{int x = 0;int y = 0;printf("电脑下棋\n");while (1){x = rand() % row;y = rand() % col;if (board[x][y] == ' '){board[x][y] = '#';break;}}}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];}}}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
//测试三子棋逻辑#include"game.h"
void game()
{char ret = 0;//存放下棋的数据char board[Row][Col] = { 0 };//初始化棋盘为空格Initboard(board, Row, Col);//打印棋盘Displayboard(board, Row, Col);while (1){//玩家下棋play_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");}Displayboard(board, Row, Col);
}
void menu()
{printf("**************\n");printf("****1.play****\n");printf("****0.exit****\n");printf("**************\n");}
void test()
{int input = 0;do{menu();printf("请选择>");scanf("%d", &input);switch (input){case 0:printf("退出游戏\n");break;case 1:game();break;default :printf("请重新输入\n");break;}} while (input);
}
int main()
{srand((unsigned int)time(NULL));//时间戳test();return 0;
}

今天的小游戏就到这,我们下次再见


http://www.ppmy.cn/news/743030.html

相关文章

Unity 使用最新的官方自带VR系统

自带的vr插件只有头部的追踪设备选择&#xff0c;没用左右手的追踪选择&#xff0c;需要自己更改TrackerDriver这个脚本&#xff0c;使其能够选择左右手&#xff0c;这样&#xff0c;VR 手柄才能使用。

VR拆装(HTC vive Pro开发)——2、项目开发平台、设备、语言、版本控制及本项目使用的插件

项目是基于unity3D 2019.2.1开发。 使用的设备为HTC vive Pro 。 开发语言有&#xff1a;C#&#xff08;入门、基础&#xff09;、shader Lab&#xff08;入门、基础、或直接shader套用现成别人的shader&#xff09; 版本控制先选用的Git代码行控制上传至GitHub&#xff0c;…

vr加盟项目现在怎么样?vr加盟需要多少钱?

随着5G的出现VR技术也频频出现在人们的视野当中&#xff0c;吸引了众多人的关注。对于有创业想法的人而言&#xff0c;5G可谓是一个难得一遇的风口&#xff0c;而vr技术在5G加持下的发展前景也是不可估量的。那么都有哪些vr加盟项目呢&#xff1f;vr加盟项目现在怎么样&#xf…

VR拆装(HTC vive Pro开发)——1、项目功能介绍及分析

博主去年接到一个大创课题“大涵道比涡扇发动机涡轮单元体虚拟拆装系统平台研制”&#xff0c;简单来说就是基于VR头盔对机械零部件进行拆装。任务说明书主要包含了三个部分&#xff0c;拆卸、装配、与认知。课题的定位是教学用具&#xff0c;只能简单地通过VR设备让本专业同学…

htcvr设备计算机配置,VR对电脑配置要求高吗?HTC Vive电脑配置要求

最近有网友问小编这样一个问题&#xff1a;VR对电脑配置要求高吗&#xff1f;关于VR(虚拟现实)设备很多朋友都听过&#xff0c;它可以带来身入其境的沉静式的体验。不过&#xff0c;目前VR设备还处在发展初期&#xff0c;VR设备普遍很贵&#xff0c;并且缺乏这种3D内容。 HTC V…

Unity中配置VR开发环境,添加VRTK开发包(HTC Vive为例,包含资源)

目标&#xff1a;在Unity中配置VR开发环境,导入VRTK开发包&#xff0c;帮助后续VR开发 主要内容&#xff1a; 在Unity中配置VR开发环境步骤如下&#xff1a; 1、 Unity创建空工程&#xff0c;导入SteamVR Pugin&#xff08;资源放在最后&#xff0c;请自行下载&#xff09; …

分享6款优秀的 AR/VR 开源库

今天&#xff0c;为大家推荐几款优秀的 AR/VR 开源库&#xff0c;希望能对大家有所帮助~ 1、AR.js AR.js 是一款应用于 Web 的高效增强现实&#xff08;AR&#xff09;库&#xff0c;基于 three.js jsartoolkit5&#xff0c;无需安装。它适用于任何带有 webgl 和 webrtc 的手机…

kinect 1代 改usb diy 不需要xbox 360 和电源适配器

先准备一根usb数据线&#xff0c;红 黑&#xff0c;蓝 白&#xff0c;共4根线那种;一个路由器上的那种电源座子&#xff1b;一个12v 2a的电源&#xff1b; 剪断kinect的接头&#xff0c;里边一共5根线&#xff0c;红 黑&#xff0c;蓝 白&#xff0c;棕&#xff1b; 把usb跟k…