经典游戏:三子棋"/>
【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】少年时代的经典游戏:三子棋
发布评论