首页 > 其他分享 >设计一个三子棋游戏

设计一个三子棋游戏

时间:2023-01-24 19:33:09浏览次数:37  
标签:游戏 int 三子 board printf 设计 ROW col row

1.创建一个头文件,两个源文件

game.h中放包含的头文件和自定义函数的声明,game.c中放游戏的算法实现,test.h中放游戏逻辑地实现。

设计一个三子棋游戏_#include

2.为游戏设计一个简单的菜单

void menu()
{
printf("*********************\n");
printf("***1.play 0.exit***\n");
printf("*********************\n");
}

利用do ……while循环设计好游戏逻辑,当玩家输入“0”时,结果判定为假,跳出循环:输入“1”或非“0”时,结果判定为真,再次进入循环。

void test()
{
int input = 0;
do
{
menu();
printf("请输入:>");
scanf("%d/n", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
}
int

3.打印棋盘,并将棋盘初始化

//初始化棋盘,变成空白
void IntiBoard(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)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
}
printf("\n");
}
}

玩家下棋

数组下标从0开始,但没学过编程的人一般从1开始,所以后面要减1

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)
{
int x = 0;
int y = 0;
printf("电脑走:>\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}

判断输赢

//玩家赢   '*'

//电脑赢   '#'

//平局     'Q'     棋盘满了

//继续     'C'

//返回1棋盘满了
//返回0棋盘没满
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][0] != ' ')
{
return board[i][1];
}
}
//判断三列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][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[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//判断平局
if (1 == IsFull(board, ROW, COL))
{
return 'Q';
}
return 'C';
}

test.c

#include <stdio.h>
#include "game.h"
void menu()
{
printf("*********************\n");
printf("***1.play 0.exit***\n");
printf("*********************\n");
}
void game()
{
char ret = 0;
char board[ROW][COL] = { 0 };
//初始化棋盘
IntiBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
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");
else if (ret == '#')
printf("电脑赢\n");
else
printf("平局\n");
}

void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入:>");
scanf("%d/n", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}

game.h

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//函数声明
void IntiBoard(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);
//玩家赢 '*'
//电脑赢 '#'
//平局 'Q'
//继续 'C'
char IsWin(char board[ROW][COL], int row, int col);

game.c

#include "game.h"
//初始化棋盘,变成空白
void IntiBoard(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)
{
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)
{
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棋盘满了
//返回0棋盘没满
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][0] != ' ')
{
return board[i][1];
}
}
//判断三列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][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[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//判断平局
if (1 == IsFull(board, ROW, COL))
{
return 'Q';
}
return 'C';
}

标签:游戏,int,三子,board,printf,设计,ROW,col,row
From: https://blog.51cto.com/u_15927947/6022332

相关文章

  • 约束以及数据库设计
    1.约束约束是作用在表中列上的规则,用于限制加入表的数据约束的存在保证了数据库中数据的正确性、有效性和完整性2.约束的分类  **mysql不支持检查约束外......
  • #10166. 「一本通 5.3 练习 1」数字游戏
    #10166.「一本通5.3练习1」数字游戏-题目-LibreOJ(loj.ac)数位DP模板DP维度:pos,sum,lim,zerosum表示当前所有枚举的数之和%MOD后的值,否则dp这维度是存不下滴如果......
  • 芯片设计步骤和EDA的应用
    前端设计一、第一步,明确市场需求,确定产品的功能和性能。 二、第二步,定义芯片的算法和模块(IP核)。 三、第三步,搭建功能模块。用硬件描述语言(HDL)将各个功能模块用代码......
  • 面向对象程序设计 第五章 数据的共享与保护
    数据的共享与保护函数间的数据共享不同位置定义的变量和对象,其作用域、可见性、生存期都不同。程序模需要协作共同完成整个系统的功能,模块间需要共享数据,就需要知道应该......
  • 用消息队列制作一款多人在线游戏
    本文首发:我用消息队列做了个联机游戏-----------上篇文章我讲了两种常用的随机算法,本文就把这些算法运用出来,做一个多人在线小游戏。我小时候特别喜欢在4399玩一款叫......
  • STC51 STC15开发工控网关-工控主机-02-开关量采集原理与设计
    开关量采集电路适用于对开关量信号进行采集,如循环泵的状态信号,进出仓阀门的开关状态灯开关量。污染源在线检测仪可采集16路开关信号,输入24VDC;设定当输入范围为18~24VDC时,认......
  • 谈谈游戏中的随机算法
    本文首发:谈谈游戏中的随机算法读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:382.链表随机节点398.随机数索引384.打乱数组-----------没事儿的时候我喜欢......
  • 机制设计原理与应用(四)预算可行的拍卖机制
    目录4预算可行的拍卖机制4.1特征4.2使用案例4.3拍卖设计问题4.4单调次模函数(MonotoneSubmodularFunction)4.4.1分配算法4.4.2关键支付计划4.4.3特性4.5在线预算......
  • 机制设计原理与应用(二)简单的拍卖机制
    目录2简单的拍卖机制2.1在CS/EE中的应用2.2VCG机制2.3LOS机制(类似Vickrey)2简单的拍卖机制2.1在CS/EE中的应用关键词拍卖/机制设计/游戏(真实性/激励相容性/......
  • 机制设计原理与应用(三)Screening
    目录3Screening3.1为单个不可分割的项目定价3.1.1对\(\theta\)的假设3.1.2问题描述3.1.3特性3.2为无限可分的项目定价3.2.1对\(\theta\)的假设3.2.3特性3.2.4收益......