三子棋游戲規則是三子成一行即可獲得勝利,接下來講解下如何用c語言撰寫三子棋
思路步驟:
1.列印出游戲選單
2.初始化游戲界面
3.設計游戲框架
4.玩家下棋
5.電腦下棋
6.判斷輸贏分為三個源檔案 test.c //測驗 game.c //游戲設定 game.h //參考的函式和頭檔案
1.列印出游戲選單
void menu(){
printf("*****************\n");
printf("*****1.play******\n");
printf("*****0.exit******\n");
printf("*****************\n");
}
簡單的列印一個游戲選單,視圖如下:

2.初始化游戲界面
初始化二維陣列的每個字符為‘ ’,為之后下棋子做鋪墊,正好可以對應上去
//初始化界面
void initBoard(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.設計游戲框架
對應的每一行列印出“ %c | %c | %c ”和“—|---|—”
但是
注意:列印每一行的時候“ %c ”和“|”是單獨分開寫的,并且在最后一次沒有“|”,此時得寫到if陳述句,來使得最后一個“|”沒有,同理,“—”和“|”一樣,
void DisplayBoard(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++){
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的關系,比如1,1,玩家想輸入的是第一行第一列,而程式員的眼里是第二行第二個,所以此時在撰寫程式的時候就得在原來的基礎上減去個1.
void PlayerMove(char board[ROW][COL], int row, int col){
int i = 0;
int j = 0;
printf("玩家下棋->\n");
while(1){
printf("請輸入你的坐標->");
scanf("%d%d", &i, &j);
if (i>=1 && i<=row && j>=1 && j<=col){
if (board[i - 1][j - 1] != ' '){
printf("此位置被占用,請重新選擇!\n");
}
else{
board[i - 1][j - 1] = '*';
break;
}
}
else{
printf("下子錯誤!請重新選擇!\n");
}
}
}
5.電腦下棋
電腦下棋是隨機的,用到的有rand,srand,time函式,rand配合著srand函式一起使用,
srand(unsigned int),定rand隨機值的起始位置,同時用到了time(NULL)時間戳的知識(時間戳是指現在的時間和計算機當時的時間差,計算機當時的時間是1970-1-1,8:00:00),srand((unsigned int)time(NULL))將時間強制轉成無符號整形,放置于main函式中,在每次的程式開啟中隨機值不固定,
void ComputerMove(char board[ROW][COL], int row, int col){
printf("電腦走->\n");
int x = rand() % row;
int y = rand() % col;
while (1){
if (board[x][y] == ' '){
board[x][y] = '#';
break;
}
}
}

6.判斷勝負
勝利的標志有一行成型,一列成型,斜對角成型
行成型:
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[0][i] != ' '){
return board[0][i];
}
}
斜對角成型:
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' '){
return board[0][0];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' '){
return board[0][0];
}
除了三種成型外,還有一種是平局,即棋盤下滿無法分出勝負
用到了遍歷,如果沒有空格,則回傳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;
}
if (isfull(board, row, col) == 1){
return 'Q';
}
通過以上四種情況的回傳值,來判定玩家勝,還是電腦勝
回傳其中的一種即可判定輸贏
while (1){
//玩家下棋
PlayerMove(board, ROW, COL);
ret = CheckWin(board, ROW, COL);
if (ret != 'C'){
break;
}
DisplayBoard(board, ROW, COL);
//電腦下棋
ComputerMove(board, ROW, COL);
ret = CheckWin(board, ROW, COL);
if (ret != 'C'){
break;
}
DisplayBoard(board, ROW, COL);
//判斷輸贏
}
if (ret == '*'){
printf("玩家贏!\n");
}
if (ret == '#'){
printf("電腦贏!\n");
}
if (ret == 'Q'){
printf("平局!\n");
}
}
最后是總的代碼,分別是兩個c源檔案,和一個頭檔案
test.c
#include "game.h"
void menu(){
printf("*****************\n");
printf("*****1.play******\n");
printf("*****0.exit******\n");
printf("*****************\n");
}
void game(){
char board[ROW][COL];
//初始化游戲界面
char ret;
initBoard(board,ROW,COL);
DisplayBoard(board, ROW, COL);
//游戲框架
while (1){
//玩家下棋
PlayerMove(board, ROW, COL);
ret = CheckWin(board, ROW, COL);
if (ret != 'C'){
break;
}
DisplayBoard(board, ROW, COL);
//電腦下棋
ComputerMove(board, ROW, COL);
ret = CheckWin(board, ROW, COL);
if (ret != 'C'){
break;
}
DisplayBoard(board, ROW, COL);
//判斷輸贏
}
if (ret == '*'){
printf("玩家贏!\n");
}
if (ret == '#'){
printf("電腦贏!\n");
}
if (ret == 'Q'){
printf("平局!\n");
}
}
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;
}
game.c
#include "game.h"
//初始化界面
void initBoard(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;
int j = 0;
for (i = 0; i < row; i++){
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 i = 0;
int j = 0;
printf("玩家下棋->\n");
while(1){
printf("請輸入你的坐標->");
scanf("%d%d", &i, &j);
if (i>=1 && i<=row && j>=1 && j<=col){
if (board[i - 1][j - 1] != ' '){
printf("此位置被占用,請重新選擇!\n");
}
else{
board[i - 1][j - 1] = '*';
break;
}
}
else{
printf("下子錯誤!請重新選擇!\n");
}
}
}
//電腦走
void ComputerMove(char board[ROW][COL], int row, int col){
printf("電腦走->\n");
int x = rand() % row;
int y = rand() % col;
while (1){
if (board[x][y] == ' '){
board[x][y] = '#';
break;
}
}
}
//判斷
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 CheckWin(char board[ROW][COL], int row, int col){
int i;
//行成型
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[0][i] != ' '){
return board[0][i];
}
}
//對角線成型
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' '){
return board[0][0];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' '){
return board[0][0];
}
//平局
if (isfull(board, row, col) == 1){
return 'Q';
}
//游戲繼續
return 'C';
}
game.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define ROW 3
#define COL 3
#include<time.h>
#include<stdlib.h>
void initBoard(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);
char CheckWin(char board[ROW][COL], int row, int col);

以上是我對于三子棋的大致講解,作為初學者的小白,在寫這個程式的時候花費了不少的時間,慢慢的有了大致的思路,當然,還有不少需要改進的地方,比如電腦不能夠只能的阻攔玩家的棋子,在判斷輸贏這一塊只能應用于三子棋,日后隨著知識的積累,慢慢改進,如果還有需要改進的地方歡迎大家評論指出,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/252240.html
標籤:其他
上一篇:Linux環境下分布式壓測
