当前位置: 首页 > news >正文

初识C语言第三十天——设计三子棋游戏

目录

一.设计游戏框架

1.打印游戏菜单

2.输入选择判断(玩游戏/游戏结束/输入错误重新输入)  

二、玩游戏过程设计

1.设计棋格存放棋子——二维数组

2.初始化棋盘——初始化为空格

3.打印棋盘——本质上就是打印数组

4.游戏过程——1.玩家走棋 2.判断结果 3.电脑走棋 4.判断结果

⑴玩家走棋

Ⅰ    需要判断棋盘空格的合法性

Ⅱ    判断空格是否被占据

⑵判断输赢——四种结果

Ⅰ    玩家赢

Ⅱ    电脑赢

Ⅲ    游戏平局

Ⅴ    继续游戏

⑶电脑走棋

Ⅰ    用伪随机函数产生,需要伪随机数种子生成器,用空指针的时间函数生成时间戳

Ⅱ    判断空格是否被占据

附录:头文件里的符号定义以及相关声明 


一.设计游戏框架

1.打印游戏菜单

//游戏框架
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;
}

2.输入选择判断(玩游戏/游戏结束/输入错误重新输入) 

//游戏菜单打印
void menu()
{printf("************************************\n");printf("************	1.play	************\n");printf("************	2.exit	************\n");printf("************************************\n");
}

二、玩游戏过程设计

1.设计棋格存放棋子——二维数组

void game()
{//定义3*3的数组来存储棋子类型 存储数据char board[ROW][COL];//完成棋盘的初始化-初始化空格INit_board(board,ROW,COL);//打印棋盘——本质上就是打印数组Displayboard(board,ROW,COL);char ret = 0;while (1){//玩家下棋Playerboard(board,ROW,COL);Displayboard(board, ROW, COL);//  判断游戏进行状态ret=Iswin(board, ROW, COL);if (ret != 'C')break;//电脑下棋Computerboard(board, ROW, COL);Displayboard(board, ROW, COL);if (ret != 'C')break;}if (ret == '*'){printf("玩家赢了\n");}else if (ret == '#'){printf("电脑赢了\n");}else if (ret == 'Q'){printf("游戏平局\n");}Displayboard(board, ROW, COL);}

2.初始化棋盘——初始化为空格

//棋盘的初始化
void INit_board(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] = ' ';}}
}

3.打印棋盘——本质上就是打印数组

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

4.游戏过程——1.玩家走棋 2.判断结果 3.电脑走棋 4.判断结果

⑴玩家走棋

Ⅰ    需要判断棋盘空格的合法性
Ⅱ    判断空格是否被占据
//玩家下棋
void Playerboard(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;//判断棋盘空格的合法性//判断空格是否被占据while (1){printf("请玩家下棋:<");scanf("%d %d", &x, &y);//判断棋盘空格的合法性if (x >= 1 && x <= 3 && y >= 1 && y <= 3 && board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}//判断空格是否被占据else if(x >= 1 && x <= 3 && y >= 1 && y <= 3 && board[x - 1][y - 1] != ' '){printf("所下棋格被占据,请玩家重新下棋\n");}elseprintf("下棋超出范围,请玩家重新下棋\n");}}

⑵判断输赢——四种结果

Ⅰ    玩家赢
Ⅱ    电脑赢
Ⅲ    游戏平局
Ⅴ    继续游戏
//判断结果
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][0] !=' ')return board[i][0];}//判断列for (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i]&&board[i][0] != ' ')return board[2][i];}//判断对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')return board[1][1];if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')return board[1][1];//判断和棋的情况 返回1棋盘已满 返回0棋盘未放满int ret = Isfull(board,ROW,COL);if (ret == 1){return 'Q';}if (ret == 0)return 'C';}
//为判断和棋情况单独分的函数
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;}

⑶电脑走棋

Ⅰ    用伪随机函数产生,需要伪随机数种子生成器,用空指针的时间函数生成时间戳
Ⅱ    判断空格是否被占据
//电脑下棋
void Computerboard(char board[ROW][COL], int row, int col)
{printf("请电脑下棋:<\n");while (1)//判断空格是否被占据{int x = rand() % 3;int y = rand() % 3;if (board[x][y] == ' '){board[x][y] = '#';break;}}
}

附录:头文件里的符号定义以及相关声明 

//头文件的相关引用
#include <stdlib.h>
#include <time.h>//符号的定义
#define		ROW		3
#define		COL		3//函数的声明
//初始化棋盘的函数
void INit_board(char board[ROW][COL], int row, int col);//打印棋盘的函数
void Displayboard(char board[ROW][COL],int row, int col);//玩家下棋的函数
void Playerboard(char board[ROW][COL], int row, int col);//电脑下棋
void Computerboard(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);

http://www.lryc.cn/news/361704.html

相关文章:

  • ehcache3多级缓存应用
  • C# WinForm —— 24 Threading.Timer 组件介绍与使用
  • 03-07Java自动化之JAVA基础之循环
  • 【人工智能Ⅱ】实验8:生成对抗网络
  • vmware将物理机|虚拟机转化为vmware虚机
  • redis 高可用及哨兵模式 @by_TWJ
  • 封装tab栏,tab切换可刷新页面
  • JavaScript第八讲:日期,Math,自定义对象
  • php质量工具系列之phploc
  • 创建模拟器
  • 【Java】接口详解
  • 去掉el-table表头右侧类名是gutter,width=17px的空白区域(包括表头样式及表格奇偶行样式和表格自动滚动)
  • 3079. 求出加密整数的和
  • 奶茶店、女装店、餐饮店是高危创业方向,原因如下:
  • 嵌入式笔试面试刷题(day16)
  • 【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别
  • [Zer0pts2020]easy strcmp 分析与加法
  • 力扣7. 整数反转
  • Mac/Linux getline 无法读取文件内容(读取内容无法显示)
  • NBM 算法【python,算法,机器学习】
  • spark3.0.1版本查询Hbase数据库例子
  • android高效读图方式——Hardwarebuffer读图
  • 悉数六大设计原则
  • hdfs复习
  • css-Ant-Menu 导航菜单更改为左侧列表行选中
  • 02-CSS3基本样式
  • USART串口外设
  • 大模型应用之基于Langchain的测试用例生成
  • C++之map
  • 【量算分析工具-方位角】GeoServer改造Springboot番外系列六