赞
踩
学了二维数组我们就可以试着写一个三子棋小游戏了,但电脑随机的操作让整个游戏根本没难度,所以我给大家带来了一个不是那么笨的三子棋,将人的思维带给电脑,代码如下:
- #define _CRT_SECURE_NO_WARNINGS
- #include<stdio.h>
- #include<windows.h>
- #include<stdlib.h>
- #include<time.h>
- #define ROW 3 //宏定义棋盘长宽
- #define COL 3
- void mvue() //打印游戏菜单函数
- {
- printf("*************************************\n");
- printf("*********** 1.开始游戏 *************\n");
- printf("*********** 0.退出游戏 *************\n");
- printf("*************************************\n");
- }
- //******************棋盘内部置空******************************
- void initialization(char disc[ROW][COL] )
- {
- int i = 0;
- for (i = 0; i < ROW; i++)
- {
- int n = 0;
- for (n = 0; n < COL; n++)
- {
- disc[i][n] = ' ';
- }
- }
- }
- //*****************创建棋盘外观,打印棋盘********************************
- void print(char disc[ROW][COL] )
- {
- printf("+---+---+---+\n");
- for (int row = 0; row < ROW; row++)
- {
- printf("| %c | %c | %c |\n", disc[row][0], disc[row][1], disc[row][2]);
-
- printf("+---+---+---+\n");
- }
-
- }
- //*****************玩家下棋******************************
- void a_fallingseed(char disc[ROW][COL])
- {
- while (1)
- {
- printf("输入一个坐标(例2,2):");
- int x = 0;
- int y = 0;
- scanf("%d,%d", &x, &y);
- if ((x > 0 && x <= ROW) && (y > 0 && y <= COL))
- {
- if (disc[x - 1][y - 1] == ' ')
- {
- disc[x - 1][y - 1] = '*';
- break;
- }
- else
- printf("坐标已有棋子\n");
- }
- else
- {
- printf("坐标非法\n");
- }
- }
-
- }
- //********************电脑下棋****************************
- int b_fallingseed(char disc[ROW][COL])//判断敌方横是否为2
- {
-
- for (int i = 0; i < ROW; i++)
- {
- int judge1 = 0;
- int n = 0;
- for ( n = 0; n < COL; n++)
- {
- if(disc[i][n] == '*')
- judge1++;
- }
- if (judge1 == 2)
- {
- for (int max = 0; max < COL; max++)
- {
- if (disc[i][max] == ' ')
- {
- disc[i][max] = '#';
- return 0;
- }
- }
- }
- }
- //-------------------------------------------
-
- for (int i = 0; i < COL; i++) //判断敌方纵是否为2
- {
- int judge2 = 0;
- int n = 0;
- for (n = 0; n < ROW; n++)
- {
- if(disc[n][i] == '*')
- judge2++;
- }
- if (judge2 == 2)
- {
- for (int max = 0; max < COL; max++)
- {
- if (disc[max][i] == ' ')
- {
- disc[max][i] = '#';
- return 0;
-
- }
- }
- }
- }
- //----------------判断敌方右斜是否为2 ---------------------------
- int pa = 0;
- int pb = 0;
- int judge3 = 0;
- for (pa = 0; pa < ROW && pb < COL; pa++,pb++)
- {
- if (disc[pa][pb] == '*')
- {
- judge3++;
- }
-
- if (judge3 == 2)
- {
- if (disc[0][0] == ' ')
- {
- disc[0][0] = '#';
- return 0;
-
- }
- else if (disc[1][1] == ' ')
- {
- disc[1][1] = '#';
- return 0;
-
- }
- else
- {
- disc[2][2] = '#';
- return 0;
-
- }
- }
-
- }
- //--------------判断敌方左斜是否为2 -------------------------
- int judge4 = 0;
- int pc = 0;
- int pd = 0;
- for (pc = 0, pd = COL - 1; pc < ROW && pd >= 0; pc++, pd--)
- {
- if (disc[pc][pd] == '*')
- {
- judge4++;
- }
- if (judge4 == 2)
- {
- if (disc[0][2] == ' ')
- {
- disc[0][2] = '#';
- return 0;
-
- }
- else if (disc[1][1] == ' ')
- {
- disc[1][1] = '#';
- return 0;
-
- }
- else
- {
- disc[2][0] = '#';
- return 0;
-
- }
- }
- }
- if (disc[1][1] == ' ') //如果没有必走棋,抢中心位置
- {
- disc[1][1] = '#';
- return 0;
- }
- else //如果中心位置已被占随机下一步棋
- { //这里的随机步还可以优化,让电脑随着你写的一个
- // 算法落子,每一步占据最大优势,但是这里是最难的,所以我没写
-
- while (1)
- {
- int row = rand() % ROW;
- int col = rand() % COL;
- if (disc[row][col] == ' ')
- {
- disc[row][col] = '#';
- return 0;
- }
- }
- }
- }
- int iswin(char disc[ROW][COL]) //判断继续游戏还是平局
- {
- int i = 0;
- int y = 0;
- for (i = 0; i < ROW; i++)
- {
- for (y = 0; y < COL; y++)
- {
- if (disc[i][y] == ' ')
- return 1;
- }
- }
- return 0;
- }
- //---------------------------------------------------
- char Win(char disc[ROW][COL]) //判断输赢
- {
- for (int i = 0; i < ROW; i++)
- {
- if (disc[i][0] == disc[i][1] && disc[i][1] == disc[i][2] && disc[i][1] != ' ')
- {
- return disc[i][1];
- }
-
- }
-
- for (int y = 0; y < COL; y++)
- {
- if (disc[0][y] == disc[1][y] && disc[1][y] == disc[2][y] && disc[1][y] != ' ')
- {
- return disc[0][y];
- }
-
- }
-
- if (disc[0][0] == disc[1][1] && disc[1][1] == disc[2][2] && disc[1][1] != ' ')
- {
- return disc[1][1];
- }
- else if (disc[0][2] == disc[1][1] && disc[1][1] == disc[2][0] && disc[1][1] != ' ')
- {
- return disc[1][1];
- }
- else
- {
- int c = iswin(disc);
- if (c == 0)
- return 'Q';
- else
- return ' ';
- }
- }
- void game() //游戏执行过程总函数
- {
- printf("玩家先(0)电脑先(1)\n");
- int vit = 0;
- scanf("%d", &vit);
- if (vit == 0) //玩家先
- {
- char disc[ROW][COL] = { 0 };
- initialization(disc);//初始化棋盘函数
- print(disc, ROW, COL); //创建棋盘外观
- char is = ' ';//判断根据
- while (1)
- {
- a_fallingseed(disc);//玩家下棋*
- print(disc, ROW, COL); //打印棋盘
-
- is = Win(disc); //判断胜负
- if (is != ' ')
- {
- break;
- }
- b_fallingseed(disc);//电脑下棋#
- print(disc, ROW, COL);//打印棋盘
- is = Win(disc); //判断胜负
- if (is != ' ')
- {
- break;
- }
- }
- if (is == '*')
- {
- printf("玩家胜利\n");
- }
- else if (is == '#')
- {
- printf("电脑胜利\n");
- }
- else if (is == 'Q')
- printf("平局\n");
-
- }
- else if (vit == 1) //电脑先
- {
-
- char disc[ROW][COL] = { 0 };
- initialization(disc);//初始化棋盘函数
- //print(disc, ROW, COL); //创建棋盘外观
- char is = ' ';//判断根据
- while (1)
- {
- b_fallingseed(disc);//电脑下棋#
- //print(disc, ROW, COL); //打印棋盘
- is = Win(disc); //判断胜负
- if (is != ' ')
- {
- break;
- }
- print(disc, ROW, COL);
- a_fallingseed(disc);//玩家下棋*
- //print(disc, ROW, COL);//打印棋盘
- is = Win(disc); //判断胜负
- if (is != ' ')
- {
- break;
- }
- }
- if (is == '*')
- {
- printf("玩家胜利\n");
- }
- else if (is == '#')
- {
- printf("电脑胜利\n");
- }
- else if (is == 'Q')
- printf("平局\n");
-
- }
- }
- //*************************************************************
- int main()
- {
- int input = 0;
- srand((unsigned int)time(NULL));
- do
- {
- //system("cls");
- mvue();
- scanf("%d", &input);
- switch (input)
- {
- case 1:
- game(); //逐步实现游戏过程的函数
- break;
- case 0:
- printf("退出游戏\n");
- break;
- default:
- printf("选择错误\n");
- break;
- }
- } while (input);
- return 0;
- }
目前有两个最大的缺点
1.就是随机落子那一块,整个代码只是让电脑不会输的太挫,能够正常操作,如果解决电脑随机落子那一块那么电脑可以算是一个不错的对手了
2.电脑不会去判断自己是否有两个棋子达成条件,而是一味的去堵玩家,不过这一块的代码相对好实现,稍微调整一下复制粘贴判断玩家的棋子代码就可以了,这里我没时间去做修改了,有兴趣的朋友可以试一试
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。