失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【C语言】初学者的福利--让你可以上手的第一个小游戏(三子棋亦可为N子棋)

【C语言】初学者的福利--让你可以上手的第一个小游戏(三子棋亦可为N子棋)

时间:2022-03-08 00:51:59

相关推荐

【C语言】初学者的福利--让你可以上手的第一个小游戏(三子棋亦可为N子棋)

💘作者:你我皆为凡人

💘博客主页:你我皆为凡人的博客

💘名言警句:时间不会为任何人停留,而事物与人,无时不刻也在变化着。每一个人,也都在不停向前!

💘觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!

💘系列作品:

💘

💘C语言编程刷题篇

💘经典题型系列

文章目录

目录

文章目录

🙈 前言

💫主框架的搭建

💫游戏的实现

🤎初始化棋盘

💙打印棋盘

🤎玩家下棋

💙判断输赢

🤎电脑下棋

💙判断输赢

💫总代码

🙈 总结

🙈 前言

初学者学习C语言,想实行第一个小游戏来检查一下自己之前所学的知识牢固不牢固,那么这个三子棋小游戏是不二人选

提示:以下是本篇文章正文内容,下面案例可供参考

💫主框架的搭建

1:先准备好游戏目录,规则为 1 为玩游戏 0 为退出游戏

2:打印完目录,准备输出数字,如果1,就开始游戏,如果0,就退出游戏,如果是其他返回并重新输入数字,这时候就需要循环了,因为至少需要执行一次,所以用do,while循环,条件为输入的那个数,因为如果是0,为假,直接不进去,而其他的两个可以反复

void memu(){printf("*****************************\n");printf("************* 0 exit *******\n");printf("************* 1 play *******\n");printf("*****************************\n");}int main(){srand((unsigned int)time(NULL));int input = 0;do{memu();printf("请输入你的选择:>");scanf("%d", &input);switch (input){case 1:printf("开始我们的三子棋游戏\n");game();break;case 0:printf("退出游戏\n");break;default:printf("好兄弟,选错了,重新输入\n");break;}} while (input);return 0;}

💫游戏的实现

🤎初始化棋盘

1,需要准备一个二维数组来存放一个三乘三的棋盘

2,定义函数与参数,并且在头文件中声明

3,棋盘初始化时,需要看起来是空白的,所以把棋盘初始化为空格

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] = ' ';}}}

💙打印棋盘

1,声明和定义打印棋盘的函数

2,棋盘可以看为两部分,数据为一部分,分隔符为一部分,打印数据时,为数据和|,如果最后一列的时候,就不需要打印|了,接下来打印分隔符与|,同上,在最后一行的时候不需要打印分隔符,打印完换行

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){int j = 0;for (j = 0; j < col; j++){printf("---");if(j<col-1)printf("|");}printf("\n");}}}

🤎玩家下棋

1,玩家下棋需要输入下标,需要看坐标是否在范围之内,如果坐标合法

2,坐标合法需要看这个范围内有没有被占用,如果没有被占用则等于*

3,注意的是,输入的坐标和数组的坐标是相差的,需要减一才能相等

void playmove(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] = '*';break;}else{printf("坐标被占用,请在其他坐标输出\n");}}else{printf("抱歉,你输入的坐标不合法,请重新输入\n");}}}

💙判断输赢

1,当玩家输入后需要判断一下玩家是否赢了,我们给一个判断原则,如果返回q,则平局并不再进行,如果返回c,则代表没有人赢并继续,如果返回*则玩家赢了,如果返回#则电脑赢了

2,赢的条件有三种,行三个相等,列三个相等并且两条对角线是三条相等,既然这样,那么如果相等并且不等于空格的时候则返回这个数,这个数等于*或者#

3,定义一个函数用来查看有没有满,并且没有赢则平局,规则是如果满了则返回1,如果没满则返回0

4,最后一种情况是棋盘没有满,继续的情况

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][1] != ' '){return board[i][1];}}//判断列int j = 0;for (j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' '){return board[1][j];}}//判断对角线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';}

🤎电脑下棋

1,当电脑下棋时,需要设置一个随机生成的数,需要用到rand与srand函数,而且生成的下标需要是行与列,那么就对行与列取模生成

2,判断坐标有没有被占用,没有就输出#

void conputermove(char board[ROW][COL], int row, int col){int x = 0;int y = 0;printf("电脑下棋:\n");while (1){//生成随机数x = rand() % row;y = rand() % col;//判断有没有被占用if (board[x][y] == ' '){board[x][y] = '#';break;}}}

💙判断输赢

1,当电脑输入后需要判断一下电脑是否赢了,我们给一个判断原则,如果返回q,则平局并不再进行,如果返回c,则代表没有人赢并继续,如果返回*则玩家赢了,如果返回#则电脑赢了

2,赢的条件有三种,行三个相等,列三个相等并且两条对角线是三条相等,既然这样,那么如果相等并且不等于空格的时候则返回这个数,这个数等于*或者#

3,定义一个函数用来查看有没有满,并且没有赢则平局,规则是如果满了则返回1,如果没满则返回0

4,最后一种情况是棋盘没有满,继续的情况

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][1] != ' '){return board[i][1];}}//判断列int j = 0;for (j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' '){return board[1][j];}}//判断对角线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';}

💫总代码

主框架的实现

#define _CRT_SECURE_NO_WARNINGS#include"game.h"void game(){char ret = 0;char board[ROW][COL] = { 0 };//初始化棋盘Initboard(board, ROW, COL);//打印棋盘Displayboard(board,ROW,COL);while (1){//玩家下棋playmove(board, ROW, COL);//判断输赢ret = iswin(board,ROW,COL);//显示棋盘Displayboard(board, ROW, COL);if (ret != 'c'){break;}//电脑下棋conputermove(board, ROW, COL);//判断输赢ret = iswin(board, ROW, COL);//显示棋盘Displayboard(board, ROW, COL);if (ret != 'c'){break;}}if (ret == 'q'){printf("平局\n");}else if (ret == '#'){printf("电脑赢了\n");}else{printf("玩家赢了\n");}Displayboard(board, ROW, COL);}void memu(){printf("*****************************\n");printf("************* 0 exit *******\n");printf("************* 1 play *******\n");printf("*****************************\n");}int main(){srand((unsigned int)time(NULL));int input = 0;do{memu();printf("请输入你的选择:>");scanf("%d", &input);switch (input){case 1:printf("开始我们的三子棋游戏\n");game();break;case 0:printf("退出游戏\n");break;default:printf("好兄弟,选错了,重新输入\n");break;}} while (input);return 0;}

函数的声明-头文件

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>#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 playmove(char board[ROW][COL],int row,int col);//电脑下棋void conputermove(char board[ROW][COL], int row, int col);// q 退出// * 玩家赢了 // # 电脑赢了// c 继续char iswin(char board[ROW][COL], int row, int col);

游戏内部的实现

#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 playmove(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] = '*';break;}else{printf("坐标被占用,请在其他坐标输出\n");}}else{printf("抱歉,你输入的坐标不合法,请重新输入\n");}}}//电脑下棋void conputermove(char board[ROW][COL], int row, int col){int x = 0;int y = 0;printf("电脑下棋:\n");while (1){//生成随机数x = rand() % row;y = rand() % col;//判断有没有被占用if (board[x][y] == ' '){board[x][y] = '#';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][1] != ' '){return board[i][1];}}//判断列int j = 0;for (j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' '){return board[1][j];}}//判断对角线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';}

🙈 总结

这篇是对于新手可以上手实现的第一个较简单的三子棋小游戏,因为是对于新手时期的,没有进行代码优化,尽量让初学者可以看懂,并且自己来进行优化代码,比如实现N子棋的玩法,电脑太笨怎么办,总是自己赢,如何让玩家赢不了电脑,这个代码有很大的改进空间,俗话说没有笨的电脑,只有笨的程序员,优化后的代码正在构思中,实现玩家与电脑的高超对弈,敬请期待,如果觉得凡人写的还可以,请多多支持,当然了,这个是对于新手写的,大佬们肯定觉得就是菜鸟级别的,勿喷蛤,感谢各位观看!!!

如果觉得《【C语言】初学者的福利--让你可以上手的第一个小游戏(三子棋亦可为N子棋)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。