目录
趣味五子棋游戏
第一步
text.c文件
第二步
game.h文件
第三步
初始化
打印棋盘
玩家输入
电脑输入
判断输赢
game.c
趣味五子棋游戏
第一步
先写菜单,然后在主函数里调用,由于这是一个可以重复的游戏所以将do while循环里调用menu函数。
- 当我们键盘输入1时开启游戏,调用game()函数。由于我们是一个五子棋游戏,那么可能需要一个5x5大小的棋盘,所以我们要定义一个字符型的棋盘char board[ROW][COL];
- 定义好棋盘之后就初始化棋盘,在game.c文件里初始化。
- 初始化完之后就要打印棋盘。
- 然后就是让玩家落子,在判输赢,接着电脑落子,接着判输赢,这是一个循环的操作,所以需要一个while循环让这个操作循环起来。
text.c文件
//text.c文件
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
//五子棋
//菜单
void menu()
{
printf("***********************\n");
printf("****** 1 paly ******\n");
printf("****** 0 exit ******\n");
printf("***********************\n");
}
void game()
{
char board[ROW][COL];
//初始化棋盘
InitBoard(board, ROW, COL);
//打印棋盘
displayBoard(board, ROW, COL);
char ret = 0;
while(1)
{
//玩家下棋
playermove(board, ROW, COL);
//打印棋盘
displayBoard(board, ROW, COL);
//判断输赢
ret = inwin(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑下棋
computermove(board, ROW, COL);
//打印棋盘
displayBoard(board, ROW, COL);
//判断输赢
ret = inwin(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if(ret=='*')
{
printf("玩家赢了\n");
}else if(ret=='#')
{
printf("电脑赢了\n");
}
else {
printf("平局\n");
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
default:
printf("请输入正确的数字\n");
break;
}
} while (input);
return 0;
}
第二步
是去头文件里去声明函数以及将一些公共的头文件包含起来。在一些大型的开发都是声明和函数实现分离的。
game.h文件
#pragma once
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<time.h>
#include"game.h"
#define ROW 5
#define COL 5
//初始化棋盘
void InitBoard(char borad[ROW][COL],int row,int col);
//打印棋盘
void displayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void playermove(char board[ROW][COL], int row, int col);
//电脑下棋
void computermove(char board[ROW][COL], int row, int col);
//判断输赢
char inwin(char board[ROW][COL], int row, int col);
第三步
去game.c文件里去实现函数的相关功能。
初始化
如初始化棋盘,就是将5x5的数组具象化,将他形成5x5的空格。当用户在相应的坐标里输入时,就将对应的空格替换成特定的符号。
打印棋盘
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
board[i][j] = ' ';
}
}
}
对于打印棋盘,我们可以观察一下棋盘,可以将棋盘划分成两个部分一个是要输入数值部分,一个是分割部分 。
这里绿色部分为数值部分是用户和电脑输入坐标的部分,数值部分由 空格 | 空格 | 空格组成
红色部分是分割部分,由 ..... | ..... | ..... 组成 。
在代码实现的时候可以分两部分,数值部分,循环打印数值board[i][j];在少打一列的 | 。
分割部分可以先循环打印虚线 .......,在少打一列 | 。
//打印棋盘
void displayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if(i<row-1)
{
for (j = 0; j < col; j++)
{
printf("...");
if (j < col - 1)
printf("|");
}
}
printf("\n");
}
}
玩家输入
由于数组的下标是从0开始到n-1的,但是玩家是不会考虑这些的,所以玩家的输入的下标,应该在要减一才是棋盘的下标。
首先要判空,看玩家输入的下标是否不合法,收否不为空格,不为空格就是这个下标已经被占用了。
最后在合法的下标下,将玩家输入的下标位置用 ‘ * ’替换空格。
//玩家下棋
void playermove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋\n");
while (1)
{
printf("输入你要下的坐标: ");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该子已被下过\n");
}
}
else {
printf("该坐标非法,请换坐标\n");
}
}
}
电脑输入
我们设计电脑输入为随机的输入,用到了随机函数rand,用rand去%模row,col是为了随机值是在小于row和col的情况下。但是别忘了,在用rand之前要先使用srand随机数种子,为了确保随机数种子的唯一性,我们将随机数种子放在test.c文件的main()函数里,确保随机数种子只被调用一次。
将电脑输入的合法下标下,用#号去替换原有的空格。
//电脑随机下棋
void computermove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
int x = 0;
int y = 0;
while(1)
{
x = rand() % row;
y = rand() % col;
if(board[x][y]==' ')
{
board[x ][y ] = '#';
break;
}
}
}
判断输赢
玩过五子棋的都知道,五子棋只有在五个棋子连在一起的情况才会赢。所以我们分三种情况。
第一种,用一个循环,判断所以行是否出现一样的情况。
第二种,所有列是否出现一样的情况。
第三种,正负对角线有没有出现一样的情况。
最后用他们一样的情况的一个点作为返回条件去判断谁赢了。
如果返回 * 则玩家赢;如果返回 # 则电脑赢了。如果返回Q则平局。
//判平局
static int IsFull(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
//判断输赢
char inwin(char board[ROW][COL], int row, int col)
{
int i = 0;
for(i=0;i<row;i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&& board[i][2] == board[i][3]&&board[i][3] == board[i][4]&& board[i][0] !=' ')
{
return board[i][0];
}
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][1] && board[2][i] == board[3][i] && board[3][i] == board[4][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] == board[3][3] &&board[3][3] == board[4][4] && board[1][1] != ' ')
{
return board[0][0];
}
if (board[0][4] == board[1][3] && board[1][3] == board[2][2] && board[2][2] == board[3][1]&&board[3][1] == board[4][0] && board[0][4] != ' ')
{
return board[0][4];
}
//判断平局
if (IsFull(board, row, col))
{
return 'Q';
}
return 'C';
}
game.c
//game.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void displayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if(i<row-1)
{
for (j = 0; j < col; j++)
{
printf("...");
if (j < col - 1)
printf("|");
}
}
printf("\n");
}
}
//玩家下棋
void playermove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋\n");
while (1)
{
printf("输入你要下的坐标: ");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该子已被下过\n");
}
}
else {
printf("该坐标非法,请换坐标\n");
}
}
}
//电脑随机下棋
void computermove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
int x = 0;
int y = 0;
while(1)
{
x = rand() % row;
y = rand() % col;
if(board[x][y]==' ')
{
board[x ][y ] = '#';
break;
}
}
}
//判平局
static int IsFull(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
//判断输赢
char inwin(char board[ROW][COL], int row, int col)
{
int i = 0;
for(i=0;i<row;i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&& board[i][2] == board[i][3]&&board[i][3] == board[i][4]&& board[i][0] !=' ')
{
return board[i][0];
}
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][1] && board[2][i] == board[3][i] && board[3][i] == board[4][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] == board[3][3] &&board[3][3] == board[4][4] && board[1][1] != ' ')
{
return board[0][0];
}
if (board[0][4] == board[1][3] && board[1][3] == board[2][2] && board[2][2] == board[3][1]&&board[3][1] == board[4][0] && board[0][4] != ' ')
{
return board[0][4];
}
//判断平局
if (IsFull(board, row, col))
{
return 'Q';
}
return 'C';
}
代码压缩包
https://download.csdn.net/download/qq_62830324/88779627https://download.csdn.net/download/qq_62830324/88779627