c小游戏-三子棋
三子棋小游戏
经过几天学习,为了将之前学习的知识加以运用,于是写了一个简单的三子棋。
在写之前,先将游戏实现流程梳理一遍,
按照我们平常的游戏经验,进入游戏后,首先得有菜单,可以让玩家知道如何进入游戏。
在进入游戏后,需要一个3*3的棋盘。游戏一开始,棋盘内的内容需要初始化为空格
将棋盘打印出来后,等待玩家下棋后,电脑在接着下。在每一步下棋后,都需要确认游戏是否已出现胜负或者和棋。
在确认棋盘内还有空格,且没有出现三字连线的情况,那就要再重复玩家下棋,确认棋盘,电脑下棋,确认棋盘,直到出现胜负为止。
胜负确认后,再重新打印菜单,确认是否重新开始游戏。
分析完流程后,便可以开始写三子棋了。
#include<stdio.h>
#include<windows.h>
#define ROW 3
#define COW 3
#include<stdlib.h>
#include<time.h>
void Initboard(char board[ROW][COW], int row, int cow);
void Print(char board[ROW][COW], int row, int cow);
void Playchess(char board[ROW][COW], int row, int cow);
void computer(char board[ROW][COW], int row, int cow);
char Is`win(char board[ROW][COW], int row, int cow);
先将游戏的菜单页面给出。在打印菜单前顺便将屏幕清屏。
void menu()
{
system("cls");
printf("\n************************************\n");
printf("*************1 开始游戏*************\n");
printf("*************0 退出游戏*************\n");
printf("************************************\n");}`
菜单打印完后,便要由玩家选择是否开始游戏了
int main()
{int n;
do
{
menu();
scanf("%d", &n);
switch (n)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误");
break;
}
} while (n); //通过玩家选择的值,确定是否进入游戏。或者退出游戏。
在进入游戏后。就要进入游戏主体,而三子棋的游戏思路就是玩家下棋,判断胜负,电脑下棋,判断胜负,每一次下完棋后,都将棋盘当前画面打印,那么用代码表示就是:
void game()
{
char a;
char board[ROW][COW] = { 0 };
Initboard(board, ROW, COW);
system("cls");
Print(board, ROW, COW);
while (1)
{
Playchess(board, ROW, COW);
a = Iswin(board, ROW, COW);
if (a == 'a')
{
printf("和局\n");
break;
}
else if (a == '*')
{
printf("玩家胜");
break;
}
else if (a == '#')
{
printf("电脑胜");
break;
}
Print(board, ROW, COW);
computer(board, ROW, COW);
Print(board, ROW, COW);
a = Iswin(board, ROW, COW);
if (a == 'a')
{
printf("和局\n");
break;
}
else if (a == '*')
{
printf("玩家胜");
break;
}
else if (a == '#')
{
printf("电脑胜");
break;
}
}
printf("按任意键继续\n");
getch();
}
现在为止已经将大致的逻辑写清,只剩将每个函数的内容补充。
首先是创建一个3* 3的棋盘。也就是一个3*3的二维数组,再将数组内容全部初始化为空格’ ’;
void Initboard(char board[ROW][COW], int row, int cow)//初始化棋盘
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < cow; j++)
{
board[i][j] = ' ';
}
}
}
初始化好之后,自然要将棋盘打印出来,这样才能让用户选择坐标。
void Print(char board[ROW][COW], int row, int cow)//打印棋盘
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < cow; j++)
{
printf(" %c ", board[i][j]);
if (j != cow - 1)//在棋盘打印到最后一排时不打印 ’|’
{
printf("|");
}
}
printf("\n");
for (j = 0; j < cow; j++)
{
if (i < row - 1)
{
printf("---");
if (j < cow - 1)
{
printf("|");
}
}
}printf("\n");
}
}
打印完棋盘后,需要用户输入坐标下棋,那我们就写一个下棋函数
void Playchess(char board[ROW][COW], int row, int cow)//玩家下棋
{
int x = 0, y = 0;
while (1)
{
printf("请输入坐标:>\n");
scanf("%d%d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= cow)
{
if (board[x-1][y-1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标重复!");
}
}
else
{
printf("输入错误!\n");
}
}
}
每下完一步,游戏就有可能出现胜负,或者棋盘已被下满的情况,所以我们要再写一个函数确认。
char deuce(char board[ROW][COW], int row, int cow)//判断棋盘是否还要空位
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < cow; j++)
{
if (board[i][j] == ' ')
{
return 'C';
}
}
}
return 'a';
}
char Iswin(char board[ROW][COW], int row, int cow)//判断游戏是否出现胜利条件或者棋盘是否还有空位
{
int i;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
{
return board[i][1];
}
else if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
{
return board[1][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] || board[2][0] == board[1][1] && board[0][2])
{
return board[1][1];
}
return(deuce(board, row, cow));//当遍历完没有出现胜利条件,便判断棋盘内是否还有空位。
}
通过函数返回的值进行确认。
while (1)
{
Playchess(board, ROW, COW);
a = Iswin(board, ROW, COW);
if (a == 'a')
{
printf("和局\n");
break;
}
else if (a == '*')
{
printf("玩家胜");
break;
}
else if (a == '#')
{
printf("电脑胜");
break;
}
如果游戏继续,那就回到玩家下棋,再进行循环,直到出现胜负或者和局break跳出后再结束循环,回到菜单界面询问是否进入下次游戏。
到此,一个三子棋便新鲜出炉了。但是在这个三子棋中,判断胜利的代码是锁死只能判断3*3的棋盘,如果棋盘大小改变,那代码又要重新修改,不过今天的任务便是先出这样一份三字棋便可。
感谢大佬观看到这。如果代码中有哪些不足之处也请大家多多指出。
原文地址:https://www.cnblogs.com/zjj4633/p/15071840.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SwiftUI:创建底部导航栏 tabBar
- AtCoder Beginner Contest 168 C
- 关于 Executor 和 ExecutorService
- 【队伍训练】Codeforces Round #660 (Div. 2)
- 【队伍训练2】 AtCoder Beginner Contest 165
- C# 的sql server like 的参数
- sql server 字符串替换函数REPLACE
- sql server 更新两个表的某个字段
- HTML 引用Css样式的四种方式
- Java也可以像python般range出连续集合
- c# dev控件 gridcontrol 数据跟随鼠标滚轮滚动也可以编辑
- Apollo(阿波罗)配置中心Java客户端使用指南使用指南
- DevExpress.LookUpEdit控件实现自动搜索定位功能 兼使用方法(looUpEdit可编辑)
- dev GridControl直接打印 纵向合并单元格
- Dooring可视化之从零实现动态表单设计器