赞
踩
五子棋代码c语言简单实现
(pvc版和pvp版都有)
人与电脑下,人与人下都实现了
案例演示:
三子棋
案例演示:
五子棋
代码展示:
- #define _CRT_SECURE_NO_WARNINGS 1
-
- #define X 10 //行
- #define Y 15 //列
- #define NUM 5//几子赢
-
-
- //三子棋: X=3 Y=3 NUM=3
- //五子棋: X>=10 Y>=10 NUM=5
- //多子棋:(N子棋)NUM=N
-
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
-
- void menu();
- void startgame();
- void gamePvC();
- void gamePvP();
- void initboard(char board[X][Y]);
- void printboard(char board[X][Y]);
- void playermove1(char board[X][Y]);
- void playermove2(char board[X][Y]);
- void PCmove(char board[X][Y]);
- char iswin(char board[X][Y], int x, int y);
- int Full(char board[X][Y]);
-
- char flag = 'a';
-
- int main()
- {
- startgame();
- //将游戏完全封装起来
- //实现一个函数对应一个功能
- return 0;
- }
-
- //菜单栏
- void menu()
- {
- printf(" ------------------------\n");
- printf("| 0.退出游戏 |\n");
- printf("| 1.PvC人机对局 |\n");
- printf("| 2.PvP双人对局 |\n");
- printf(" ------------------------\n");
- }
-
- //游戏开始
- void startgame()
- {
- int ret = 0;
- do
- {
- menu();
- scanf("%d", &ret);
- switch (ret)
- {
- case 0:
- printf("game over\n");
- break;
- case 1:
- gamePvC();
- break;
- case 2:
- gamePvP();
- break;
- default:
- printf("输入错误,请重新输入!\n");
- break;
- }
-
- } while (ret);
- }
-
- //人机对局游戏
- void gamePvC()
- {
- char board[X][Y] = { '\0' };
- initboard(board);
- printboard(board);
-
- while (1)
- {
- playermove1(board);
- if (flag == '*') break;
- if (Full(board) == 1) { flag = '='; break; }
-
- PCmove(board);
- if (flag == '#') break;
- if (Full(board) == 1) { flag = '='; break; }
- }
-
- if (flag == '*') printf("玩家胜利\n");
- if (flag == '#') printf("电脑胜利\n");
- if (flag == '=') printf("平局\n");
-
- }
-
- //双人对局游戏
- void gamePvP()
- {
- char board[X][Y] = { '\0' };
- initboard(board);
- printboard(board);
-
- while (1)
- {
- playermove1(board);
- if (flag == '*') break;
- if (Full(board) == 1) { flag = '='; break; }
-
- playermove2(board);
- if (flag == '@') break;
- if (Full(board) == 1) { flag = '='; break; }
- }
-
- if (flag == '*') printf("玩家1胜利\n");
- if (flag == '@') printf("玩家2胜利\n");
- if (flag == '=') printf("平局\n");
-
- }
-
- //遍历棋盘
- void initboard(char board[X][Y])
- {
- for (int i = 0; i < X; i++)
- {
- for (int j = 0; j < Y; j++)
- {
- board[i][j] = ' ';
- }
- }
- }
-
- //打印棋盘
- void printboard(char board[X][Y])
- {
- for (int i = 0; i < X; i++)
- {
- if (i == 0)
- {
- printf(" ");
- for (int k = 1; k <= Y; k++)
- {
- printf("%2d列", k);
- if (k == Y)printf("\n ");
- }
- for (int k = 0; k < Y; k++)
- {
- printf("+---");
- if (k == Y - 1)printf("+\n");
- }
- }
-
- for (int j = 0; j < Y; j++)
- {
- if (j == 0) printf("%2d行", i + 1);
- printf("|");
- printf(" %c ", board[i][j]);
-
- if (j == Y - 1)printf("|\n ");
- }
-
- for (int k = 0; k < Y; k++)
- {
- printf("+---");
- if (k == Y - 1)printf("+\n");
- }
-
-
- }
- }
-
- //玩家1下棋 *
- void playermove1(char board[X][Y])
- {
- while (1)
- {
- int x = 0, y = 0;
- printf("玩家1,(*玩家)请输入行数和列数以此下棋\n");
- scanf("%d %d", &x, &y);
- if (x <= X && x >= 1 && y <= Y && y >= 1 && (board[x - 1][y - 1] == ' '))
- {
- board[x - 1][y - 1] = '*';
- flag = iswin(board, x, y);
- break;
- }
- else
- {
- printf("输入错误,请重新输入\n");
- }
- }
-
- }
-
- //玩家2下棋 @
- void playermove2(char board[X][Y])
- {
- while (1)
- {
- int x = 0, y = 0;
- printf("玩家2,(@玩家)请输入行数和列数以此下棋\n");
- scanf("%d %d", &x, &y);
- if (x <= X && x >= 1 && y <= Y && y >= 1 && (board[x - 1][y - 1] == ' '))
- {
- board[x - 1][y - 1] = '@';
- flag = iswin(board, x, y);
- break;
- }
- else
- {
- printf("输入错误,请重新输入\n");
- }
- }
-
- }
-
- //电脑下棋 #
- void PCmove(char board[X][Y])
- {
- srand((unsigned)time(NULL));
- while (1)
- {
- int x = 0;
- int y = 0;
-
- x = (rand() % X) + 1;
- y = (rand() % Y) + 1;
- if (board[x - 1][y - 1] == ' ')
- {
- board[x - 1][y - 1] = '#';
- flag = iswin(board, x, y);
- break;
- }
- }
- }
-
- //棋盘是否满了
- int Full(char board[X][Y])
- {
- for (int i = 0; i < X; i++)
- {
- for (int j = 0; j < Y; j++)
- {
- if (board[i][j] == ' ') return 0;
- }
- }
- return 1;
- }
-
- //判断胜负
- char iswin(char board[X][Y], int x, int y)
- {
- int arr[X][Y] = { 0 };
- int way[4] = { 1,1,1,1 };
- char c = board[x - 1][y - 1];
- system("cls");
- printboard(board);
- printf("上一步%c下在了%d行%d列\n", c, x, y);
- //将该种类型棋子变成0 1混合的int类型数组,1表示该种类型的棋子分布
- for (int i = 0; i < X; i++)
- {
- for (int j = 0; j < Y; j++)
- {
- if (board[i][j] == c)
- {
- arr[i][j] = 1;
- }
- }
- }
-
- //校准行列数
- x--;
- y--;
-
- for (int i = 1; i < NUM; i++)
- if (x - i >= 0 && arr[x - i][y] == 1) way[0]++;
- for (int i = 1; i < NUM; i++)
- if (x + i < X && arr[x + i][y] == 1) way[0]++;
- for (int i = 1; i < NUM; i++)
- if (y - i >= 0 && arr[x][y - i] == 1) way[1]++;
- for (int i = 1; i < NUM; i++)
- if (y + i < Y && arr[x][y + i] == 1) way[1]++;
- for (int i = 1; i < NUM; i++)
- if (x - i >= 0 && y - i >= 0 && arr[x - i][y - i] == 1) way[2]++;
- for (int i = 1; i < NUM; i++)
- if (x + i < X && y + i < Y && arr[x + i][y + i] == 1) way[2]++;
- for (int i = 1; i < NUM; i++)
- if (x - i >= 0 && y + i < Y && arr[x - i][y + i] == 1) way[3]++;
- for (int i = 1; i < NUM; i++)
- if (x + i < X && y - i >= 0 && arr[x + i][y - i] == 1) way[3]++;
-
- if (way[0] == NUM) printf(" ↑↓方向有了%d个棋子\n", way[0]);
- if (way[1] == NUM) printf(" ←→方向有了%d个棋子\n", way[1]);
- if (way[2] == NUM) printf(" ↖↘方向有了%d个棋子\n", way[2]);
- if (way[3] == NUM) printf(" ↙↗方向有了%d个棋子\n", way[3]);
- if (way[0] == NUM || way[1] == NUM || way[2] == NUM || way[3] == NUM)
- {
- printf("达成%d子连珠!\n", NUM);
- return board[x][y];
- }
-
- return 'a';
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。