新手学习C语言,入门小游戏的编写(三子棋)
在学习了一段时间的C语言之后,运用循环嵌套,合理的逻辑思路以及函数的建立和调用,可以尝试着写一个小游戏——三子棋(也可以是n子棋)。
以下是相关的代码以及解释:
一个游戏的建立,不是抬手就去写的,是需要自己反复推敲,不断寻找最优化的逻辑解决方案。在写三子棋的开始,不能像平常刷题一样直接写,需要构建框架,想好之后的每一步该怎么做。
我们在写的时候,不像平常的代码一样,而是需要将该项目的头文件、源文件以及函数分开存放,这样方便以后的更改。
1. test.c文件
该文件中是写该游戏的代码框架主体。
用while循环,如果一直不赢就死循环,一旦有一方赢得游戏,就break跳出循环。
用do-while循环来定义游戏的开始,1或0来开始或结束游戏,否则选择错误,需要重新选择。
#define _CRT_SECURE_NO_WARNINGS#include"game.h"
void menu()
{printf("*****************************\n");printf("***** 1. play 0. exit *****\n");printf("*****************************\n");
}void game()
{char ret = 0;char board[ROW][COL] = { 0 };//初始化棋盘的功能InitBoard(board , ROW , COL);DispalyBoard(board, ROW , COL);//下棋while (1){PlayerMove(board,ROW,COL);//判断输赢ret = IsWin(board,ROW,COL);if (ret != 'C'){break;}DispalyBoard(board, ROW, COL);ComputerMove(board, ROW, COL);//判断输赢ret = IsWin(board, ROW, COL);if (ret != 'C'){break;}DispalyBoard(board, ROW, COL);}if (ret == '*'){printf("玩家赢\n");}else if (ret == '#'){printf("电脑赢\n");}else{printf("平局\n");}DispalyBoard(board, ROW, COL);}
int main()
{srand((unsigned int)time (NULL));//设置随机数的生成起点的int input = 0;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;
}
2. 头文件
将项目所需要引用的头文件以及函数体放在头文件中,这样方便查找以及代码的阅读。定义的棋盘格子数,是可以修改的。
#pragma once#include <stdio.h>
#include <stdlib.h>
#include <time.h>//棋盘的格子数
#define ROW 3
#define COL 3//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);//打印棋盘
void DispalyBoard(char board[ROW][COL], int row, int col);//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);//电脑下棋
//找没有下棋的随机下棋
void ComputerMove(char board[ROW][COL], int row, int col);//
//玩家赢 - '*'
//电脑赢 - '#'
//平局 - 'Q'
//继续 - 'C'
//char IsWin(char board[ROW][COL], int row, int col);
3. game.c文件
这个文件中,完成了每个函数的逻辑。其中包含了定义棋盘,初始化棋盘,玩家下棋,电脑下棋,判断输赢。
(1)在定义棋盘的时候,没有死板的固定写法,这里是用for循环来将棋盘输出,目的是方便修改棋盘的大小;
(2)游戏还需要一个函数来判断棋盘是否满了,如果满了,返回1,游戏重新开始,如果没满,游戏继续;
(3)在判断输赢时,需要考虑三种情况,行、列、对角线,这三种情况,满足一种就可以判断游戏胜出,反之游戏平局,重新选择开始或者退出。
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"//定义棋盘
void InitBoard(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 DispalyBoard(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");//打印分割信息//printf("---|---|---\n");if (i < row - 1){int j = 0;for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}
}//玩家下棋
void PlayerMove(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 ComputerMove(char board[ROW][COL], int row, int col)
{printf("电脑下棋:>\n");int x = 0;int y = 0;while (1){x = rand() % row;//0~2y = rand() % col;//0~2if (board[x][y] == ' '){board[x][y] = '#';break;}}
}//满了就返回1
//不满 返回0
int IsFull(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 IsWin(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][1] != ' '){return board[i][1];//}}//列int j = 0;for (j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' '){return board[1][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 (IsFull(board, row, col)){return 'Q';}//游戏继续return 'C';
}
在写一个游戏的时候,要考虑的往往会很多,不能仅仅只保证游戏可以运行下去,也要保证其他情况的发生会不会影响到程序的安全。
最后附上游戏运行的截图
游戏开始
选择1,游戏开始,玩家下棋,输入坐标
玩家选择1 1坐标,电脑自动下棋
如此反复进行游戏,直到分出胜负为止,游戏重新开始
新手学习C语言,入门小游戏的编写(三子棋)相关推荐
- C语言实现小游戏之井字棋
目录 前言 一.井字棋游戏的主流程 二.游戏部分 1.游戏函数 2.初始化棋盘 3.打印棋盘 4.玩家下棋 5.电脑下棋(两个难度等级) 6.判断游戏是否结束 三. 源码展示 总结 前言 这是我在学习 ...
- 【C语言入门小游戏】三子棋
快点点赞 目录 文本目录 前言 一.游戏整体思路 二.代码实现以及思路 1.棋盘的初始化 2.棋盘的打印 3.玩家下棋 4.电脑自动下棋(智障化下棋) 5.判断输赢 三.代码的运行 前言 相信很多学习 ...
- 《c语言小游戏》入门级三子棋游戏(机器人加强版)
目录 打印界面 初始化数组的值 玩家下棋 判断是否胜利 电脑下棋 今天为大家带来的是一款非常简单的小游戏"三子棋" 首先规则很简单,一行或者一列或者正负对角线都为同子就赢了,管你听 ...
- 【c苑杂坛之小游戏系列】 三子棋游戏
[c苑杂坛之边学边玩] 三子棋游戏带你初识C语言 1.游戏说明 2.效果展示 3.游戏代码 1.游戏说明 三子棋游戏相信大家都知道,在这里不去讲述游戏背景,对本代码实现的三子棋游戏进行一定的说明. 博 ...
- C语言入门小游戏——猜数字游戏(详解)
大家好,我是十一,今天给大家带来"猜数字游戏"的代码和讲解. 目录 前言 基本流程 1.打印菜单 1.1主函数逻辑 2.生成随机数 随机数生成结果 2.1srand函数 2.2时间 ...
- Java实战项目:新手入门小游戏——连连看超详细教程
小伙伴们应该都玩过连连看吧,今天呢叫大家用Java制作一个属于自己的连连看小游戏! 众所周知,想要学好Java光看视频或看书是不行的,一定要动手实践才可以,而且在面试中,面试官也会问你做过些什么项目? ...
- 【从入门到入土系列】C语言制作小游戏-贪吃蛇:Copy+运行即可另附注释
系列文章 本系列持续更新中,欢迎您的访问! 系列简介 本系列由唐文疏撰写,负责记录博主的学习生涯中的一点一滴.独乐乐不如众乐乐,故此分享给大家.欢迎大家一起讨论.学习和批评指点. 博主只是一个普普通通 ...
- c 语言掷骰子游戏,C 语言编程学习: 制作掷骰子小游戏
C 语言编程学习: 制作掷骰子小游戏 问题描述 骰子是一个有六个面的正方体, 每个面分别印有 16 之间的小圆点代表点数. 假设这个游戏的规则是: 两个人轮流掷骰子 6 次, 并将每次投掷的点数累加起 ...
- python入门小游戏代码20行,python入门小游戏代码
python入门可以做的小游戏 1.Python入门拼图小游戏简单介绍:将图像分为m×n个矩形块,并将图像右下角的矩形块替换为空白块后,将这些矩形块随机摆放成原图像的形状. 2.Python入门推箱子 ...
最新文章
- 曝光机与曝光能量_LED曝光机
- 【GoLang】tcmalloc jemalloc
- 1-4 多文档界面处理(3)
- C# 多线程參数传递
- are exo exo是什么歌 we_are exo exo是什么歌 we_EXO we are one
- [转载]DB2数据库移植罕见成绩片面理睬(4)
- Java还有发展前景吗?现在该怎么去学习?
- php的socket,PHP Socket范例
- python中startswith()函数的用法
- 推荐系统-Task03离线物料系统的构建
- VS2013解决error LNK2019: 无法解析的外部符号 mfcs120ud.lib
- Spring Configuration Check Unmapped Spring configuration files found.Please configure Spring facet.
- 提问的智慧/ 如何优雅的提问
- nmap下载安装介绍使用
- 桥式整流电路原理;电感滤波原理;电容滤波原理
- SQL更新(INSERT,UPDATE,DELETE)语句的一般格式及注意事项
- 你的WordPress网站经常被刷恶意搜索词?这有解决办法
- 超高频宽带水声放大器-500kHz至10MHz
- 5年前, 以太坊大脑送给V神一份神秘大礼; 今天, V神将它给了你...
- 图表的绘制(使用Dundas组件)
热门文章
- 校校通php,ZDSoft.net校校通软件平台7.0((8.5日升级版).rar(请使用迅雷)
- PARSEC使用与下载
- windows自带截图键(shift+ win + s)没有反应,一招教你快速解决!
- java基础--Java入门
- 【理解】经典角点检测算法--Harris角点
- THREE.JS 与其他库的对比
- XML文件怎么添加注释
- 大前端CPU优化技术--NEON intrinsics进阶
- 每天撸拼多多纸巾(非广告)
- IDEA2016 license server 激活