目录
游戏逻辑的基本框架🚩
开始之前,很有必要先说说游戏逻辑的基本框架,我看许多别的博客基本都是一上来就直接开始代码了,代码的事情并不着急,重要的是我们要先理清楚游戏的逻辑是怎么一回事。这里我会分成两个部分:
1.游戏逻辑💧
🌀游戏可以支持玩家多次玩,反复玩
🌀需要一个菜单界面提示玩家做出选择
🌀游戏需要一个棋盘(基于二维数组)
🌀打印棋盘,看看初始化界面
🌀玩家下棋,输入坐标
🌀判断输赢,打印棋盘,看看效果如何
🌀电脑下棋,产生范围内的随机坐标(可以自己自行设计算法,优化电脑下棋,本篇博客并不讨论此问题)
🌀判断输赢,打印棋盘,看看效果如何
本篇博客将以*作为玩家的棋子,以#作为电脑的棋子
用*来代表玩家赢,用#代表电脑赢,以'Q'代表平局,以‘C’代表继续
2.代码实现💧
通过模块化设计,分为3个部分:
test.c
主函数部分,对游戏的逻辑进行测试运行
game.h
库函数头文件的包含
行列的自定义设置
函数的定义
game.c
游戏功能的实现,即对game.h中定义的函数进行实现
好了,通过上面的介绍对游戏有了一定的认识。下面,进入我们的代码实现部分👇
代码实现🚩
test.c
1.我们知道,要支持玩家多次重复玩游戏,这里采用dowhile循环来实现,无论如何,我们至少都能够进入游戏一次🚀
2.菜单,可通过简单的打印printf提示玩家进行选择,根据玩家的输入我们可以通过switch来作为选择🚀
3.主体部分game()游戏的实现:定义初始化一个棋盘,打印看看效果,while()循环,玩家下棋,打印棋盘,判断输赢
电脑下棋,打印棋盘,判断输赢🚀
下面来一起看看我们的代码🎁
//头文件的包含 #include "game.h" //开始界面 void menu() { printf("*************************\n"); printf("***** 1.play 0.exit ****\n"); printf("*************************\n"); } //游戏逻辑 void game() { char board[ROW][COL] = { 0 }; //初始化棋盘 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); //判断输赢 ret = IsWin(board, ROW, COL); if (ret != 'C') { break; } } if (ret == '*') { printf("恭喜你赢了\n"); } if (ret == '#') { printf("什么?电脑赢了,你连人机都打不过\n"); } if (ret == 'Q') { printf("平局\n"); } DisplayBoard(board, ROW, COL); } int main() { //随机数 srand((unsigned int)time(NULL)); int input = 0; 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; }
编辑
注:上面的函数都会在game.h中定义,接着往下走吧👇
game.h
#include <stdio.h> #include <stdlib.h> #include <time.h> //自定义行列 #define ROW 4//行 #define COL 4//列 //初始化棋盘 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); //判断是否满棋 int isFull(char board[ROW][COL], int row, int col);
编辑
本游戏以4行4列为例子。当你想改行和列之时,只需要通过改变#define后面的数字即可
编辑
注意:#define这里有一个小细节处:那就是定义的数字后面千万不能加分号(;)可千万不要因为敲代码敲多成习惯了❌
game.c
#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; int j = 0; for (i = 0; i < row; i++) { //打印数据 //printf(" %c | %c | %c \n" for (j = 0; j < row; j++) { printf(" %c ", board[i][j]); //打印出| if(j<col-1) printf("|"); } printf("\n"); //打印分割信息 //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) { int x = 0; int y = 0; printf("玩家下棋:\n"); while (1) { printf("请输入下标:"); 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 ComputerMove(char board[ROW][COL], int row, int col) { printf("电脑下棋:\n"); int x = 0; int y = 0; 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; int j = 0; char ret = 0; //行的判断 for (i = 0; i < row; ++i) { ret = 1; for (j = 0; j < col - 1; ++j) { if (board[i][j] == board[i][j + 1] && board[i][j] != ' ') ; else { ret = 0; break; } } if (ret) return board[i][j]; } //列的判断 for (j = 0; j < col; j++) { ret = 1; for (i = 0; i < row - 1; i++) { if (board[i][j] == board[i + 1][j] && board[i][j] != ' ') ; else { ret = 0; break; } } if (ret) return board[i][j]; } //左对角线的判断 ret = 1; for (i = 0, j = 0; i < row - 1 && j < col - 1; i++, j++) { if (board[i][i] == board[i + 1][i + 1] && board[i][i] != ' ') ; else { ret = 0; break; } } if (ret) return board[i][i]; //右对角线的判断 ret = 1; for (i = 0, j = col - 1; i < row - 1 && j > 0; i++, j--) { if (board[i][j] == board[i + 1][j - 1] && board[i][j] != ' ') ; else { ret = 0; break; } } if (ret) return board[i][j]; //判断是否平局 if (isFull(board, row, col)) return 'Q'; //继续 return 'C'; }
编辑
好啦,代码的实现就到这里结束了,下面我们来简单看看运行效果如何,走你🛫
与电脑斗智斗勇🚩
编辑
输入1时我们进入了游戏界面,现在我们开始下棋:
编辑
这时候我们就可以与电脑斗争斗勇了(这里如果觉得电脑不够灵活的话可以自己设置一个算法,这里只是基于能够让电脑下起棋来,通俗易懂)
编辑
最后,不出意外我们赢了!😂
最后,这里还测试了一下10*10
编辑
编辑
逻辑上还是行得通的。🎯
结语✍
好啦,本次关于N子棋游戏的实现就到这里结束了,如果觉得不错的话,记得点赞加收藏哦🌹