【C】少年时代的经典游戏:三子棋

编程入门 行业动态 更新时间:2024-10-26 14:29:35

【C】少年时代的<a href=https://www.elefans.com/category/jswz/34/1733711.html style=经典游戏:三子棋"/>

【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】少年时代的经典游戏:三子棋

本文发布于:2023-06-28 00:35:08,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/919146.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:经典游戏   三子   少年   时代

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!