💘作者:你我皆为凡人
💘博客主页:你我皆为凡人的博客
💘名言警句:时间不会为任何人停留,而事物与人,无时不刻也在变化着。每一个人,也都在不停向前!
💘觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!
💘系列作品:
💘
💘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子棋)》对你有帮助,请点赞、收藏,并留下你的观点哦!