在学习了一段时间的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语言,入门小游戏的编写(三子棋)相关推荐

  1. C语言实现小游戏之井字棋

    目录 前言 一.井字棋游戏的主流程 二.游戏部分 1.游戏函数 2.初始化棋盘 3.打印棋盘 4.玩家下棋 5.电脑下棋(两个难度等级) 6.判断游戏是否结束 三. 源码展示 总结 前言 这是我在学习 ...

  2. 【C语言入门小游戏】三子棋

    快点点赞 目录 文本目录 前言 一.游戏整体思路 二.代码实现以及思路 1.棋盘的初始化 2.棋盘的打印 3.玩家下棋 4.电脑自动下棋(智障化下棋) 5.判断输赢 三.代码的运行 前言 相信很多学习 ...

  3. 《c语言小游戏》入门级三子棋游戏(机器人加强版)

    目录 打印界面 初始化数组的值 玩家下棋 判断是否胜利 电脑下棋 今天为大家带来的是一款非常简单的小游戏"三子棋" 首先规则很简单,一行或者一列或者正负对角线都为同子就赢了,管你听 ...

  4. 【c苑杂坛之小游戏系列】 三子棋游戏

    [c苑杂坛之边学边玩] 三子棋游戏带你初识C语言 1.游戏说明 2.效果展示 3.游戏代码 1.游戏说明 三子棋游戏相信大家都知道,在这里不去讲述游戏背景,对本代码实现的三子棋游戏进行一定的说明. 博 ...

  5. C语言入门小游戏——猜数字游戏(详解)

    大家好,我是十一,今天给大家带来"猜数字游戏"的代码和讲解. 目录 前言 基本流程 1.打印菜单 1.1主函数逻辑 2.生成随机数 随机数生成结果 2.1srand函数 2.2时间 ...

  6. Java实战项目:新手入门小游戏——连连看超详细教程

    小伙伴们应该都玩过连连看吧,今天呢叫大家用Java制作一个属于自己的连连看小游戏! 众所周知,想要学好Java光看视频或看书是不行的,一定要动手实践才可以,而且在面试中,面试官也会问你做过些什么项目? ...

  7. 【从入门到入土系列】C语言制作小游戏-贪吃蛇:Copy+运行即可另附注释

    系列文章 本系列持续更新中,欢迎您的访问! 系列简介 本系列由唐文疏撰写,负责记录博主的学习生涯中的一点一滴.独乐乐不如众乐乐,故此分享给大家.欢迎大家一起讨论.学习和批评指点. 博主只是一个普普通通 ...

  8. c 语言掷骰子游戏,C 语言编程学习: 制作掷骰子小游戏

    C 语言编程学习: 制作掷骰子小游戏 问题描述 骰子是一个有六个面的正方体, 每个面分别印有 16 之间的小圆点代表点数. 假设这个游戏的规则是: 两个人轮流掷骰子 6 次, 并将每次投掷的点数累加起 ...

  9. python入门小游戏代码20行,python入门小游戏代码

    python入门可以做的小游戏 1.Python入门拼图小游戏简单介绍:将图像分为m×n个矩形块,并将图像右下角的矩形块替换为空白块后,将这些矩形块随机摆放成原图像的形状. 2.Python入门推箱子 ...

最新文章

  1. 曝光机与曝光能量_LED曝光机
  2. 【GoLang】tcmalloc jemalloc
  3. 1-4 多文档界面处理(3)
  4. C# 多线程參数传递
  5. are exo exo是什么歌 we_are exo exo是什么歌 we_EXO we are one
  6. [转载]DB2数据库移植罕见成绩片面理睬(4)
  7. Java还有发展前景吗?现在该怎么去学习?
  8. php的socket,PHP Socket范例
  9. python中startswith()函数的用法
  10. 推荐系统-Task03离线物料系统的构建
  11. VS2013解决error LNK2019: 无法解析的外部符号 mfcs120ud.lib
  12. Spring Configuration Check Unmapped Spring configuration files found.Please configure Spring facet.
  13. 提问的智慧/ 如何优雅的提问
  14. nmap下载安装介绍使用
  15. 桥式整流电路原理;电感滤波原理;电容滤波原理
  16. SQL更新(INSERT,UPDATE,DELETE)语句的一般格式及注意事项
  17. 你的WordPress网站经常被刷恶意搜索词?这有解决办法
  18. 超高频宽带水声放大器-500kHz至10MHz
  19. 5年前, 以太坊大脑送给V神一份神秘大礼; 今天, V神将它给了你...
  20. 图表的绘制(使用Dundas组件)

热门文章

  1. 校校通php,ZDSoft.net校校通软件平台7.0((8.5日升级版).rar(请使用迅雷)
  2. PARSEC使用与下载
  3. windows自带截图键(shift+ win + s)没有反应,一招教你快速解决!
  4. java基础--Java入门
  5. 【理解】经典角点检测算法--Harris角点
  6. THREE.JS 与其他库的对比
  7. XML文件怎么添加注释
  8. 大前端CPU优化技术--NEON intrinsics进阶
  9. 每天撸拼多多纸巾(非广告)
  10. IDEA2016 license server 激活