提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
改五子棋是后期改为用数据结构算法里面的顺序表来实现的,可以参考一下
可以实现三种模式,人vs人,人vs电脑,人vs人vs电脑
提示:以下是本篇文章正文内容,下面案例可供参考
一、流程
1.菜单界面
system("title ikun");//给窗口命名
color(6);//字体换颜色 //目前有问题,两个弄起来会覆盖一个
system("color e0");//给背景换色
caidan();
void caidan() {
//system("pause");
system("cls");
Pos(40, 6);
printf("1.菜单界面实现\n");
Pos(35, 7);
printf("******************************\n");
Pos(35, 8);
printf("********输入0退出游戏*********\n");
Pos(35, 9);
printf("********输入1(人对战人)******\n");
Pos(35, 10);
printf("********输入2(人对战电脑)****\n");
Pos(35, 11);
printf("********输入3(人对人对电脑)****\n");
Pos(35, 12);
printf("********输入其他奖励再来亿次**\n");
Pos(35, 13);
printf("******************************\n");
Pos(35, 14);
printf("请作出你的选择\n");
Pos(35, 15);
}
void welcometogame() { //开始界面
Pos(40, 12);//空出40列12行
//system("title 贪吃蛇游戏");//??
printf("阿祥玩五子棋");
//Pos(40, 25);//在空40列和25行
Pos(40, 25);//在空40列和25行
system("pause");
system("cls");
Pos(40, 12);
//printf("用↑.↓.←.→分别控制蛇的移动 \n");
printf("欢迎来到五子棋游戏!");
Pos(40, 25);//清空上面的内容,从这里入手
//printf("F1 为加速,F2 为减速加速将能得到更高的分数。\n");
Pos(40, 25);
system("pause");
system("cls");
}
void Pos(int x, int y) { //设置光标位置
COORD pos;
HANDLE hOutput;
pos.X = x;
pos.Y = y;
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput, pos);
}
void color(short x) { //自定义函根据参数改变颜色
if (x >= 0 && x <= 15) //参数在0-15的范围颜色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x); //只有一个参数,改变字体颜色
else//默认的颜色白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //颜色设置
//注:SetConsoleTextAttribute是一个API(应用程序编程接口)
}
2.创建棋盘
//棋盘的初始化
void chushihua(sqlist &L, int row, int col)
{
//目的实现三子棋的九方格全为空的格式
int i = 0, j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
L.elem->zf[i][j] = ' '; //放入空格
}
}
}
void dayinqp(sqlist &L, int row, int col) {
int i = 0, j = 0;
//3.继续优化写法
//思路 是将%c|弄为一个组,前面再弄一个|吧 ,梅达到最后一次记得换行 ,然后在外面补一个分割行
//printf("+---+---+---+\n");
//这个算法可以实现格式各样的格子了
for (j = 0; j < col; j++) { //这个在首行弄封闭
//if (j == 0)
//printf("|");
printf("- %d ", j + 1);//设置行标
//if (j < col)
//printf("+");
}
printf("-\n");
for (i = 0; i < row; i++) {
if (i < 10) {
printf("%d", i + 1); //在这里设置列标
}
if (i > 10 && i < row) {
printf("%d ", i + 1);//弄这个为了超过10x10后对齐问题
}
for (j = 0; j < col; j++)
{
//if (j == 0) //在前面来一个竖线封
//printf("%d", );
//打印一行的数据
printf(" %c ", L.elem->zf[i][j]);
if (j < 10)
printf("|");
if (j >= 10 && j < col)
printf("|");
}
printf("\n");
if (i < row) {
for (j = 0; j < col; j++) {
if (j == 0) //前面打印 |封闭
printf("|");
printf("---");
if (j < col)
printf("+");
}
printf("\n");
}
}
}
3.玩家落子
void wanjia(sqlist L, int row, int col) {
//1.接下来就得判断输入的坐标是否在棋盘的范围内,因为下棋的人可能不懂棋盘的范围
//2.也得考虑 那个位置是否已经下了
int y = 0, x = 0;
int e = rand() % 15;
while (1) {
//printf("棋盘大小范围为3x3的大小,请勿超出范围\n");
//printf("请输入你要落棋的位置:(横纵坐标)\n");
printf("玩家1出手\n");
scanf("%d%d", &x, &y);
color(e);
if (x >= 1 && x <= row && y >= 1
&& y <= col) { //在这里为啥要大于等于1;因为,程序员非正常人的思维,正常人不懂这个的话,肯定从1开始输入
//判断这个位置是否为空,为空则放入棋子,若不是空,则else提醒已经有人
if (L.elem->zf[x - 1][y - 1] == ' ') { //在这里x-1相当于x=0;也就是让x=0=x=1;对应上面的x=1;
L.elem->zf[x - 1][y - 1] = '*';
break;
} else {
printf("靓仔或者靓女,这个位置已经有人了,到别处坐坐\n");
}
} else
printf("您输入的坐标并不在棋盘的范围内,请重新输入\n");
}
system("cls");
}
4.电脑落子
void diannao(sqlist &L, int row, int col) {
int x = 0;
int y = 0;
//printf("玩家1出手\n");
//x=rand()%row;//磨横纵保证范围在0到2的范围
//y=rand()%col;
//这个范围的话已经确定了不用去判断是否超出,只需判断是否为空
int u = rand() % 15;
while (1) {
//我知道为啥会卡死,因为这两个随机数放在循环外面,虽然不知道为啥要放在里面,但必须放里面才对
x = rand() % row; //磨横纵保证范围在0到2的范围
y = rand() % col;
color(u);
//printf("ok\n");//这个拿来调试看看哪步有问题
if (L.elem->zf[x][y] == ' ') { //在这里因为是电脑操作不需要人为因此不用设置x-1形式
L.elem->zf[x][y] = '@';
//printf("ok\n");
break;
//continue;
}
}
//printf("ok\n");
//system("cls");
}
5.判断胜负
char jieju(sqlist &L, int row, int col) {
//赢的也就是四种情况,水平,竖直,左斜,右斜,连三个
//扩大棋盘的重要算法 要找到3个相邻的就可以赢了
//对就行判断
//行,其实就得从0开始循环检查一行是否有毛病
int count = 0;
for (int i = 0; i < row; i++ ) { //记录行
count = 0;//何用?//用来记录连续的情况,每行的初始化,每行都要进行搜索,看看在哪里符合条件
for (int j = 0; j < col - 1; j++) {
if (L.elem->zf[i][j] == L.elem->zf[i][j + 1] && L.elem->zf[i][j] != ' ') { //两个子相等并且不是空格
count++;//符合则加1
if (count == qqq - 1) { //在这里起码两个相等,也就是count=2即为3个棋相等才会获胜
return L.elem->zf[i][j]; //如果有两队棋子相等则返回棋子的内容,判定输赢
}
} else {
//假如循环了一行下去依然没有找到三个相等的话则重新设置count=0
count = 0;//用于一行里面的重置作用吧
}
}
}
//列列玩列的判断
for (int i = 0; i < col; i++) {//这个代表列的意思的唔,对每一列进行判断是否有三行是连续相等的
count = 0;
for (int j = 0; j < row - 1; j++) {
if (L.elem->zf[j][i] == L.elem->zf[j + 1][i] && L.elem->zf[j][i] != ' ' ) {
count++;
if (count == qqq - 1) { //再次进行判断是否满足两次相等
return L.elem->zf[j][i];
}
} else {
count = 0; //重置
}
}
}
//正正对对角的判断******
for (int i = 0; i < row - 2; i++) { //正对角符合i+1和j+1,行和列都得变化,留两个空
//int tmpi = i;
//count=0;这个时候不能在这里重置了,要在下面,因为行和列得变化
for (int j = 0; j < col - 2; j++) { //改变这个就是改变了一开始的正对角的路线
//int tmpj = j;
count = 0;
while (1) { //在这里面相当于就是检验除了中心对角线外的其他正对角的判断
if (L.elem->zf[i][j] == L.elem->zf[i + 1][j + 1] && L.elem->zf[i][j] != ' ' ) {
count++;
if (count == qqq - 1) {
return L.elem->zf[i][j];
} else {
i++;
j++;
}
} else {
count = 0; //重置
break;
}
}
//j = tmpj;
}
//i = tmpi;
}
//斜对角斜对角
//列要从最大开始查,其实两个都可以.画图就可以知道了,i>1;下面i要-1,i最小为2嘛
for (int i = row - 1; i > 1; --i) {
for (int j = 0; j < col - 2; j++) { //这个-2才满足3个子吧
count = 0;
while (1) {
//这个i-1和j+1可以理解的,斜对角,行-1,列加1
if (L.elem->zf[i][j] == L.elem->zf[i - 1][j + 1] && L.elem->zf[i][j] != ' ' ) {
count++;
if (count == qqq - 1) {
return L.elem->zf[i][j];
} else {
i--;
j++;
}
} else {
count = 0;
break;
}
}
}
}
//判断平局
int a = pingju(L, ROW, COL);
if (a == 1) {
return 'p';
}
}
二、总代码实现
//自己敲一个
//思路
//一、问题描述
//二、基本流程
//三、步骤
//1.菜单界面
//2.创建棋盘
//3.棋盘初始化
//4.打印棋盘
//(1)简陋方法:
//(2)美观方法:
//5.玩家落子
//6.电脑落子
//7.判断胜负
//四、结果演示
//1.玩家胜利
//2.电脑胜利
//3.和棋
//一、改装
//1.改为加入数据结构算法
//1.2把数组改为栈或者顺序表这种
//1.3开始改装,定义一个顺序表,和一个存储字符类型的结构图变量,搞为二维数组
//1.4后面的改一下传参就可以了
//****2.1把电脑优化,变成强大的ai
//3.改为五子棋或者四子棋
//3.1把棋盘的大小弄更大,然后为了方便寻找位置输入坐标,在棋盘的上头和左侧都做好标记;
//3.2
//有个新思路,就是弄一个提问,问选择对战方式,1为人对人,2为人打人机
//4.扩大棋盘的大小
//4.1主改赢的函数
//4.2改的就是判断相邻的三个数才可以赢
//4.3弄一个类似于邻接矩阵的棋盘,便于玩家更好的找到坐标落棋
//4.4
//5.韦哥的想法,改为双人机对战
//********开始改装为五子棋*****
//1.棋盘的初始化不用改,打印不成问题
//2.输赢方面还是留着三子棋的输赢规则,这个要改为五子棋的玩法规则
//3.
#include <stdio.h>
//改变棋盘的大小规格
#define ROW 9//宏定义
#define COL 9//在这里弄方便后期改变
//小bug 目前还没修好超过10行和10列的排列问题
//改变n个棋获胜的变量
#define qqq 3
#define MAXSIZE 100
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <windows.h>
#include <stdlib.h>//rand的头文件
#include <time.h>//time头文件
//放在主函数的上头
typedef struct {
char zf[20][20];//类似于二维数组,用于绘制棋盘,给落子输入,重点
int qt;
} sz;
typedef struct {
sz *elem;//顺序表基地址,引用上面的sz结构体;
int length;
} sqlist;
void Pos(int x, int y) { //设置光标位置
COORD pos;
HANDLE hOutput;
pos.X = x;
pos.Y = y;
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput, pos);
}
void color(short x) { //自定义函根据参数改变颜色
if (x >= 0 && x <= 15) //参数在0-15的范围颜色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x); //只有一个参数,改变字体颜色
else//默认的颜色白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //颜色设置
//注:SetConsoleTextAttribute是一个API(应用程序编程接口)
}
void welcometogame() { //开始界面
Pos(40, 12);//空出40列12行
//system("title 贪吃蛇游戏");//??
printf("阿祥玩五子棋");
//Pos(40, 25);//在空40列和25行
Pos(40, 25);//在空40列和25行
system("pause");
system("cls");
Pos(40, 12);
//printf("用↑.↓.←.→分别控制蛇的移动 \n");
printf("欢迎来到五子棋游戏!");
Pos(40, 25);//清空上面的内容,从这里入手
//printf("F1 为加速,F2 为减速加速将能得到更高的分数。\n");
Pos(40, 25);
system("pause");
system("cls");
}
void gamestart() { //游戏初始化
//system("mode con cols=100 lines=30");
welcometogame();
}
//int diannao(char qipan[ROW][COL],int row,int col)
void diannao(sqlist &L, int row, int col) {
int x = 0;
int y = 0;
//printf("玩家1出手\n");
//x=rand()%row;//磨横纵保证范围在0到2的范围
//y=rand()%col;
//这个范围的话已经确定了不用去判断是否超出,只需判断是否为空
int u = rand() % 15;
while (1) {
//我知道为啥会卡死,因为这两个随机数放在循环外面,虽然不知道为啥要放在里面,但必须放里面才对
x = rand() % row; //磨横纵保证范围在0到2的范围
y = rand() % col;
color(u);
//printf("ok\n");//这个拿来调试看看哪步有问题
if (L.elem->zf[x][y] == ' ') { //在这里因为是电脑操作不需要人为因此不用设置x-1形式
L.elem->zf[x][y] = '@';
//printf("ok\n");
break;
//continue;
}
}
//printf("ok\n");
//system("cls");
}
//玩家2落棋
void wanjia2(sqlist &L, int row, int col) {
//1.接下来就得判断输入的坐标是否在棋盘的范围内,因为下棋的人可能不懂棋盘的范围
//2.也得考虑 那个位置是否已经下了
int y = 0, x = 0;
int t = rand() % 15;
while (1) {
//printf("棋盘大小范围为3x3的大小,请勿超出范围\n");
//printf("请输入你要落棋的位置:(横纵坐标)\n");
scanf("%d%d", &x, &y);
color(t);
if (x >= 1 && x <= row && y >= 1
&& y <= col) { //在这里为啥要大于等于1;因为,程序员非正常人的思维,正常人不懂这个的话,肯定从1开始输入
//判断这个位置是否为空
if (L.elem->zf[x - 1][y - 1] == ' ') { //在这里x-1相当于x=0;也就是让x=0=x=1;对应上面的x=1;
L.elem->zf[x - 1][y - 1] = 'o';
break;
} else {
printf("靓仔或者靓女,这个位置已经有人了,到别处坐坐\n");
}
} else
printf("您输入的坐标并不在棋盘的范围内,请重新输入\n");
}
system("cls");
}
//下满了就平局
int pingju(sqlist L, int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (L.elem->zf[i][j] == ' ')
return 0;
}
}
return 1;
}
char jieju(sqlist &L, int row, int col) {
//赢的也就是四种情况,水平,竖直,左斜,右斜,连三个
//扩大棋盘的重要算法 要找到3个相邻的就可以赢了
//对就行判断
//行,其实就得从0开始循环检查一行是否有毛病
int count = 0;
for (int i = 0; i < row; i++ ) { //记录行
count = 0;//何用?//用来记录连续的情况,每行的初始化,每行都要进行搜索,看看在哪里符合条件
for (int j = 0; j < col - 1; j++) {
if (L.elem->zf[i][j] == L.elem->zf[i][j + 1] && L.elem->zf[i][j] != ' ') { //两个子相等并且不是空格
count++;//符合则加1
if (count == qqq - 1) { //在这里起码两个相等,也就是count=2即为3个棋相等才会获胜
return L.elem->zf[i][j]; //如果有两队棋子相等则返回棋子的内容,判定输赢
}
} else {
//假如循环了一行下去依然没有找到三个相等的话则重新设置count=0
count = 0;//用于一行里面的重置作用吧
}
}
}
//列列玩列的判断
for (int i = 0; i < col; i++) {//这个代表列的意思的唔,对每一列进行判断是否有三行是连续相等的
count = 0;
for (int j = 0; j < row - 1; j++) {
if (L.elem->zf[j][i] == L.elem->zf[j + 1][i] && L.elem->zf[j][i] != ' ' ) {
count++;
if (count == qqq - 1) { //再次进行判断是否满足两次相等
return L.elem->zf[j][i];
}
} else {
count = 0; //重置
}
}
}
//正正对对角的判断******
for (int i = 0; i < row - 2; i++) { //正对角符合i+1和j+1,行和列都得变化,留两个空
//int tmpi = i;
//count=0;这个时候不能在这里重置了,要在下面,因为行和列得变化
for (int j = 0; j < col - 2; j++) { //改变这个就是改变了一开始的正对角的路线
//int tmpj = j;
count = 0;
while (1) { //在这里面相当于就是检验除了中心对角线外的其他正对角的判断
if (L.elem->zf[i][j] == L.elem->zf[i + 1][j + 1] && L.elem->zf[i][j] != ' ' ) {
count++;
if (count == qqq - 1) {
return L.elem->zf[i][j];
} else {
i++;
j++;
}
} else {
count = 0; //重置
break;
}
}
//j = tmpj;
}
//i = tmpi;
}
//斜对角斜对角
//列要从最大开始查,其实两个都可以.画图就可以知道了,i>1;下面i要-1,i最小为2嘛
for (int i = row - 1; i > 1; --i) {
for (int j = 0; j < col - 2; j++) { //这个-2才满足3个子吧
count = 0;
while (1) {
//这个i-1和j+1可以理解的,斜对角,行-1,列加1
if (L.elem->zf[i][j] == L.elem->zf[i - 1][j + 1] && L.elem->zf[i][j] != ' ' ) {
count++;
if (count == qqq - 1) {
return L.elem->zf[i][j];
} else {
i--;
j++;
}
} else {
count = 0;
break;
}
}
}
}
//判断平局
int a = pingju(L, ROW, COL);
if (a == 1) {
return 'p';
}
}
//玩家落棋
void wanjia(sqlist L, int row, int col) {
//1.接下来就得判断输入的坐标是否在棋盘的范围内,因为下棋的人可能不懂棋盘的范围
//2.也得考虑 那个位置是否已经下了
int y = 0, x = 0;
int e = rand() % 15;
while (1) {
//printf("棋盘大小范围为3x3的大小,请勿超出范围\n");
//printf("请输入你要落棋的位置:(横纵坐标)\n");
printf("玩家1出手\n");
scanf("%d%d", &x, &y);
color(e);
if (x >= 1 && x <= row && y >= 1
&& y <= col) { //在这里为啥要大于等于1;因为,程序员非正常人的思维,正常人不懂这个的话,肯定从1开始输入
//判断这个位置是否为空,为空则放入棋子,若不是空,则else提醒已经有人
if (L.elem->zf[x - 1][y - 1] == ' ') { //在这里x-1相当于x=0;也就是让x=0=x=1;对应上面的x=1;
L.elem->zf[x - 1][y - 1] = '*';
break;
} else {
printf("靓仔或者靓女,这个位置已经有人了,到别处坐坐\n");
}
} else
printf("您输入的坐标并不在棋盘的范围内,请重新输入\n");
}
system("cls");
}
//打印棋盘
void dayinqp(sqlist &L, int row, int col) {
int i = 0, j = 0;
//3.继续优化写法
//思路 是将%c|弄为一个组,前面再弄一个|吧 ,梅达到最后一次记得换行 ,然后在外面补一个分割行
//printf("+---+---+---+\n");
//这个算法可以实现格式各样的格子了
for (j = 0; j < col; j++) { //这个在首行弄封闭
//if (j == 0)
//printf("|");
printf("- %d ", j + 1);//设置行标
//if (j < col)
//printf("+");
}
printf("-\n");
for (i = 0; i < row; i++) {
if (i < 10) {
printf("%d", i + 1); //在这里设置列标
}
if (i > 10 && i < row) {
printf("%d ", i + 1);//弄这个为了超过10x10后对齐问题
}
for (j = 0; j < col; j++)
{
//if (j == 0) //在前面来一个竖线封
//printf("%d", );
//打印一行的数据
printf(" %c ", L.elem->zf[i][j]);
if (j < 10)
printf("|");
if (j >= 10 && j < col)
printf("|");
}
printf("\n");
if (i < row) {
for (j = 0; j < col; j++) {
if (j == 0) //前面打印 |封闭
printf("|");
printf("---");
if (j < col)
printf("+");
}
printf("\n");
}
}
}
//棋盘初始化,全部置空
void chushihua(sqlist &L, int row, int col)
{
//目的实现三子棋的九方格全为空的格式
int i = 0, j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
L.elem->zf[i][j] = ' '; //放入空格
}
}
}
void game(sqlist &L, int y) {
//printf("%d\n", y);
//开始弄棋盘,九宫格的样式,二维数组便于填坐标
//printf("2.创建棋盘\n");
//char qipan[ROW][COL] = {0}; //rou行坐标,col纵坐标..-这个用顺序表代替
//printf("3.初始化棋盘\n");
//system("cls");
chushihua(L, ROW, COL);
//printf("4.打印棋盘\n");
dayinqp(L, ROW, COL);
printf("玩家1落棋\n");
printf("请在棋盘范围内落子,请勿超出范围\n");
printf("玩家1(*) 玩家2(o) 电脑(@)\n");
printf("请输入你要落棋的位置:(横纵坐标)\n");
srand((unsigned int)time(0)); //这里不太明白还有加s
char kun;
while (1) {
if (y == 1) {
wanjia(L, ROW, COL);
//打印一下现在棋盘的情况;
//printf("目前棋盘的情况如下表:\n") ;
dayinqp(L, ROW, COL);
//判断输赢平,继续
kun = jieju(L, ROW, COL) ;
//printf("%c\n", kun);
//printf("赢 'y'平'p'继续'j'\n");
//printf("%d\n", y);
if (kun == '*')
break;
if (kun == 'o')
break;
if (kun == '@')
break;
if (kun == 'p')
break;
//printf("%d\n", y);
printf("玩家2出手\n");
wanjia2(L, ROW, COL);
dayinqp(L, ROW, COL);
kun = jieju(L, ROW, COL);
if (kun == '*')
break;
if (kun == 'o')
break;
if (kun == '@')
break;
if (kun == 'p')
break;
}
//电脑落子,我感觉要用到库函数实现随机填充
//确实没毛病老铁
if (y == 2) {
wanjia(L, ROW, COL);
//打印一下现在棋盘的情况;
//printf("目前棋盘的情况如下表:\n") ;
dayinqp(L, ROW, COL);
//判断输赢平,继续
kun = jieju(L, ROW, COL) ;
printf("%c\n", kun);
//printf("赢 'y'平'p'继续'j'\n");
//printf("%d\n", y);
if (kun == '*')
break;
if (kun == 'o')
break;
if (kun == 'p')
break;
if (kun == '@')
break;
//printf("%d\n", y);
system("cls");
printf("电脑玩家出手\n");
//目前剩四个空格电脑就会死;
diannao(L, ROW, COL); //死在这里
dayinqp(L, ROW, COL);
kun = jieju(L, ROW, COL);
if (kun == '*')
break;
if (kun == 'o')
break;
if (kun == 'p')
break;
if (kun == '@')
break;
}
if (y == 3) {
wanjia(L, ROW, COL);
//打印一下现在棋盘的情况;
//printf("目前棋盘的情况如下表:\n") ;
dayinqp(L, ROW, COL);
//判断输赢平,继续
kun = jieju(L, ROW, COL) ;
//printf("%c\n", kun);
//printf("赢 'y'平'p'继续'j'\n");
//printf("%d\n", y);
if (kun == '*')
break;
if (kun == 'o')
break;
if (kun == 'p')
break;
if (kun == '@')
break;
//system("cls");
//printf("%d\n", y);
printf("玩家2出手\n");
//system("cls");
wanjia2(L, ROW, COL);
system("cls");
dayinqp(L, ROW, COL);
kun = jieju(L, ROW, COL);
if (kun == '*')
break;
if (kun == 'o')
break;
if (kun == 'p')
break;
if (kun == '@')
break;
system("cls");
printf("电脑玩家出手\n");
//目前剩四个空格电脑就会死;
diannao(L, ROW, COL); //死在这里
dayinqp(L, ROW, COL);
kun = jieju(L, ROW, COL);
if (kun == '*')
break;
if (kun == 'o')
break;
if (kun == 'p')
break;
if (kun == '@')
break;
}
//判断输赢平,继续,每一步都得判断
}
if (kun == '*')
printf("恭喜,玩家1,您赢了,你干嘛哎哟\n");
if (kun == 'o')
//printf("搞笑,连人机都玩不过,奖励回去练习两年半\n");
printf("恭喜,玩家2,您赢了,你干嘛哎哟\n");
if (kun == '@')
printf("搞笑,连人机都玩不过,奖励回去练习两年半\n");
if (kun == 'p')
printf("恭喜,你两平手\n");
system("pause");
}
void caidan() {
//system("pause");
system("cls");
Pos(40, 6);
printf("1.菜单界面实现\n");
Pos(35, 7);
printf("******************************\n");
Pos(35, 8);
printf("********输入0退出游戏*********\n");
Pos(35, 9);
printf("********输入1(人对战人)******\n");
Pos(35, 10);
printf("********输入2(人对战电脑)****\n");
Pos(35, 11);
printf("********输入3(人对人对电脑)****\n");
Pos(35, 12);
printf("********输入其他奖励再来亿次**\n");
Pos(35, 13);
printf("******************************\n");
Pos(35, 14);
printf("请作出你的选择\n");
Pos(35, 15);
}
void zongxt() {
//do..while 好处是必执行一次,也就是有一次选择;
sqlist L;
//初始化
L.elem = new sz[MAXSIZE];
L.length = 0;
int choose ; //在这里choose需要放在do..while上头,不然无法识别
int i = 0;
do {
caidan();
//我用switch实现
scanf("%d", &choose);
system("cls");
int p = 0, q = 0, w = 0;
switch (choose) {
case 1:
printf("欢迎进入人对战人模式\n");
q = 1;//用来设置可以选择两张玩法的思路实现
game(L, q); //开始进入游戏板块
break;
case 2 :
printf("欢迎进入人对战电脑模式\n");
p = 2; //进入然后用if判断
game(L, p); //开始进入游戏板块
break;
case 3 :
printf("欢迎进入人对战人对战电脑模式\n");
w = 3; //进入然后用if判断
game(L, w); //开始进入游戏板块
break;
case 0:
printf("已退游戏\n");
break;
default :
printf("输入错误,请重新输入,谢谢配合,不然你自己看着办\n");
break;
}
} while (choose); //这里需要分号
}
int main() {
//printf("阿祥玩三子棋\n");
system("title ikun");//给窗口命名
color(6);//字体换颜色 //目前有问题,两个弄起来会覆盖一个
system("color e0");//给背景换色
//system("color 6");
gamestart();
zongxt();
printf("阿祥敲完历时两年半\n");
//问题1.电脑玩家死循环,死在电脑玩家函数里面 ,在diannao函数已经解释明白了
//2.结果出不来,这个第一个问题解决这个也可以了
//3.只能是我赢,无法弄好电脑赢的情况,修改
//想法1.双人对战
//2.改为五子棋或者四子棋
//system("pause");
return 0;
}
总结
提示:这里对文章进行总结:
以上就是今天要讲的内容,本文仅仅简单介绍了五子棋的大概流程的实现,主要还是对c语言的小小运用了,对以上文章疑问或者有错误的地方可以私信或者留言哈。