目录
一、怎么实现?
大体框架构建:需要啥?菜单(可供玩家选择)->游戏主体->玩家选择后进行操作->如果玩家选错怎么办?返回,让这小b崽子重新选!->不想玩怎么办?允许他不玩这旷世之作[○・`Д´・ ○]
于是根据大体思路首先写出了大体框架:
菜单:
void menu()//菜单
{
printf("---------------------------\n");
printf("|*************************|\n");
printf("|******* 1.play ********|\n");
printf("|******* 0.exit ********|\n");
printf("|*************************|\n");
printf("---------------------------\n");
}
主函数:
int main()
{
int input = 0,flag=0;
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
if(flag==0)
printf("\n -- 三子棋 --\n \n");
flag = 1;
game();
break;
case 0:
printf("--退出成功--\n");
break;
default:
printf("--输入错误,请重新输入!--\n");
}
} while (input);
return 0;
}
对此我们的重点现在便是在构建game()这个函数了!◍˃ ᵕ ˂◍
二、game()主体的构建
首先还是要先构思一下大体框架->要实现什么功能?人机大战! 玩家vs玩家!->这样便又需要一个菜单来供选择了 ε=(´ο`*)))唉 ->用什么来做比较合适?数组!二维数组!->需要什么?棋盘!->用了数组因此需要初始化,需要打印棋盘,需要对于玩家落子和电脑落子进行分别的操作!->最主要的操作!判断输赢!->棋盘满算平局(重点),执子 * 和 # 哪边先达到要求哪边胜出!
大体思路想好了,实现如下:
#define _CRT_SECURE_NO_WARNINGS 01
#include"game.h"
void menu()//菜单
{
printf("---------------------------\n");
printf("|*************************|\n");
printf("|******* 1.play ********|\n");
printf("|******* 0.exit ********|\n");
printf("|*************************|\n");
printf("---------------------------\n");
}
void Initboard(char board[ROW][COL], int row, int col)//初始化棋盘
{
for (int i = 0; i < row;i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void Disboard(char board[ROW][COL], int row, int col)//打印现在棋盘上所落子
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
if(i<row-1)
for (int j = 0; j < col; j++)
{
printf("--- ");
}
printf("\n");
}
}
int isfull(char board[ROW][COL], int row, int col)//判断棋盘是否满
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
void Player(char board[ROW][COL], int row, int col)//玩家动作
{
printf("输入要下棋的位置(二维坐标表示 空格隔开):");
int a = 0,b = 0;
scanf("%d %d", &a, &b);
a = a - 1;
b = b - 1;
if (a <= row && b <= col && board[a][b] != '*' && board[a][b] != '#')
{
board[a][b] = '*';
}
else
{
printf("输入错误,请重新输入!");
Player(board, ROW, COL);
}
}
void Player2(char board[ROW][COL], int row, int col)//玩家动作
{
printf("输入要下棋的位置(二维坐标表示 空格隔开):");
int a = 0, b = 0;
scanf("%d %d", &a, &b);
a = a - 1;
b = b - 1;
if (a <= row && b <= col && board[a][b] != '*' && board[a][b] != '#')
{
board[a][b] = '#';
}
else
{
printf("输入错误,请重新输入!");
Player2(board, ROW, COL);
}
}
void Computer(char board[ROW][COL], int row, int col)//电脑动作
{
while (1)
{
int a = rand() % row;
int b = rand() % col;
if (board[a][b] == ' ')
{
printf("电脑下棋:\n");
board[a][b] = '#';
break;
}
if (isfull(board,ROW,COL) == 1)
break;
}
}
int awin(char board[ROW][COL], int row, int col)//a玩家赢
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == '*')
{
if (j + 2 < col)//横向
{
if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2])
return 2;
}
if (i + 2 < row)//纵向
{
if (board[i][j] == board[i + 1][j] && board[i + 1][j] == board[i + 2][j])
return 2;
}
if ((i + 2 < row) && (j + 2 < col))//右下
{
if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2])
return 2;
}
if ((i + 2 >= 0) && (j - 2 >= 0))//左下
{
if (board[i][j] == board[i + 1][j - 1] && board[i + 1][j - 1] == board[i + 2][j - 2])
return 2;
}
}
}
}
return 0;
}
int bwin(char board[ROW][COL], int row, int col)//b玩家赢
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == '#')
{
if (j + 2 < col)//横向
{
if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2])
return 3;
}
if (i + 2 < row)//纵向
{
if (board[i][j] == board[i + 1][j] && board[i + 1][j] == board[i + 2][j])
return 3;
}
if ((i + 2 < row) && (j + 2 < col))//右下
{
if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2])
return 3;
}
if ((i + 2 >= 0) && (j - 2 >= 0))//左下
{
if (board[i][j] == board[i + 1 ][j - 1] && board[i + 1][j - 1] == board[i + 2][j - 2])
return 3;
}
}
}
}
return 0;
}
char judge(char board[ROW][COL], int row, int col)
{
if(bwin(board, ROW, COL) == 3)
return '#';
else if (awin(board, ROW, COL) == 2)
return '*';
else if(isfull(board, ROW, COL) == 1)//平局
return 'p';
else return ' ';
}
void game1()
{
srand((unsigned int)time(NULL));
char board[ROW][COL] = { 0 };
Initboard(board, ROW, COL);
Disboard(board,ROW,COL);
char ret = ' ';
while(1)
{
printf("玩家下棋:\n");
Player(board, ROW, COL);
Disboard(board, ROW, COL);
ret = judge(board, ROW, COL);
if (ret != ' ')
break;
Computer(board, ROW, COL);
Disboard(board, ROW, COL);
ret = judge(board, ROW, COL);
if (ret != ' ')
break;
}
if (ret == 'p')
printf("平局!\n");
else if (ret == '*')
printf("玩家赢!\n");
else if (ret == '#')
printf("电脑赢!\n");
}
void game2()
{
char board[ROW][COL] = { 0 };
Initboard(board, ROW, COL);
Disboard(board, ROW, COL);
char ret = ' ';
while (1)
{
printf("玩家a下棋:\n");
Player(board, ROW, COL);
Disboard(board, ROW, COL);
ret = judge(board, ROW, COL);
if (ret != ' ')
break;
printf("玩家b下棋:\n");
Player2(board, ROW, COL);
Disboard(board, ROW, COL);
ret = judge(board, ROW, COL);
if (ret != ' ')
break;
}
if (ret == 'p')
printf("平局!\n");
else if (ret == '*')
printf("玩家a赢!\n");
else if (ret == '#')
printf("玩家b赢!\n");
}
void game()
{
printf(" **********************\n");
printf(" 选择游玩模式\n");
printf(" ******1.人机大战*******\n");
printf(" **2.player vs player**\n");
printf(" **********************\n");
printf(" **********************\n");
int in = 0;
scanf("%d", &in);
printf("\n\n");
switch (in)
{
case 1:
game1();
break;
case 2:
game2();
break;
default:
printf("选择错误\n");
break;
}
}
三、重点在判断输赢!
平局!最主要的就是判满!便历棋盘看是否剩下空格->也就是没落子的地方,若全满返回1以告诉后续接受的函数棋盘满了,可以判平!
int isfull(char board[ROW][COL], int row, int col)//判断棋盘是否满
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
玩家或者电脑赢!判断方法都是一样的!最主要的就是怎么判赢!思路->先找到要判赢玩家或电脑所执棋子,这里是‘*’,找到了便可以进行判断了!->分为横向和纵向以及斜向。横向和纵向太斜向的思路都是差不多的-极限。->首先说明为什么我们只判断右下和左下,前面横向和纵向也是为啥只判断一边就行了,因为前边我们的查找:找到‘*’才进行判断。那么之前我们就都判断过了一边,为什么呢?因为我们的起点是从0,0开始的,我们没有左边也没有上边,也没有左上右上。那么接下来的位置实际上我们已经判断过了一边了,只需要判断另一边即可。
(也许是我思考有误?希望大家能帮忙指出Ծ‸Ծ)
int awin(char board[ROW][COL], int row, int col)//a玩家赢
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == '*')
{
if (j + 2 < col)//横向
{
if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2])
return 2;
}
if (i + 2 < row)//纵向
{
if (board[i][j] == board[i + 1][j] && board[i + 1][j] == board[i + 2][j])
return 2;
}
if ((i + 2 < row) && (j + 2 < col))//右下
{
if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2])
return 2;
}
if ((i + 2 >= 0) && (j - 2 >= 0))//左下
{
if (board[i][j] == board[i + 1][j - 1] && board[i + 1][j - 1] == board[i + 2][j - 2])
return 2;
}
}
}
}
return 0;
}
四、总体代码
game.h
#pragma once
#define ROW 5
#define COL 5
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu();
void game();
game.c
#define _CRT_SECURE_NO_WARNINGS 01
#include"game.h"
void menu()//菜单
{
printf("---------------------------\n");
printf("|*************************|\n");
printf("|******* 1.play ********|\n");
printf("|******* 0.exit ********|\n");
printf("|*************************|\n");
printf("---------------------------\n");
}
void Initboard(char board[ROW][COL], int row, int col)//初始化棋盘
{
for (int i = 0; i < row;i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void Disboard(char board[ROW][COL], int row, int col)//打印现在棋盘上所落子
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
if(i<row-1)
for (int j = 0; j < col; j++)
{
printf("--- ");
}
printf("\n");
}
}
int isfull(char board[ROW][COL], int row, int col)//判断棋盘是否满
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
void Player(char board[ROW][COL], int row, int col)//玩家动作
{
printf("输入要下棋的位置(二维坐标表示 空格隔开):");
int a = 0,b = 0;
scanf("%d %d", &a, &b);
a = a - 1;
b = b - 1;
if (a <= row && b <= col && board[a][b] != '*' && board[a][b] != '#')
{
board[a][b] = '*';
}
else
{
printf("输入错误,请重新输入!");
Player(board, ROW, COL);
}
}
void Player2(char board[ROW][COL], int row, int col)//玩家动作
{
printf("输入要下棋的位置(二维坐标表示 空格隔开):");
int a = 0, b = 0;
scanf("%d %d", &a, &b);
a = a - 1;
b = b - 1;
if (a <= row && b <= col && board[a][b] != '*' && board[a][b] != '#')
{
board[a][b] = '#';
}
else
{
printf("输入错误,请重新输入!");
Player2(board, ROW, COL);
}
}
void Computer(char board[ROW][COL], int row, int col)//电脑动作
{
while (1)
{
int a = rand() % row;
int b = rand() % col;
if (board[a][b] == ' ')
{
printf("电脑下棋:\n");
board[a][b] = '#';
break;
}
if (isfull(board,ROW,COL) == 1)
break;
}
}
int awin(char board[ROW][COL], int row, int col)//a玩家赢
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == '*')
{
if (j + 2 < col)//横向
{
if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2])
return 2;
}
if (i + 2 < row)//纵向
{
if (board[i][j] == board[i + 1][j] && board[i + 1][j] == board[i + 2][j])
return 2;
}
if ((i + 2 < row) && (j + 2 < col))//右下
{
if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2])
return 2;
}
if ((i + 2 >= 0) && (j - 2 >= 0))//左下
{
if (board[i][j] == board[i + 1][j - 1] && board[i + 1][j - 1] == board[i + 2][j - 2])
return 2;
}
}
}
}
return 0;
}
int bwin(char board[ROW][COL], int row, int col)//b玩家赢
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == '#')
{
if (j + 2 < col)//横向
{
if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2])
return 3;
}
if (i + 2 < row)//纵向
{
if (board[i][j] == board[i + 1][j] && board[i + 1][j] == board[i + 2][j])
return 3;
}
if ((i + 2 < row) && (j + 2 < col))//右下
{
if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2])
return 3;
}
if ((i + 2 >= 0) && (j - 2 >= 0))//左下
{
if (board[i][j] == board[i + 1 ][j - 1] && board[i + 1][j - 1] == board[i + 2][j - 2])
return 3;
}
}
}
}
return 0;
}
char judge(char board[ROW][COL], int row, int col)
{
if(bwin(board, ROW, COL) == 3)
return '#';
else if (awin(board, ROW, COL) == 2)
return '*';
else if(isfull(board, ROW, COL) == 1)//平局
return 'p';
else return ' ';
}
void game1()
{
srand((unsigned int)time(NULL));
char board[ROW][COL] = { 0 };
Initboard(board, ROW, COL);
Disboard(board,ROW,COL);
char ret = ' ';
while(1)
{
printf("玩家下棋:\n");
Player(board, ROW, COL);
Disboard(board, ROW, COL);
ret = judge(board, ROW, COL);
if (ret != ' ')
break;
Computer(board, ROW, COL);
Disboard(board, ROW, COL);
ret = judge(board, ROW, COL);
if (ret != ' ')
break;
}
if (ret == 'p')
printf("平局!\n");
else if (ret == '*')
printf("玩家赢!\n");
else if (ret == '#')
printf("电脑赢!\n");
}
void game2()
{
char board[ROW][COL] = { 0 };
Initboard(board, ROW, COL);
Disboard(board, ROW, COL);
char ret = ' ';
while (1)
{
printf("玩家a下棋:\n");
Player(board, ROW, COL);
Disboard(board, ROW, COL);
ret = judge(board, ROW, COL);
if (ret != ' ')
break;
printf("玩家b下棋:\n");
Player2(board, ROW, COL);
Disboard(board, ROW, COL);
ret = judge(board, ROW, COL);
if (ret != ' ')
break;
}
if (ret == 'p')
printf("平局!\n");
else if (ret == '*')
printf("玩家a赢!\n");
else if (ret == '#')
printf("玩家b赢!\n");
}
void game()
{
printf(" **********************\n");
printf(" 选择游玩模式\n");
printf(" ******1.人机大战*******\n");
printf(" **2.player vs player**\n");
printf(" **********************\n");
printf(" **********************\n");
int in = 0;
scanf("%d", &in);
printf("\n\n");
switch (in)
{
case 1:
game1();
break;
case 2:
game2();
break;
default:
printf("选择错误\n");
break;
}
}
text.c
#define _CRT_SECURE_NO_WARNINGS 01
#include"game.h"
int main()
{
int input = 0,flag=0;
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
if(flag==0)
printf("\n -- 三子棋 --\n \n");
flag = 1;
game();
break;
case 0:
printf("--退出成功--\n");
break;
default:
printf("--输入错误,请重新输入!--\n");
}
} while (input);
return 0;
}
人机大战!
player vs player!