本文所结合图书及视频
《C语言程序设计(第四版)谭浩强.pdf》
《C语言入门到精通—鹏哥带你C语言从入门到精通》
《郝斌老师的C语言自学视频》
这些在B站上都能找得到的。
学习目标:
利用前面我们所学到的知识,实现《五子棋》初级小游戏。
学习任务:
一、用所学的C语言知识来编写一个经典的《五子棋》游戏
我们要模拟一个类似五子棋的游戏,第一步还是要将它的逻辑罗列出来:
首先,我们打开编译器新建项目并建立以下文件:
1、game.h头文件 ---- 游戏的函数声明
2、game.c源文件 ---- 游戏的实现
3、test.c源文件 ---- 五子棋游戏的测试
以上文件建立好以后我们在test.c文件中将主函数框架写好,因为游戏不是只玩一局,所以我们利用do......while循环来实现游戏可多次玩的一个效果,同时在do......while循环中将游戏菜单打印出来,代码如下
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");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
接下来我们把菜单函数也就是menu函数设置好
void menu()
{
printf("************************************\n");
printf("************************************\n");
printf("******* 1. 开始游戏 *******\n");
printf("******* 0. 退出游戏 *******\n");
printf("************************************\n");
printf("************************************\n");
}
像这样一个简单的游戏菜单就做好了,接下来通过玩家的输入来进入游戏game主函数。
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 = IsWin(board, ROW, COL);
if (ret != 'C')
break;
//电脑下棋
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断电脑是否赢
// 1.玩家赢 --*
// 2.电脑赢 --#
// 3.平局 --Q
// 4.游戏继续 - c
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
}
if (ret == 'O')
{
printf("玩家胜利\n");
}
else if (ret == 'X')
{
printf("电脑胜利\n");
}
else
{
printf("平局\n");
}
}
进入游戏实现的函数内,我们首先要定义一个二维字符数组接收数据。接着,我们初始化棋盘,然后就是打印棋盘,最后是玩家下棋和电脑下棋、判断输赢。具体的函数代码我会在gam.ce文件中一一展示。
有关该游戏的函数声明全都在game.h文件中,代码如下
#pragma once
#pragma once
//头文件包含
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//符号的定义
#define ROW 5
#define COL 5
//函数的声明
void InitBoard(char board[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 IsWin(char board[ROW][COL], int row, int col);//判断输赢
进入游戏实现函数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;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
int j = 0;
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("请输入横纵坐标(中间以空格间隔):>\n");
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] = 'O';
break;
}
else
{
printf("坐标被占用,请重新输入\n");
}
}
else
{
printf("坐标非法,请重新输入\n");
}
}
}
电脑下棋函数实现
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑走:>\n");
while (1)
{
//判断合法性
int x = rand() % row;
int y = rand() % col;
//判断占用
if (board[x][y] == ' ')
{
board[x][y] = 'X';
break;
}
}
}
判断输赢函数实现
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 IsWin(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][1] != ' ')
{
return board[i][1];
}
}
//判断三列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i]
&& board[2][i] == board[3][i] && board[3][i] == board[4][i]
&& board[1][i] != ' ')
{
return board[1][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[1][1];
}
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[1][3] != ' ')
{
return board[1][1];
}
//判断平局 - 如果棋盘被摆满返回1 不满返回0
int ret = IsFull(board, row, col);
if (ret == 1)
{
return 'Q';
}
//继续
return 'C';
}
好了,到这里我们整个游戏的代码就全部写完了,有兴趣的小伙伴可以试着写写。以上全部代码只是游戏的逻辑代码,游戏界面优化等问题本人能力有限,目前还无法处理。(初级版本,大佬互喷)
本节的内容就到这里了,下期我们一起详细的学习C语言的操作符知识!
更多推荐
C语言自学之路十(用C语言编写小游戏-五子棋)
发布评论