C语言开发入门到实战--C语言小游戏-三子棋详解
小职 2021-09-03 来源 :CSDN「加勒比海涛」 阅读 857 评论 0

摘要:本文主要介绍了C语言开发入门到实战--C语言小游戏-三子棋详解,通过具体的内容向大家展现,希望对大家C语言开发的学习有所帮助。

本文主要介绍了C语言开发入门到实战--C语言小游戏-三子棋详解,通过具体的内容向大家展现,希望对大家C语言开发的学习有所帮助。

C语言开发入门到实战--C语言小游戏-三子棋详解


一、游戏介绍

三子棋,是由一个3*3组成的棋盘构成的,只要将自己的三个棋子走成一条线,对方就算输了,即下的棋子只要达到一横行、一纵列或对角线全下满,游戏就成功了。但是如果对方达到一横行、一纵列或对角线全下满而玩家没有堵住的话,那么游戏就失败了。

C语言开发入门到实战--C语言小游戏-三子棋详解


二、问题描述

本篇文章实现的是用C语言实现三子棋的具体步骤,需要用到的相关知识有if语句、switch语句、while语句、do-while语句、函数、数组、C语言基础语法以及随机数的生成等。采用函数的多模块思想完成此问题


三、基本流程

设计菜单页面,给出游戏信息,让用户进行选择


输入1:开始游戏

输入0:退出游戏

输入其他:输入错误,请重新输入


创建初始棋盘,让棋盘元素初始化为空格


在下棋之前,先把初始化之后的棋盘打印出来,方便玩家参考


玩家落子(输入对应坐标)


(1)要先判断玩家下的坐标是否合法(即玩家选择的坐标是否被下过)

(2)切记!玩家不是程序员,要将数组控制在下标从1开始


打印玩家输入棋子后的棋盘,方便玩家判断输赢


判断胜负


判断玩家是否胜出,玩家若胜出,则游戏结束


电脑落子(随机生成坐标)


(1)随机数的生成

(2)电脑随机生成坐标,不用考虑数组下标问题(电脑也是一名程序员)


判断胜负


判断电脑是否胜出,电脑若胜出,则游戏结束


若玩家、电脑都没胜出,则返回到玩家落子这个步骤,由此可见,这是个循环。


四、C语言随机生成随机数

在C语言中,随机数的生成是比较麻烦的,使用rand函数和srand函数进行生成。


1.rand函数

C语言开发入门到实战--C语言小游戏-三子棋详解


(1)rand函数需要引头文件

#include

1

(2)rand函数的返回值:

rand函数返回范围为0到rand_MAX的随机整数。


(3)在调用rand之前,请使用srand函数为随机数生成器设定种子。

(4)rand函数的使用方法:rand()%n;

例子:生成1~100之间的随机数(n=100):

由于rand函数返回范围为0到rand_MAX的随机整数,

对rand()进行取余运算,即rand()%100;

(一个数对100取余,取余后的结果一定是0 ~ 99之间),

在进行+1操作,即rand()%100+1;

由此,1~100之间的随机数就已经生成了


2.srand函数

C语言开发入门到实战--C语言小游戏-三子棋详解


(1)srand函数需要引头文件

#include


(2)srand函数设置生成一系列随机整数的起点。

注意:srand函数不能重复调用,最好放在主函数调用一次就好


(3)srand函数的使用方法:

在主函数调用,切记!避免多次重复被调用


srand((unsigned int)time(NULL));


五、代码实现

1.test.c 测试游戏

在主函数中,完成的是基本逻辑的实现


#define _CRT_SECURE_NO_WARNINGS 1


//需要的头文件在game.h中定义,此文件引用即可

//优点:提高代码可读性,方便后续进行修改

//声明:头文件

//实现:与头文件名字相同的源文件

//使用:#include" "(直接包含头文件即可)


#include "game.h"


//简易游戏菜单

void menu()

{

printf("***********************************\n");

printf("***********   1. play     *********\n");

printf("***********   0. exit     *********\n");

printf("***********************************\n");

}


void game()

{

//三子棋的过程


char board[ROW][COL];//创建棋盘数组


//初始化棋盘 - board的元素都给成空格->棋盘美观,方便玩家查看

InitBoard(board, ROW, COL);


//打印棋盘

DisplayBoard(board, ROW, COL);


//下棋

char ret = 0;//定义一个变量,接收判断游戏输赢函数的返回值

while (1)//一直循环,直到满足对应条件利用break退出循环

{

PlayerMove(board, ROW, COL);//玩家下棋

DisplayBoard(board, ROW, COL);//打印棋盘

ret = IsWin(board, ROW, COL);//判断输赢

if (ret != 'C')//ret=='C' ->游戏继续

{

break;

}

ComputerMove(board, ROW, COL);//电脑下棋

DisplayBoard(board, ROW, COL);//打印棋盘

ret = IsWin(board, ROW, COL);//判断输赢

if (ret != 'C')//ret=='C' ->游戏继续

{

break;

}

}

if (ret == '*')

{

printf("玩家赢\n");

}

else if (ret == '#')

{

printf("电脑赢\n");

}

else

{

printf("平局\n");

}

}

int main()

{

int input = 0;//接收玩家输入的值


//srand函数的调用-引头文件#include

srand((unsigned int)time(NULL));


//do-while循环,让游戏至少执行一次

do

{

menu();//打印自制菜单

printf("请选择:>");

scanf("%d", &input);

switch (input)

{

case 1://开始游戏

game();

break;

case 0://退出游戏

printf("退出游戏\n");

break;

default://输入错误,重新选择

printf("选择错误,请重新输入\n");

break;

}

} while (input);

//input作为判断条件,输入1开始游戏,输入0-为假跳出循环,从而达到了退出游戏的效果


return 0;

}



2.game.h 游戏函数的声明以及符号的定义

#pragma once

//#pragma once的作用:防止头文件被重复多次包含

 

//需要的一系列头文件在game.h声明即可

#include

#include

#include


//方便以后对游戏进行维护,直接定义全局变量

#define ROW 3

#define COL 3


//初始化棋盘

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);



//判断游戏输赢

//要返回4种不同的状态

//玩家赢 - '*'

//电脑赢 - '#'

//平局 -  ‘Q’

//继续 -   'C'


char IsWin(char board[ROW][COL], int row, int col);


3.game.c 游戏函数的实现

C语言开发入门到实战--C语言小游戏-三子棋详解

C语言开发入门到实战--C语言小游戏-三子棋详解


#define _CRT_SECURE_NO_WARNINGS 1


#include "game.h"


//初始化棋盘

void InitBoard(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++)

{

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)

{

for (j = 0; j < col; j++)

{

printf("---");

if(j<col-1)

printf("|");

}

}

printf("\n");

}

}


//玩家下棋

void PlayerMove(char board[ROW][COL], int row, int col)

{

printf("玩家走:>\n");


//定义坐标

int x = 0;

int y = 0;


while (1)

{

printf("请输入坐标:>");

scanf("%d%d", &x, &y);//2 1 -- > 1 0

//并不是所有人都是程序员,都知道数组是从下标0开始的,所以要从1开始操作

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)

{

int x = 0;

int y = 0;

printf("电脑走:>\n");


while (1)

{

//随机数的生成:

x = rand() % row;//0~2

y = rand() % col;//0~2

if (board[x][y] == ' ')如果当前坐标未下子,那就把 # 落在该位置

{

board[x][y] = '#';

break;//下子之后直接跳出循环,继续接下来的操作

}

}

}


//判断棋盘是否下满

//0:未满

//1:下满

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;//棋盘满

}


//判断输赢

//要返回4种不同的状态

//玩家赢 - '*'

//电脑赢 - '#'

//平局 -  ‘Q’

//继续 -   'C'


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][0] != ' ')

{

return board[i][0];

}

}

//列的判断

for (i = 0; i < col; i++)

{

if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')

{

return board[0][i];

}

}

//副对角线

if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')

return board[1][1];

//主对角线

if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')

return board[1][1];


//判断平局

if (IsFull(board, row, col))

{

return 'Q';

}

//游戏继续

return 'C';

}



六、最终效果

玩家赢

C语言开发入门到实战--C语言小游戏-三子棋详解

电脑赢

C语言开发入门到实战--C语言小游戏-三子棋详解

平局

C语言开发入门到实战--C语言小游戏-三子棋详解

我是小职,记得找我

✅ 解锁高薪工作

✅ 免费获取基础课程·答疑解惑·职业测评

C语言开发入门到实战--C语言小游戏-三子棋详解

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程