来啦,它来啦!三子棋小游戏来啦!!!"/>
它来啦,它来啦!三子棋小游戏来啦!!!
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
一、三子棋游戏简易介绍
二、设计思路
1.模型搭建
2.函数的具体实现
初始化棋盘
打印棋盘
玩家走
电脑走
判定输赢
完整代码
game.h
game.c
test.c
总结
前言
提示:这里可以添加本文要记录的大概内容:
休闲时刻,轻松一下!!!今天给大家带来一个简单易上手的小游戏——三子棋。
提示:以下是本篇文章正文内容,下面案例可供参考
一、三子棋游戏简易介绍
三子棋是一种民间传统小游戏,又叫九宫棋,井字棋,圈圈叉叉等。将正方形对角线连起来,玩家按顺序下棋,每次只能下一枚。最后谁先将自己的三个棋子走成一条线,就算获胜!
二、设计思路
设计一款游戏最重要的是思路,有了大概思路,我们才能够进行扩展和完善。首先,游戏设置两只玩家和电脑两个角色,玩家为*,电脑为#,一方先三点连成一线即为胜利。
1.模型搭建
我们设置了一个do…while循环,使游戏可以一直进行下去直到玩家想要退出游戏。switch语句1开始游戏,0选择退出游戏。game()则为游戏的具体实现。
代码如下(示例):
void menus() {printf("**********************\n");printf("******* 1.play *******\n");printf("******* 0.exit *******\n");printf("**********************\n");
}
void game() {printf("三子棋游戏\n");
}
int main() {int input = 0;do {menus();printf("玩家请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("请重新选择\n");break;}} while (input);return 0;
}
2.函数的具体实现
我们最终想要呈现的棋盘如下图所示:
初始化棋盘
首先,我们要搭建一个二维数组,行和列分别为ROW,COL;然后初始化二维数组,使数组每个元素为’’(空格);这样做是为了方便后续打印棋盘。
void init_board(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++) {board[i][j] = ' ';}}
}
打印棋盘
void print_board(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");}}
}
玩家走
玩家首先输入坐标(x,y),由于部分玩家不清楚计算机是从0开始计数的,所以玩家真正指定的位置其实为board[x-1[y-1]。
接下来,判断玩家坐标合法性:
1.数组不可越界
2.不可指定已被占用的位置
不符合以上两点要求的都要重新输入。
void player_board(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;while (1) {printf("玩家走\n");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;}elseprintf("请重新输入:>\n");}elseprintf("请重新输入:>\n");}
}
电脑走
电脑通过rand()函数随机生成(0-row/col-1之间的数字),所以不用判断数组越界问题,找到空格位置 即可下棋,否则,重新输入。
void computer_board(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;printf("电脑走\n");x = rand() % row;y= rand() % col;if (board[x][y] == ' ') {board[x][y] = '#';}elseprintf("请重新输入:>\n");
}
判定输赢
1.玩家赢 *2.电脑赢 #3.平局 Q4.继续游戏 C
双方谁先行,列三点连成一线,或者对角线连成一线,就算谁赢,结束游戏。
如果棋下满仍然未有一方三点一线,则视为平局,游戏结束。
在棋落满之前,继续游戏。
char is_winner(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][0] == board[i][2] && board[i][0] != ' ')return board[i][0];}for (i = 0; i < col; i++) {if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')return board[0][i];}if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')return board[1][1];if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')return board[1][1];for (i = 0; i < row; i++) {int j = 0;for (j = 0; j < col; j++) {if (board[i][j] == ' ');return 'C';}}return 'Q';
}
完整代码
game.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//定义行列
#define COL 3
#define ROW 3
//初始化棋盘
void init_board(char board[ROW][COL], int row, int col);
//打印棋盘
void print_board(char board[ROW][COL], int row, int col);
//玩家走
void player_board(char board[ROW][COL], int row, int col);
//电脑走
void computer_board(char board[ROW][COL], int row, int col);
//结束游戏
char is_winner(char board[ROW][COL], int row, int col);
game.c
#include"game.h"
void init_board(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++) {board[i][j] = ' ';}}
}
void print_board(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 player_board(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;while (1) {printf("玩家走\n");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;}elseprintf("请重新输入:>\n");}elseprintf("请重新输入:>\n");}
}
void computer_board(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;printf("电脑走\n");x = rand() % row;y= rand() % col;if (board[x][y] == ' ') {board[x][y] = '#';}elseprintf("请重新输入:>\n");
}
char is_winner(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][0] == board[i][2] && board[i][0] != ' ')return board[i][0];}for (i = 0; i < col; i++) {if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')return board[0][i];}if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')return board[1][1];if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')return board[1][1];for (i = 0; i < row; i++) {int j = 0;for (j = 0; j < col; j++) {if (board[i][j] == ' ');return 'C';}}return 'Q';
}
test.c
#include "game.h"
void menus() {printf("**********************\n");printf("******* 1.play *******\n");printf("******* 0.exit *******\n");printf("**********************\n");
}
void game() {char board[ROW][COL] = { 0 };init_board(board, ROW, COL);print_board(board, ROW, COL);char ret = 0;while (1) {player_board(board, ROW, COL);ret = is_winner(board, ROW, COL);if (ret != 'C')break;print_board(board, ROW, COL);computer_board(board, ROW, COL);if (ret != 'C')break;print_board(board, ROW, COL);}if (ret == '*')printf("玩家赢\n");else if (ret == '#')printf("电脑赢\n");elseprintf("平局\n");print_board(board, ROW, COL);
}int main() {int input = 0;srand((unsigned int)(time(NULL)));do {menus();printf("玩家请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("请重新选择\n");break;}} while (input);return 0;
}
总结
谢谢大家!!!祝大家生活愉快!!!!!!
更多推荐
它来啦,它来啦!三子棋小游戏来啦!!!
发布评论