三子棋
我們先想一下游戲是怎么玩的???
打開游戲,進去先看到一個選單,然后選擇是玩游戲還是退出,如果選擇玩游戲,那進去是我和電腦玩游戲,我下一步棋,電腦下一步棋,如果我贏了那游戲就結束了,如果電腦贏了,游戲也結束了,如果平局,游戲也結束了,直到游戲結束,那就退出游戲,三子棋游戲就大概是這樣,
我們要一步一步的解決,想好游戲的進行,把邏輯理清楚!!!!
首先,把游戲的大概邏輯理清楚
先看代碼!!
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//獲得一個亂數
do
{
menu();//進入游戲列印選單
printf("請選擇>0/1: ");//0退出游戲 1 玩游戲 其他數字那就提醒選擇錯誤,重新選擇
scanf("%d",&input);
switch (input)
{
case 1:
game();//這里是玩游戲
break;
case 0:
printf("退出游戲\n");
default:
printf("輸入錯誤,請從新選擇");
break;
}
} while (input);//input如果選擇的是1,那就一直玩游戲,直到選0,結束游戲
return 0;
}
從上面看出,第一步是列印選單
列印一個簡單的選單,讓選單在一個函式里,直接呼叫就行
void menu()
{
printf("***************************\n");
printf("****** 1.play *******\n");
printf("****** 0.exit *******\n");
printf("***************************\n");
}

當我們進入游戲之后,就要選擇玩游戲還是退出(0/1)
選擇1之后,就開始玩游戲
玩游戲,我們就要有一個棋盤,棋盤的樣子就像一個井字一樣,將列印棋盤的代碼封裝在函式里,呼叫函式,

void Intchess(char chess[ROW][COL], int row, int col)//陣列初始化
{
int i = 0;
for (i = 0; i < row; i++)//
{
//列印一行
int j = 0;
for (j = 0; j < col; j++)
{
chess[i][j] = ' ';//這里先讓陣列里存放3*3的空格
}
}
}
//列印棋盤
void Displaychess(char chess[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 ", chess[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 DisPlayer(char chess[ROW][COL], int row, int col)
{
printf("玩家走\n");//玩家輸入坐標1---3的范圍
int x = 0;
int y = 0;
while (1)
{
printf("請輸入坐標:");//玩家輸入的坐標是1 2 3,但是陣列的下標是0 1 2
scanf("%d%d", &x,&y);//
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if(chess[x - 1][y - 1] == ' ')
{
chess[x - 1][y - 1] = '*';
break;
}
else
{
printf("以被占用,請從新輸入\n");
}
}
else
{
printf("非法坐標,請從新輸入\n");
}
}
}
我下完了,就到電腦下棋
//電腦下棋
void Discomputer(char chess[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("電腦走:>\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (chess[x][y] == ' ')
{
chess[x][y] = '#';
break;
}
}
}
兩個都下完了,就要看有沒有誰贏了,如果有,那游戲結束
所以要判斷有沒有贏,如果電腦贏了那就回傳“#”,判斷電腦贏,那就是有一條直線上都是#
如果我贏了那就回傳“” 判斷我贏,那就是有一條直線上都是 “ ”
那一個都沒贏那就是平局,回傳Q,判斷平局,那就是以上都沒有發生,并且棋盤上已經滿了,如何判斷是否滿呢??那就看棋盤上看還有沒有空格,如果有空格那就繼續下棋,滿了的話就結束游戲
如果沒有以上發生,那就繼續下棋,回傳C
//判斷棋盤是否滿了 滿了 回傳1 沒滿 回傳0
int IsFull(char chess[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 (chess[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char IsWin(char chess[ROW][COL], int row, int col)
{
//判斷游戲輸贏
//要回傳4種不同的狀態
//玩家贏 - '*'
//電腦贏 - '#'
int i = 0;
for (i = 0; i < row; i++)
{
//判斷行是否相等
if (chess[i][0] == chess[i][1] && chess[i][1] == chess[i][2] && chess[i][1] != ' ')
{
return chess[i][1];
}
}
//判斷列是否相等
for (i = 0; i < row; i++)
{
if (chess[0][i] == chess[1][i] && chess[1][i] == chess[2][i] && chess[1][i] != ' ')
{
return chess[1][i];
}
}
//判斷對角線
if (chess[0][0] == chess[1][1] && chess[1][1] == chess[2][2] && chess[1][1] != ' ')
{
return chess[1][1];
}
if (chess[0][2] == chess[1][1] && chess[1][1] == chess[2][0] && chess[1][1] != ' ')
{
return chess[1][1];
}
//判斷是否平局 平局 - ‘Q’
if (IsFull(chess, ROW, COL))
{
return 'Q';
}
//判斷是否繼續 繼續 - 'C'
else
{
return 'C';
}
}
大概的邏輯我們已經知道,那就看一下完整的代碼
test.c
#include<stdio.h>
#include"game.h"
#include<stdlib.h>
void menu()
{
printf("***************************\n");
printf("****** 1.play *******\n");
printf("****** 0.exit *******\n");
printf("***************************\n");
}
void game()
{
char chess[ROW][COL];//棋盤陣列 row橫坐標 col 眾坐標
//初識化棋盤
Intchess(chess, ROW, COL);
//列印棋盤
Displaychess(chess, ROW, COL);
//玩家下棋
char ret = 0;
while (1)
{
//判斷游戲輸贏
//要回傳4種不同的狀態
//玩家贏 - '*'
//電腦贏 - '#'
//平局 - ‘Q’
//繼續 - 'C'
DisPlayer(chess, ROW, COL);
Displaychess(chess, ROW, COL);//列印棋盤
ret = IsWin(chess, ROW, COL);
if (ret != 'C')
{
break;
}
Discomputer(chess, ROW, COL);
Displaychess(chess, ROW, COL);//列印棋盤
ret = IsWin(chess, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家贏\n");
}
if (ret == '#')
{
printf("電腦贏\n");
}
if(ret == 'C')
{
printf("平局\n");
}
//電腦下棋
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//獲得一個亂數
do
{
menu();//列印選單
printf("請選擇>0/1: ");
scanf("%d",&input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
default:
printf("輸入錯誤,請從新選擇");
break;
}
} while (input);
return 0;
}
game.c
#pragma once
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#define ROW 3
#define COL 3
//棋盤初始化
void Intchess(char chess[ROW][COL], int row,int col);
//列印棋盤
void Displaychess(char[ROW][COL], int row, int col);
//玩家下棋
void DisPlayer(char chess[ROW][COL], int row, int col);
//電腦下棋
void Discomputer(char chess[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);
game.h
#include"game.h"
void Intchess(char chess[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)//
{
//列印一行
int j = 0;
for (j = 0; j < col; j++)
{
chess[i][j] = ' ';
}
}
}
//列印棋盤
void Displaychess(char chess[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 ", chess[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 DisPlayer(char chess[ROW][COL], int row, int col)
{
printf("玩家走\n");//玩家輸入坐標1---3的范圍
int x = 0;
int y = 0;
while (1)
{
printf("請輸入坐標:");//玩家輸入的坐標是1 2 3,但是陣列的下標是0 1 2
scanf("%d%d", &x,&y);//
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if(chess[x - 1][y - 1] == ' ')
{
chess[x - 1][y - 1] = '*';
break;
}
else
{
printf("以被占用,請從新輸入\n");
}
}
else
{
printf("非法坐標,請從新輸入\n");
}
}
}
//電腦下棋
void Discomputer(char chess[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("電腦走:>\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (chess[x][y] == ' ')
{
chess[x][y] = '#';
break;
}
}
}
//判斷棋盤是否滿了 滿了 回傳1 沒滿 回傳0
int IsFull(char chess[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 (chess[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char IsWin(char chess[ROW][COL], int row, int col)
{
//判斷游戲輸贏
//要回傳4種不同的狀態
//玩家贏 - '*'
//電腦贏 - '#'
int i = 0;
for (i = 0; i < row; i++)
{
//判斷行是否相等
if (chess[i][0] == chess[i][1] && chess[i][1] == chess[i][2] && chess[i][1] != ' ')
{
return chess[i][1];
}
}
//判斷列是否相等
for (i = 0; i < row; i++)
{
if (chess[0][i] == chess[1][i] && chess[1][i] == chess[2][i] && chess[1][i] != ' ')
{
return chess[1][i];
}
}
//判斷對角線
if (chess[0][0] == chess[1][1] && chess[1][1] == chess[2][2] && chess[1][1] != ' ')
{
return chess[1][1];
}
if (chess[0][2] == chess[1][1] && chess[1][1] == chess[2][0] && chess[1][1] != ' ')
{
return chess[1][1];
}
//判斷是否平局 平局 - ‘Q’
if (IsFull(chess, ROW, COL))
{
return 'Q';
}
//判斷是否繼續 繼續 - 'C'
else
{
return 'C';
}
}
解釋一下下面的代碼
電腦下棋,是得到兩個0-2的值,這樣才能將棋下在棋盤上,就是得到陣列上的每一個值,將#賦值給 電腦要下的地方
x = rand() % row; 一個亂數%0或者%1或者%2,那就可以得到0,1,2這三個數
srand((unsigned int)time(NULL));//獲得一個亂數
//電腦下棋
void Discomputer(char chess[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("電腦走:>\n");
while (1)
{
x = rand() % row;//得到的亂數%
y = rand() % col;
if (chess[x][y] == ' ')
{
chess[x][y] = '#';
break;
}
}
}
因為C語言的知識學得不多,所以電腦下棋是隨機下的,并不智能,謝謝觀看!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/339287.html
標籤:其他
上一篇:動態規劃總結
