> 文档中心 > C语言自学之路十(用C语言编写小游戏-五子棋)

C语言自学之路十(用C语言编写小游戏-五子棋)


本文所结合图书及视频

《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.游戏继续 - cret = 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 #include #include //符号的定义#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 = 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  不满返回0int ret = IsFull(board, row, col);if (ret == 1){return 'Q';}//继续return 'C';}

好了,到这里我们整个游戏的代码就全部写完了,有兴趣的小伙伴可以试着写写。以上全部代码只是游戏的逻辑代码,游戏界面优化等问题本人能力有限,目前还无法处理。(初级版本,大佬互喷)

本节的内容就到这里了,下期我们一起详细的学习C语言的操作符知识!