当前位置:网站首页>C语言练手小项目(巩固加深知识点理解)
C语言练手小项目(巩固加深知识点理解)
2022-06-27 05:43:00 【小张﹉】
目录
前言
大家好,今天给大家带来的是一个C语言的练手的小项目,很多小伙伴在学完C语言一些知识点之后,不知道该如何去验证自己是否真的理解这个知识点,是否可以去运用这个知识点做一些想要进行完成的操作。到了这个时候就应该去做一些小的项目去感受一下自己的掌握的程度,下面就来介绍一下今天给大家带来的小项目。
小项目的介绍
这个小项目是运用C/C++实现一个我们大家应该都玩过的一个小的游戏---三子棋(可以进行扩展到N子棋实现玩家与电脑进行下棋),这个小项目分为三个部分,第一部分为代码的主要实现部分,第二部分是代码的具体函数部分,第三部分是对函数以及头文件的一些声名。 其中运用到了循环,函数以及一些逻辑方面的 操作,可以很好的使我们对这块的知识点进行巩固和练习,提高我们的逻辑思维,下面我们来看一看这个小项目的具体实现:
主体部分
#include"game.h"
int main()
{
//初始化随机值
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
cout << "请选择数字:\n";
cin >> input;
switch (input)
{
case 1:
//三子棋实现的函数
game();
break;
case 0:
cout << "退出成功\n";
break;
default:
cout << "该选项不存在,请重新输入\n";
break;
}
} while (input);
return 0;
}函数的实现部分
#include"game.h"
//菜单函数的实现
void menu()
{
cout << "*****************************\n";
cout << "*******1.play 0.exit********\n";
cout << "*****************************\n";
}
void InitBoard(char board[][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[][COL], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
//打印行
for (j = 0; j < col; j++)
{
//打印列
cout <<" "<<board[i][j]<<" ";
//被限制的打印条件
if (j < col - 1)
{
cout << "|";
}
}
cout << "\n";
//打印分割线
//如果我该行的个数是小于总行数减一的话
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
cout << "---";
//被限制的打印条件
if (j < col - 1)
{
cout << "|";
}
}
}
cout << "\n";
}
}
void PlayerMove(char board[][COL], int row, int col)
{
int x = 0, y = 0;
cout << "玩家下棋\n";
while (1)
{
cout << "请输入坐标\n";
cin >> x >> y;
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
cout << "坐标被占用,请重新下棋\n";
}
}
else
{
cout << "输入有误,请重新输入\n";
}
}
}
void ComeputerMove(char board[][COL], int row, int col)
{
cout << "电脑下棋\n";
int x = 0, y = 0;
x = rand() % row;//范围0—2
y = rand() % col;//范围0—2
while (1)
{
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
else
{
x = rand() % row;//范围0—2
y = rand() % col;//范围0—2
}
}
}
char IsWin(char board[][COL], int row, int col)
{
//行
int i = 0, j = 0, count = 1, x = 0;
char a = 0;
for (i = 0; i < row; i++)
{
x = 0, count = 1;
for (j = 0; j < col; j++)
{
if (board[i][x] == board[i][x + 1] && x < col&&board[i][x]!=' ')
{
a = board[i][x];
count++;
x++;
}
if (count == col)
{
return a;
}
}
}
//列
i = 0, j = 0, count = 1, x = 0;
for (i = 0; i < col; i++)
{
count = 1, x = 0;
for (j = 0; j < row; j++)
{
if (board[x][i] == board[x + 1][i] && x < row&&board[x][i] != ' ')
{
a = board[x][i];
count++;
x++;
}
if (count == row)
{
return a;
}
}
}
//对角线
i = 0, j = 0, count = 0, x = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
x = board[0][0];
if (i == j && board[i][j] == x && x != ' ')
{
a = board[i][j];
count++;
}
}
}
if (count == row)
{
return a;
}
i = 0, j = 0, count = 1;
char y = 0, z = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
y = board[0][row-1];
if (i == j && board[i][j] == y && y != ' '&& board[row - 1][0] == board[i][j] && board[row-1][0]==y)
{
z = board[i][j];
count++;
}
}
}
if (board[row - 1][0] == board[0][row - 1])
{
count++;
}
if (count == row)
{
return z;
}
//到这里的话就是前面的情况都不符合就是说没有人赢
//此时判断平局或者继续
i = 0, j = 0, count = 0, x = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;//未满
}
}
}
return 1;//已满
}
void game()
{
//将二维数组中的元素先初始化为0
char board[ROW][COL] = { 0 };
char ret = 0;
//初始化棋盘
InitBoard(board, ROW, COL);
//打印棋盘
displayBoard(board, ROW, COL);
//下棋
while (1)
{
//玩家下棋
PlayerMove(board, ROW, COL);
displayBoard(board, ROW, COL);
//每次玩家下完棋之后都要进行判断输赢
ret = IsWin(board, ROW, COL);
if (ret != 0)
{
break;
}
//电脑下棋
ComeputerMove(board, ROW, COL);
displayBoard(board, ROW, COL);
//每次电脑下完棋之后也都要进行判断输赢
ret = IsWin(board, ROW, COL);
if (ret != 0)
{
break;
}
}
if (ret == '*')
{
cout << "恭喜您,您赢了!\n";
}
else if (ret == '#')
{
cout << "很遗憾,您输给了电脑\n";
}
else
{
cout << "平局!\n";
}
}头文件以及函数的声名部分
#pragma once
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#define ROW 3
#define COL 3
using namespace std;
//菜单的声名
void menu();
//初始化棋盘
void InitBoard(char board[][COL], int row, int col);
//陈列棋盘
void displayBoard(char board[][COL], int row, int col);
//玩家下棋
void PlayerMove(char board[][COL], int row, int col);
//电脑下棋
//找没有下棋的随机下棋
void ComeputerMove(char board[][COL], int row, int col);
//判断输赢
char IsWin(char board[][COL], int row, int col);
//游戏界面
void game();根据需要进行扩展
#define ROW 3
#define COL 3
//只需在宏定义中对ROW(行)以及COL(列数)进行修改即可运行结果展示

扩展后结果展示
#define ROW 5
#define COL 5
//扩展到5子棋


结束语
到这里这个小项目就结束了,大家可以将代码自己打打运行试一试,如果有什么不理解的地方,大家可以在评论区留言或者可以直接私信我,感谢大家的支持!
边栏推荐
- 洛谷P4683 [IOI2008] Type Printer 题解
- leetcode299周赛记录
- Go log -uber open source library zap use
- 30 SCM common problems and solutions!
- Navigation [machine learning]
- Win 10 如何打开环境变量窗口
- 【FPGA】 基于FPGA分频,倍频设计实现
- 【Cocos Creator 3.5.1】this. node. Use of getposition (this.\u curpos)
- Netease cloud music params and encseckey parameter generation code
- 双位置继电器RXMD2-1MRK001984 DC220V
猜你喜欢

导航【机器学习】

Wechat applet websocket use case

Two position relay hjws-9440

【NIPS 2017】PointNet++:度量空间中点集的深层次特征学习

齐纳二极管 稳压二极管 SOD123封装 正负区分

Web3还没实现,Web5乍然惊现!

How JQ gets the reciprocal elements

LeetCode-515. Find the maximum value in each tree row

Win 10 如何打开环境变量窗口
![Mechanical transcoding journal [17] template, STL introduction](/img/78/926db660139fda3d31cceccad7096c.png)
Mechanical transcoding journal [17] template, STL introduction
随机推荐
Junda technology - centralized monitoring scheme for multi brand precision air conditioners
Neo4j community conflicts with neo4j desktop
Win 10 如何打开环境变量窗口
Spark 之 WholeStageCodegen
【Cocos Creator 3.5.1】坐标的加法
mysql 查询时将状态改为相对应的文字
IAR Systems全面支持芯驰科技9系列芯片
jq怎么获取元素的id名
STM32 reads IO high and low level status
How JQ gets the ID name of an element
【Cocos Creator 3.5.1】event.getButton()的使用
Double position relay jdp-1440/dc110v
Interview: what are the positioning methods in selenium? Which one do you use most?
LeetCode-515. Find the maximum value in each tree row
使用域名转发mqtt协议,避坑指南
Redis4.0新特性-主动内存碎片整理
AD22 gerber files 点开 gerber steup 界面 有问题 官方解决方法
DAST black box vulnerability scanner part 6: operation (final)
Opencv实现对象跟踪
双位置继电器RXMD2-1MRK001984 DC220V