【C】少年时代的经典游戏:三子棋
一、首先,什么是三子棋
大家还记得下面这个东西
不同地方的孩纸们可能画的有些区别
如果你不知道什么是三子棋,那么请看下图
二、如何实现三子棋
(1)棋这类题目,一般要知道一下几点:
①二维数组。
一般用二维数组来完成。所有的棋子移动都是二元数组内元素的变化来完成的
②移动问题。
用C语言实现三子棋,要有选点,判断选的点对不对,移动的点是否能移动(好比如说我的棋在那块,你可移动到这把我吃了= =)
③判断获胜的问题。
这一点当然不必多说。
(2)本次实验所遇到的问题
①判断能否从一个点到另一个点就用了N次if else 语句,感觉比较麻烦
②一个点不能覆盖另一个点
③一个点,本来就无路可走了。
可是我选择了这个点,无法返回重新输入了。。。
(3)第三个问题的解决方法
如果选了一个无路可走的棋子,那么。。。重新开始吧
三、一些利用到的小知识点
1、清屏
每次棋子移动后,清理之前的屏幕,再输出来。
2、Sleep函数
每走1步,歇一秒。下棋是一个思考的过程,得有间歇
3、小音乐功能
利用转义字符“\a”的峰鸣声,来实现每走一步提示一下
四、未完成的东西:
1、无路可走棋子的解决问题
2、机器人暂无下棋功能,需手动输入(如果机器人选择了无路可走的棋子,游戏要重新开始多少次啊)
3、If else 用的过多,看起来太费事,而且一不小心就会写错。(之前已经调试N次错误在这个地方)
五、代码块(未完):
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
void Print_Chess();
int check(int x);
void change();
void Play();
void Robort_change();
int che[3][3] = { 1, 1, 1, 0, 0, 0, 2, 2, 2 };//游戏用到的函数为全局变量数组
void Print_Chess()//用来打印棋盘
{system("cls"); //清屏 int i = 0;int j = 0;printf("\t\t=============少年经典三子棋====================\n\n\n");for (; i<3; i++){printf("\t\t\t\t");for (j = 0; j<3; j++){if (che[i][j] == 1)printf("○ ");else if (che[i][j] == 2)printf("● ");else if (che[i][j] == 0)printf("※ ");elsebreak;}printf("\n");}
}
int check(int x)//判断是否有人获胜
{ int a = 1;if (che[0][0] == x){if ((che[0][0] == che[1][1]) && (che[1][1] == che[2][2])){ a = 0;}else if ((che[0][0] == che[1][0]) && (che[1][0] == che[2][0])){a = 0;}else if ((x == 2) && (che[0][0] == che[0][1]) && (che[0][1] == che[0][2])){a = 0;//防止白点在起始位置获胜 }elsea = 1; //没有人赢,返回1 }else if (che[0][1] == x){if ((che[0][1] == che[1][1]) && (che[1][1] == che[2][1]))a = 0;elsea = 1;//没有人赢,返回1 }else if (che[0][2] == x){if (che[1][2] == x && che[2][2] == x)a = 0;else if (che[1][1] == x && che[2][1] == x)a = 0;elsea = 1;}else if (che[1][0] == x){if (che[1][1] == x&&che[1][2] == x)a = 0;elsea = 1;}else if (che[2][0] == x){if (che[2][1] == x&&che[2][2] == x){if (x == 1){printf("%d", x); a = 0;}//不让黑子在起始位置获胜 elsea = 1;}}elsea = 1;return a;
}
void change()//黑棋
{int i = 0;int j = 0;int m = -666;int n = 0;int ch = 0;do{printf("\n玩家1:请输入要移动的棋子的坐标:\n");scanf("%d %d", &i, &j);if (che[i][j] == 2){ printf("\n请输入需要到的坐标:\n"); while (ch == 0){if (m != -666){printf("输入有误,重新开始游戏!");Play();}scanf("%d %d", &m, &n);if (m<0 || n<0 || m>2 || n>2)ch = 0;else if (che[m][n] != 0)ch = 0;else if (m == 0 && n == 0 && i == 1 && j == 1)//从(1,1)走到(0,0) ch = 1;else if (m == 1 && n == 1 && i == 0 && j == 0)//从(0,0)走到(1,1) ch = 1;else if (m == 1 && n == 1 && i == 2 && j == 2)//从(2,2)走到(1,1) ch = 1;else if (m == 2 && n == 2 && i == 1 && j == 1)//从(1,1)走到(2,2)ch = 1;else if (m == 0 && n == 2 && i == 1 && j == 1)//从(1,1)到(0,2)ch = 1;else if (i == 0 && j == 2 && m == 1 && n == 1)//从(0,2)走到(1,1)ch = 1;else if (m == 2 && n == 0 && i == 1 && j == 1)//从(1,1)到(2,0)ch = 1;else if (i == 2 && j == 0 && m == 1 && n == 1)//从(2,0)走到(1,1)ch = 1;else if (i == m && (((j - n) == 1) || ((n - j) == 1)))ch = 1;else if (j == n && (((i - m) == 1) || ((m - 1) == 1)))ch = 1;elsech = 0;}}} while (che[i][j] != 2);che[i][j] = 0;che[m][n] = 2;
}
void Robort_change()//白棋
{int i = 0;int j = 0;int m = -666;int n = 0;int ch = 0;do{printf("\n玩家2:请输入要移动的棋子的坐标:\n");scanf("%d %d", &i, &j);if (che[i][j] == 1){ printf("\n请输入需要到的坐标:\n");while (ch == 0){ if (m != -666){ printf("输入有误,重新开始游戏!");Play();}scanf("%d %d", &m, &n);if (m<0 || n<0 || m>2 || n>2)ch = 0;else if (che[m][n] != 0)ch = 0;else if (m == 0 && n == 0 && i == 1 && j == 1)//从(1,1)走到(0,0) ch = 1;else if (m == 1 && n == 1 && i == 0 && j == 0)//从(0,0)走到(1,1) ch = 1;else if (m == 1 && n == 1 && i == 2 && j == 2)//从(2,2)走到(1,1) ch = 1;else if (m == 2 && j == 2 && i == 1 && j == 1)//从(1,1)走到(2,2) ch = 1;else if (m == 0 && n == 2 && i == 1 && j == 1)//从(1,1)到(0,2)ch = 1;else if (i == 0 && j == 2 && m == 1 && n == 1)//从(0,2)走到(1,1)ch = 1;else if (m == 2 && n == 0 && i == 1 && j == 1)//从(1,1)到(2,0)ch = 1;else if (i == 2 && j == 0 && m == 1 && n == 1)//从(2,0)走到(1,1)ch = 1;else if (i == m && (((j - n) == 1) || ((n - j) == 1)))ch = 1;else if (j == n && (((i - m) == 1) || ((m - i) == 1)))ch = 1;elsech = 0;}}} while (che[i][j] != 1);che[i][j] = 0;che[m][n] = 1;
}
void Play()//开始游戏
{ int num = 0;while (1){Print_Chess();if (num % 2 == 0){change();num++;if (check(2) == 0){ Print_Chess();printf("\n\t\t\t\tThe winner is Black!\n\n\n");break;}}else{ Robort_change();num++;if (check(1) == 0){ Print_Chess();printf("\n\t\t\t\tThe winner is White!\n\n\n");break;}}Sleep(1000);Print_Chess();printf("\a");}
}
int main()
{Print_Chess();Play();system("pause");return 0;
}
六、游戏界面
【C】少年时代的经典游戏:三子棋相关推荐
- 简单小游戏------三子棋
目录 前言 一.整体的逻辑 创建菜单 创建棋盘 打印棋盘 玩家下棋 电脑下棋 判断输赢 整合代码 game.c test.c game.h 总结 前言 经典数组游戏三子棋 一.整体的逻辑 1.创建菜单 ...
- 童年小游戏三子棋(C语言数组实现)
目录 认识游戏 游戏框架 游戏实现 基本构思 棋子 棋盘 下棋 判断输赢 效果展示 全部代码 游戏效果 认识游戏 三子棋是黑白棋的一种.三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉.一条龙.井字棋等 ...
- 利用C语言巧妙实现棋类游戏——三子棋
小游戏:三子棋用C语言实现 你是否学完了C语言的函数.数组.选择结构.循环结构苦于没有实战小项目巩固自己所学的知识呢,今天小程序猿就给大家带来了一个游戏的小游戏--三子棋,利用C语言实现的,希望对大家 ...
- C语言小游戏——三子棋
C语言 -- 三子棋 本篇主要是用二维数组和多个函数来实现三子棋游戏. 让我们先来看看这个编写这个游戏的思路:首先要打印三子棋的棋盘,然后是玩家下棋,电脑下棋,最后判断谁赢了,或者看看是否平局. 我们 ...
- 小游戏--三子棋——N子棋(实现)
三子棋大家应该都不陌生吧 三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉棋.一条龙.井字棋等. 我们今天来一个c语言三子棋的进阶,n子棋的实现过程 1.我们首先可以创建一个三子棋.c源文件,从main ...
- 用c语言实现小游戏三子棋
小游戏之三子棋 小游戏之三子棋 三子棋的基本玩法 游戏制作思路 制作步骤 1.菜单 2.初始化棋盘 3.打印棋盘 4.玩家下棋 5.电脑下棋 6.判断胜利 完整代码 小结 三子棋的基本玩 ...
- 第一个小游戏“三子棋”超详细
三子棋 我们先想一下游戏是怎么玩的??? 打开游戏,进去先看到一个菜单,然后选择是玩游戏还是退出,如果选择玩游戏,那进去是我和电脑玩游戏,我下一步棋,电脑下一步棋,如果我赢了那游戏就结束了,如果电脑赢 ...
- 简易小游戏——三子棋
你好,我是L-may 点我码云 提取代码 游戏介绍 三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉棋.一条龙.井字棋等.游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线 ...
- C语言实现简单游戏 三子棋
对基本C语言的知识有了一定的了解和认识,能够通过C语言编程解决一些简单的问题.使用C语言编程完成一个简单的游戏<三子棋>. 游戏简介:常见的3x3棋盘,有两名游戏玩家,在本版本中实现的效果 ...
最新文章
- 5个无聊透顶的 Python 程序
- 攀枝花市大数据中心落户东区
- hive左关联剔除和where 剔除不一致
- 通过ByteBuffer来操作byte
- 20135127陶俊杰 实验一
- 《PHP对象、模式与实践》之对象
- Linux命令行下载文件百度云盘
- Spring boot initialization failed for https://start.spring.io
- 我的USB入门第一课之读《圈圈教你玩USB》
- 如何在谷歌浏览器官网下载谷歌浏览器32位、64位或其他版本最新的离线安装包?
- PDF破解FileOpenPlugin加密的方法
- 产业分析:2021抖音数据报告
- Carsim 学习心得-粗略翻译1
- css打印适应纸张_CSS print 样式 css控制打印样式 分页 页面大小
- Gerrit添加Verified
- Unity中使用Post Processing 开自发光效果
- 银行软开入职一周年分享
- bat文件打开cmd指向某个目录,并执行命令
- Python tuple()函数
- CBAP.BABOK.商业分析.业务分析.概述