目录

  • 一、前言
  • 二、游戏界面
  • 三、游戏逻辑
    • 1.game.h
    • 2.game.c
    • 3.test.c
  • 四、总结

一、前言

这是一个非常简单的三子棋小游戏,学过C语言数组语法的就可以写出来。在这里博主实现的是人机对战,当然你们也可以扩展一下人人对战。代码的逻辑是尽量弄得初学者都容易理解,并且减少了很多复杂的代码。比如,AI电脑选手需要分析棋局然后选择合适的下棋位置,但是给简略了。有失必有得,这里也新学到了生成随机数(rand()rand((unsigned)time(NULL)))这个新的语法点。注意:这里要调用这两个函数必须包含#include<time.h>#include<stdlib.h>这两个头文件。这在之后要做的猜数字游戏和其他游戏中会有很大的用处。话不多说,下来一睹风采吧!

二、游戏界面

在这里的游戏界面框架沿用的上一章中弹跳小球的游戏界面框架,并在此基础上改变了一点文字和颜色总体上是没有多大改变的。在这里就能知道,做一些简单的小游戏,知道一个小游戏如何从无到有是很重要的。框架也不需要刻意去背,只有理解了自己才能写出属于自己的框架。

void menu()//菜单
{system("color 71");//改变全局颜色printf("|----------------------|\n");printf("|      1.开始游戏      |\n");printf("|----------------------|\n");printf("|      2.游戏帮助      |\n");printf("|----------------------|\n");printf("|      3.更新日志      |\n");printf("|----------------------|\n");printf("|      0.退出游戏      |\n");printf("|----------------------|\n");printf("\n");printf("(温馨提醒:请按照菜单相应的选项选择)");printf("\n");printf("请输入你的选择:>");}

运行结果:

这里要详解一下system("color 71")这个函数。要调用这个函数的话就要包含#include<windows.h>这个头文件。color就是颜色的意思,但是后面的71又是什么呢?7是代表背景颜色,1是代表前景颜色。这个你也不需要特别去记忆。只需要win+R打开windows系统的运行窗口,然后输入cmd然后回车,就可实现用户和操作系统的直接交流。这里你也不需要懂操作系统是什么,直接输入color 空格+?然后就可以自己选择你写的程序运行窗口的前景和背景色了。

第一步:

第二步:

三、游戏逻辑

1.game.h

game.h头文件这里新增加的只有生成随机数需要的两个头文件,其他的东西跟弹跳小球的逻辑差不多。这里存放了一些函数的声明。

#include<stdio.h>//C语言输入输出流
#include<windows.h>//windows API
#include<stdlib.h>//生成随机数头文件
#include<time.h>//随机数种子头文件
#include<conio.h>//_getch()头文件#define row 3//行
#define col 3//列char is_win(char arr[row][col], int x, int y);//判断输赢
void conputer_move(char arr[row][col], int x, int y);//电脑走
void player_move(char arr[row][col], int x, int y);//玩家走
void init_chess(char arr[row][col], int x, int y);//初始化数组
void print_chess(char arr[row][col], int x, int y);//打印数组
void update();//更新日志
void game_help();//游戏帮助
void play_game();//开始玩游戏
void menu();//游戏界面

2.game.c

geme.c这个源文件之前在弹跳小球说过,这里主要是放一些函数的实现,也就是函数的定义。博主比较喜欢把函数的声明和定义分开写,这样比较简洁,也容易让别人易懂。这里是打算先解释重要的部分,然后在附上源码。

玩家下棋逻辑:

void player_move(char arr[row][col], int x, int y)
{int x1 = 0;int y1 = 0;printf("(玩家:@)\n");printf("(电脑:#)\n");printf("玩家走:>\n");while (1){printf("请输入坐标:>");scanf_s("%d%d",&x1,&y1);if ((x1>=1&&x1<=row)&&(y1>=1 && y1<=col)){if (arr[x1-1][y1-1]==' '){arr[x1-1][y1-1] = '@';break;}else{printf("坐标已被占用,请重新输入\n");}}else{printf("坐标非法,请重新输入\n");}}
}

电脑下棋逻辑:

void conputer_move(char arr[row][col], int x, int y)
{while (1){int x2 = rand()%x;//0~2int y2 = rand()%y;//0~2if (arr[x2][y2] == ' '){arr[x2][y2] = '#';break;}}
}

注意:假如这里没有输赢的实现逻辑,电脑这里下棋实会发生死循环的。

打印棋盘:

void print_chess(char arr[row][col],int x,int y)//打印棋盘
{for (int i=0;i<x;i++){printf("----|");}printf("\n");for (int i=0;i<x;i++){for (int j=0;j<y;j++){printf(" %c  |",arr[i][j]);}printf("\n");for (int j=0;j<y;j++){printf("----|");}      printf("\n");    }
}

源码:

#include"game.h"//'Q'代表游戏地图满了,也就是平局
//‘C’代表游戏地图没满
//‘@’代表玩家落子
//‘#’代表电脑落子
//2表示棋盘没满--游戏继续
//3表示棋盘满了--平局
static int  find(char arr[row][col], int x, int y)
{for (int i=0;i<x;i++){for (int j=0;j<y;j++){if (arr[i][j]==' '){return 2;}}}return 3;
}
char is_win(char arr[row][col], int x, int y)
{for (int i=0;i<x;i++){for (int j=0;j<y;j++){if ((arr[i][0]==arr[i][1])&&(arr[i][1]==arr[i][2])&&arr[i][0]!=' '){return arr[i][0];}if ((arr[0][j] == arr[1][j]) && (arr[1][j] == arr[2][j]) && arr[0][j] != ' '){return arr[0][j];}}}if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && arr[0][0] != ' '){return arr[1][1];}if ((arr[2][0] == arr[1][1]) && (arr[1][1] == arr[0][2]) && arr[2][0] != ' '){return arr[2][0];}int n = find(arr, x, y);if (3==n){return 'Q';}else{return 'C';}
}
void conputer_move(char arr[row][col], int x, int y)
{while (1){int x2 = rand()%x;int y2 = rand()%y;if (arr[x2][y2] == ' '){arr[x2][y2] = '#';break;}}
}
void player_move(char arr[row][col], int x, int y)
{int x1 = 0;int y1 = 0;printf("(玩家:@)\n");printf("(电脑:#)\n");printf("玩家走:>\n");while (1){printf("请输入坐标:>");scanf_s("%d%d",&x1,&y1);if ((x1>=1&&x1<=row)&&(y1>=1 && y1<=col)){if (arr[x1-1][y1-1]==' '){arr[x1-1][y1-1] = '@';break;}else{printf("坐标已被占用,请重新输入\n");}}else{printf("坐标非法,请重新输入\n");}}
}
void init_chess(char arr[row][col], int x, int y)//初始化棋盘为空格
{for (int i=0;i<x;i++){for (int j=0;j<y;j++){arr[i][j] = ' ';}}
}
void print_chess(char arr[row][col],int x,int y)//打印棋盘
{for (int i=0;i<x;i++){printf("----|");}printf("\n");for (int i=0;i<x;i++){for (int j=0;j<y;j++){printf(" %c  |",arr[i][j]);}printf("\n");for (int j=0;j<y;j++){printf("----|");}      printf("\n");    }
}
static void update_menu()//更新日志菜单
{printf("(暂无)\n");printf("\n");printf("\n");printf("\n");printf("(按1返回,按任意键退出)\n");printf("请选择:>");
}
void update()//更新日志
{update_menu();switch (_getch()){case '1':break;default:exit(0);break;}
}
static void game_help_menu()//游戏帮助菜单
{printf("\n");printf("游戏操作:\n");printf("\n");printf("①:输入相应的坐标点进行下棋\n");printf("\n");printf("  例如:2 3\n  (中间空格or回车都行)\n");printf("\n");printf("!!!输入坐标后请按回车\n");printf("\n");printf("  (温馨提醒:请按标准格式输入)\n");printf("\n");printf("\n");printf("\n");printf("(按1返回,按任意键退出)\n");printf("请选择:>");
}
void game_help()//游戏帮助
{game_help_menu();switch (_getch()){case '1':break;default:exit(0);break;}
}
void play_game()//开始游戏
{char chessboard[row][col] = { 0};init_chess(chessboard, row, col);print_chess(chessboard,row,col);char n = '0';while (1){player_move(chessboard, row, col);system("cls");print_chess(chessboard, row, col);n=is_win(chessboard,row,col);if (n!='C'){break;}conputer_move(chessboard,row,col);system("cls");print_chess(chessboard, row, col);n = is_win(chessboard, row, col);if (n!='C'){break;}}if (n == '@'){printf("游戏结束!!!");MessageBox(NULL, "玩家赢", "提示", MB_OK);        }else if (n=='#'){printf("游戏结束!!!");MessageBox(NULL, "电脑赢", "提示", MB_OK);    }else if(n=='Q'){printf("游戏结束!!!");MessageBox(NULL, "平局", "提示", MB_OK);}}
void menu()//菜单
{system("color 71");printf("|----------------------|\n");printf("|      1.开始游戏      |\n");printf("|----------------------|\n");printf("|      2.游戏帮助      |\n");printf("|----------------------|\n");printf("|      3.更新日志      |\n");printf("|----------------------|\n");printf("|      0.退出游戏      |\n");printf("|----------------------|\n");printf("\n");printf("(温馨提醒:请按照菜单相应的选项选择)");printf("\n");printf("请输入你的选择:>");}

3.test.c

这里放的是一些函数的调用,需要讲的就说随机数的种子放在了这里,因为我们就需要调用一次种子就可以了。主函数里一个do-while循环就可以实现函数借口调用。

#include"game.h"//在这里相当于包含了game.h里面的全部头文件int main()
{srand((unsigned)time(NULL));//生成随机数的种子system("mode con cols=32 lines=16");//控制窗口大小SetConsoleTitle("简单三子棋游戏");do{system("cls");menu();switch (_getch()){case '1':system("cls");play_game();//开始游戏break;case '2':system("cls");game_help();//游戏帮助break;case '3':system("cls");update();//更新日志break;case '0':exit(0);//退出break;default://一个消息机制,用来实现用户输入其他然后提示MessageBox(NULL, "输入有误,请重新输入", "提示", MB_OK);break;}} while ('0');return 0;
}

四、总结

学会怎样在c或者其他任何程序语言中使用这些既有的功能也是学习编程的一门重头戏。

C语言小游戏快速入门--三子棋相关推荐

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

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

  2. C语言小游戏快速入门--弹跳小球

    目录 一.前言 二.弹跳小球的实现 2.1.界面设置 2.2.弹跳逻辑 1. game.h 2. game.c 3. test.c 三.总结 一.前言 相信很多小伙伴在学习完C语言语法之后就想要做几个 ...

  3. C语言小游戏快速入门--推箱子

    目录 一.前言 二.游戏运行环境 三.代码实现逻辑 1. game.h 2. game.c 3. test.c 四.总结 一.前言 这是最简单的推箱子了,非常适合初学者.只需要学会一点数组和函数的知识 ...

  4. C语言小游戏->井字棋

    井字棋想必大家都玩过,今天教大家一个用C语言写一个井字棋小游戏 这个游戏大致可以分为两个部分:游戏菜单和游戏过程. 首先就是创建一个menu()函数来写菜单页面 这里出现了不同指令对应的结果,即输入1 ...

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

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

  6. C语言小游戏之井字棋

    目录 1.游戏菜单 2.实现游戏函数 2.1.初始化棋盘 2.2.打印棋盘 2.3.实现玩家下棋 2.3.实现电脑下棋 ​ 2.4.判断输赢 2.5.判断棋盘是否满 2.6.游戏函数 3.完整代码 3 ...

  7. c语言小游戏----改版斗兽棋

    一.项目背景 此游戏是笔者大二第一学期时受好友之托,重拾c语言编写的小程序,这篇文章主要介绍Game中的游主体逻辑部分.程序主体多用if-else,while,for等关键字,适合c语言初学者阅读,若 ...

  8. Dart语言——45分钟快速入门(下)

    类和对象 类的定义 // Dart中定义一个类 class Person {String name;int age;Person(String name, int age) {this.name = ...

  9. rust放置木箱转向_[易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates]...

    [易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates] 实用知识 装箱crates 我们今天来讲讲装箱技术crates. 什么是crates? 英语翻译是: 英 [kre ...

最新文章

  1. DTU详解解读 概念到功能应用
  2. 脚本-收集计算机信息
  3. libpcap实现机制及接口函数
  4. 从零开始学python数据分析-从零开始学Python数据分析与挖掘 PDF 扫描版
  5. linux查看内存、cpu等硬件信息
  6. css中实现字符超出宽度自动换行和英语字符不断行的解决方法
  7. 【Java】5.5 深入构造器
  8. Python OpenCV——函数 cv2.findContours 运行错误【in function ‘cv::pointSetBoundingRect‘】解决方案
  9. LeetCode 842. 将数组拆分成斐波那契序列(暴力查找)
  10. Tensorflow图像处理以及数据读取
  11. 位置服务器的操作方法,hpproliantml系列服务器上机架操作方法.doc.docx
  12. 光猫上网问题 看我如何解决
  13. php正则表达式替换ubb,自定义ubb代码,preg_replace()函数的一些代码
  14. 微波工程(5)——滤波器
  15. 表面缺陷检测:机器视觉检测技术
  16. linux下python网络编程框架-twisted安装手记,linux编程_Linux下Python网络编程框架安装日志...
  17. 能玩游戏的计算机推荐,电脑玩啥端游合适 适合长期玩的游戏有哪些
  18. 20年前的中国人怎么做3A大作?
  19. 【S-CMS企业建站系统 v5.0 】闪灵CMS+含小程序+响应式布局+支持手机版网站+支持QQ旺旺客服
  20. 做了个护盾出来 哈哈

热门文章

  1. Activiti7工作流流程详解
  2. 两千行PHP学习笔记
  3. 理解HBase面向列存储
  4. 未来8亿人或被AI无情替代,美国这家创业公司能当好“救火队长”?
  5. 隔壁的白富美也在学Shell的本质
  6. 下一代ERP| 业财一体化数字化的架构现代化
  7. 关于torch.cumprod()累积连乘
  8. 应用泛函分析—线性赋范空间
  9. 印度首富与谷歌合作开发低端智能手机,小米要被釜底抽薪?
  10. Java 根据id不同,生成唯一礼包码