哈哈哈!!!
?????? 今天给大家带来一篇三子棋小游戏(简易版)的代码,xdm请跟随我的节奏一起来起舞吧!!!说是简易版是因为没有实现电脑智能化,这样让我们尽情的去向电脑复仇吧!!!
一、知识储备
????????二维数组
????????分支循环熟练运用
????????函数熟练操作
????????逻辑思维分析
二、需求分析
????????三子棋,简而言之,三子成线,给出一个9宫格,玩家和电脑轮流下棋,看哪一方先三子成线则胜利,项目相对来说对初学者有点困难。
????????1、二维数组初始化
????????2、棋盘打印
????????3、玩家下棋
????????4、电脑下棋
????????5、判断输赢
????????6、游戏逻辑函数设计
????????7、主函数设计
三、代码呈现
此项目采用模块化设计
????????分game.h? game.cpp? test.cpp三个模块
??????? 1、头文件设计
???????????? 为了方便改动和使其有好的扩展性采用宏定义来设置行和列数
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#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;
}
????????本文写到这里就结束了,若是有兴趣的话您可以自行修改,自行增添内容使项目丰富多彩。
若本文是对您有所帮助的话,希望你可以点赞下,你的支持是我创作最大的动力!!!
??????????????? 谢谢!!!
注:作者水平有限,若有错误,欢迎指正!
|