哈哈哈!!!
今天给大家带来一篇三子棋小游戏(简易版)的代码,xdm请跟随我的节奏一起来起舞吧!!!说是简易版是因为没有实现电脑智能化,这样让我们尽情的去向电脑复仇吧!!!
一、知识储备二维数组
分支循环熟练运用
函数熟练 *** 作
逻辑思维分析
二、需求分析三子棋,简而言之,三子成线,给出一个9宫格,玩家和电脑轮流下棋,看哪一方先三子成线则胜利,项目相对来说对初学者有点困难。
1、二维数组初始化
2、棋盘打印
3、玩家下棋
4、电脑下棋
5、判断输赢
6、游戏逻辑函数设计
7、主函数设计
三、代码呈现此项目采用模块化设计
分game.h game.cpp test.cpp三个模块
1、头文件设计
为了方便改动和使其有好的扩展性采用宏定义来设置行和列数
#pragma once #include#include #include #define ROW 3//行数 #define COL 3//列数 //菜单 void menu(); //初始化 void init_board(char board[ROW][COL], int row, int col); //打印 void display_board(char board[ROW][COL], int row, int col); //玩家下棋 void player_move(char board[ROW][COL], int row, int col); //电脑下棋 void computer_move(char board[ROW][COL], int row, int col); //判断胜负 char judge_result(char board[ROW][COL], int row, int col);
2.函数设计
(1)、菜单函数
//菜单函数 void menu() { printf("*********************n"); printf("****** 1、play ******n"); printf("****** 0、exit ******n"); printf("*********************n"); }
(2)、棋盘初始化
//初始化棋盘 void init_board(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { board[i][j] = ' ';//初始全置为 空格 } } }
(3)、棋盘打印
//打印棋盘 void display_board(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++)//控制行数 { for (int j = 0; j < col; j++)//控制每一列 { printf(" %c ", board[i][j]); if (j < col-1) { printf("|"); } } printf("n");//打完一行加换行符 for (int j = 0; j < col; j++)//控制每一列 { if (i < row-1) { printf("---"); if (j < col - 1) { printf("+"); } } } printf("n");//打完一行加换行符 } }
(4)、玩家下棋
void player_move(char board[ROW][COL], int row, int col) { int x = 0;//代表行 int y = 0;//代表列 printf("玩家下棋:"); while (1) { scanf("%d %d", &x, &y); if (x < row && y < col && x>0 && y>0 && board[x-1][y-1] == ' ') { board[x - 1][y - 1] = '*';//由于数组下标是从0开始的,人们正常思维是从1开始的 break;//输入符合条件则记录下来后跳出,若不符合条件则继续重新输入 } else { printf("输入有误,请重新输入:"); } } }
(5)电脑下棋
//电脑下棋 void computer_move(char board[ROW][COL], int row, int col) { int x = 0;//电脑仅仅随机出一个坐标位置,没有智能化 int y = 0; do { x = rand() % row;//电脑随机出x行 y = rand() % col;//电脑随机出y列 } while (board[x][y] != ' '); board[x][y] = '#'; printf("电脑下棋:%d %d n", x+1, y+1); }
(6)、判断棋盘是否满
//判断是否棋盘满 int is_full(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (board[i][j] == ' ') { return 0;//如果有一个位置为空则返回0,代表棋盘没满 } } } return 1;//如果每一个位置都不为空则棋盘满返回1,如果棋盘没有满则在上面已经返回不会来到这 }
(7)、判断胜负
此部分设计巧妙在于由于玩家下棋下的是 * ,电脑下棋下的是 # ,若一方胜利直接返回他们所下的棋代表,然后判断是否棋盘满即平局的判断,若平局返回‘P',若都不是则返回‘C’
//判断输赢 char judge_result(char board[ROW][COL], int row, int col) { for (int 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 (int j = 0; j < row; j++)//判断每一列三个是否一样 { if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ') { return board[0][j]; } } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//判断对角线 { return board[0][0]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')//判断对角线 { return board[0][2]; } if (is_full(board, ROW, COL)) { return 'P'; } else return 'C'; }
(8)、游戏逻辑设计
//游戏函数 void game() { char board[ROW][COL]; char result = 0; printf("游戏开始n"); init_board(board, ROW, COL); while (1) { player_move(board, ROW, COL); display_board(board, ROW, COL); result = judge_result(board, ROW, COL); if (result != 'C') { break; } computer_move(board, ROW, COL); display_board(board, ROW, COL); result = judge_result(board, ROW, COL); if (result != 'C') { break; } } if (result == '*') { printf("玩家获胜!n"); } else if (result == '#') { printf("电脑获胜!n"); } else { printf("平局!n"); } }
(9)、主函数设计
//主函数 int main() { int input = 1; do { menu(); srand((unsigned int)time(NULL)); printf("请输入:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏!!!n"); break; default: printf("输入错误,请重新输入"); break; } } while (input); return 0; }
本文写到这里就结束了,若是有兴趣的话您可以自行修改,自行增添内容使项目丰富多彩。
若本文是对您有所帮助的话,希望你可以点赞下,你的支持是我创作最大的动力!!!
谢谢!!!
注:作者水平有限,若有错误,欢迎指正!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)